Line data Source code
1 : /* ***** BEGIN LICENSE BLOCK *****
2 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 : *
4 : * Copyright (C) 2002-2017 Németh László
5 : *
6 : * The contents of this file are subject to the Mozilla Public License Version
7 : * 1.1 (the "License"); you may not use this file except in compliance with
8 : * the License. You may obtain a copy of the License at
9 : * http://www.mozilla.org/MPL/
10 : *
11 : * Software distributed under the License is distributed on an "AS IS" basis,
12 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 : * for the specific language governing rights and limitations under the
14 : * License.
15 : *
16 : * Hunspell is based on MySpell which is Copyright (C) 2002 Kevin Hendricks.
17 : *
18 : * Contributor(s): David Einstein, Davide Prina, Giuseppe Modugno,
19 : * Gianluca Turconi, Simon Brouwer, Noll János, Bíró Árpád,
20 : * Goldman Eleonóra, Sarlós Tamás, Bencsáth Boldizsár, Halácsy Péter,
21 : * Dvornik László, Gefferth András, Nagy Viktor, Varga Dániel, Chris Halls,
22 : * Rene Engelhard, Bram Moolenaar, Dafydd Jones, Harri Pitkänen
23 : *
24 : * Alternatively, the contents of this file may be used under the terms of
25 : * either the GNU General Public License Version 2 or later (the "GPL"), or
26 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 : * in which case the provisions of the GPL or the LGPL are applicable instead
28 : * of those above. If you wish to allow use of your version of this file only
29 : * under the terms of either the GPL or the LGPL, and not to allow others to
30 : * use your version of this file under the terms of the MPL, indicate your
31 : * decision by deleting the provisions above and replace them with the notice
32 : * and other provisions required by the GPL or the LGPL. If you do not delete
33 : * the provisions above, a recipient may use your version of this file under
34 : * the terms of any one of the MPL, the GPL or the LGPL.
35 : *
36 : * ***** END LICENSE BLOCK ***** */
37 : /*
38 : * Copyright 2002 Kevin B. Hendricks, Stratford, Ontario, Canada
39 : * And Contributors. All rights reserved.
40 : *
41 : * Redistribution and use in source and binary forms, with or without
42 : * modification, are permitted provided that the following conditions
43 : * are met:
44 : *
45 : * 1. Redistributions of source code must retain the above copyright
46 : * notice, this list of conditions and the following disclaimer.
47 : *
48 : * 2. Redistributions in binary form must reproduce the above copyright
49 : * notice, this list of conditions and the following disclaimer in the
50 : * documentation and/or other materials provided with the distribution.
51 : *
52 : * 3. All modifications to the source code must be clearly marked as
53 : * such. Binary redistributions based on modified source code
54 : * must be clearly marked as modified versions in the documentation
55 : * and/or other materials provided with the distribution.
56 : *
57 : * THIS SOFTWARE IS PROVIDED BY KEVIN B. HENDRICKS AND CONTRIBUTORS
58 : * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
59 : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
60 : * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
61 : * KEVIN B. HENDRICKS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
62 : * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
63 : * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
64 : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
66 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
67 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
68 : * SUCH DAMAGE.
69 : */
70 :
71 : #ifndef AFFIX_HXX_
72 : #define AFFIX_HXX_
73 :
74 : #include "atypes.hxx"
75 : #include "baseaffix.hxx"
76 : #include "affixmgr.hxx"
77 :
78 : /* A Prefix Entry */
79 :
80 0 : class PfxEntry : public AffEntry {
81 : private:
82 : PfxEntry(const PfxEntry&);
83 : PfxEntry& operator=(const PfxEntry&);
84 :
85 : private:
86 : AffixMgr* pmyMgr;
87 :
88 : PfxEntry* next;
89 : PfxEntry* nexteq;
90 : PfxEntry* nextne;
91 : PfxEntry* flgnxt;
92 :
93 : public:
94 : explicit PfxEntry(AffixMgr* pmgr);
95 :
96 0 : bool allowCross() const { return ((opts & aeXPRODUCT) != 0); }
97 : struct hentry* checkword(const char* word,
98 : int len,
99 : char in_compound,
100 : const FLAG needflag = FLAG_NULL);
101 :
102 : struct hentry* check_twosfx(const char* word,
103 : int len,
104 : char in_compound,
105 : const FLAG needflag = FLAG_NULL);
106 :
107 : std::string check_morph(const char* word,
108 : int len,
109 : char in_compound,
110 : const FLAG needflag = FLAG_NULL);
111 :
112 : std::string check_twosfx_morph(const char* word,
113 : int len,
114 : char in_compound,
115 : const FLAG needflag = FLAG_NULL);
116 :
117 0 : FLAG getFlag() { return aflag; }
118 0 : const char* getKey() { return appnd.c_str(); }
119 : std::string add(const char* word, size_t len);
120 :
121 0 : inline short getKeyLen() { return appnd.size(); }
122 :
123 0 : inline const char* getMorph() { return morphcode; }
124 :
125 0 : inline const unsigned short* getCont() { return contclass; }
126 0 : inline short getContLen() { return contclasslen; }
127 :
128 0 : inline PfxEntry* getNext() { return next; }
129 0 : inline PfxEntry* getNextNE() { return nextne; }
130 0 : inline PfxEntry* getNextEQ() { return nexteq; }
131 0 : inline PfxEntry* getFlgNxt() { return flgnxt; }
132 :
133 0 : inline void setNext(PfxEntry* ptr) { next = ptr; }
134 0 : inline void setNextNE(PfxEntry* ptr) { nextne = ptr; }
135 0 : inline void setNextEQ(PfxEntry* ptr) { nexteq = ptr; }
136 0 : inline void setFlgNxt(PfxEntry* ptr) { flgnxt = ptr; }
137 :
138 : inline char* nextchar(char* p);
139 : inline int test_condition(const char* st);
140 : };
141 :
142 : /* A Suffix Entry */
143 :
144 0 : class SfxEntry : public AffEntry {
145 : private:
146 : SfxEntry(const SfxEntry&);
147 : SfxEntry& operator=(const SfxEntry&);
148 :
149 : private:
150 : AffixMgr* pmyMgr;
151 : std::string rappnd;
152 :
153 : SfxEntry* next;
154 : SfxEntry* nexteq;
155 : SfxEntry* nextne;
156 : SfxEntry* flgnxt;
157 :
158 : SfxEntry* l_morph;
159 : SfxEntry* r_morph;
160 : SfxEntry* eq_morph;
161 :
162 : public:
163 : explicit SfxEntry(AffixMgr* pmgr);
164 :
165 0 : bool allowCross() const { return ((opts & aeXPRODUCT) != 0); }
166 : struct hentry* checkword(const char* word,
167 : int len,
168 : int optflags,
169 : PfxEntry* ppfx,
170 : const FLAG cclass,
171 : const FLAG needflag,
172 : const FLAG badflag);
173 :
174 : struct hentry* check_twosfx(const char* word,
175 : int len,
176 : int optflags,
177 : PfxEntry* ppfx,
178 : const FLAG needflag = FLAG_NULL);
179 :
180 : std::string check_twosfx_morph(const char* word,
181 : int len,
182 : int optflags,
183 : PfxEntry* ppfx,
184 : const FLAG needflag = FLAG_NULL);
185 : struct hentry* get_next_homonym(struct hentry* he);
186 : struct hentry* get_next_homonym(struct hentry* word,
187 : int optflags,
188 : PfxEntry* ppfx,
189 : const FLAG cclass,
190 : const FLAG needflag);
191 :
192 0 : FLAG getFlag() { return aflag; }
193 0 : const char* getKey() { return rappnd.c_str(); }
194 : std::string add(const char* word, size_t len);
195 :
196 0 : inline const char* getMorph() { return morphcode; }
197 :
198 0 : inline const unsigned short* getCont() { return contclass; }
199 0 : inline short getContLen() { return contclasslen; }
200 0 : inline const char* getAffix() { return appnd.c_str(); }
201 :
202 0 : inline short getKeyLen() { return appnd.size(); }
203 :
204 0 : inline SfxEntry* getNext() { return next; }
205 0 : inline SfxEntry* getNextNE() { return nextne; }
206 0 : inline SfxEntry* getNextEQ() { return nexteq; }
207 :
208 : inline SfxEntry* getLM() { return l_morph; }
209 : inline SfxEntry* getRM() { return r_morph; }
210 : inline SfxEntry* getEQM() { return eq_morph; }
211 0 : inline SfxEntry* getFlgNxt() { return flgnxt; }
212 :
213 0 : inline void setNext(SfxEntry* ptr) { next = ptr; }
214 0 : inline void setNextNE(SfxEntry* ptr) { nextne = ptr; }
215 0 : inline void setNextEQ(SfxEntry* ptr) { nexteq = ptr; }
216 0 : inline void setFlgNxt(SfxEntry* ptr) { flgnxt = ptr; }
217 : void initReverseWord();
218 :
219 : inline char* nextchar(char* p);
220 : inline int test_condition(const char* st, const char* begin);
221 : };
222 :
223 : #endif
|