tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

affentry.hxx (8414B)


      1 /* ***** BEGIN LICENSE BLOCK *****
      2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
      3 *
      4 * Copyright (C) 2002-2022 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 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  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  FLAG getFlag() { return aflag; }
    118  const char* getKey() { return appnd.c_str(); }
    119  std::string add(const char* word, size_t len);
    120 
    121  inline short getKeyLen() { return appnd.size(); }
    122 
    123  inline const char* getMorph() { return morphcode; }
    124 
    125  inline const unsigned short* getCont() { return contclass; }
    126  inline short getContLen() { return contclasslen; }
    127 
    128  inline PfxEntry* getNext() { return next; }
    129  inline PfxEntry* getNextNE() { return nextne; }
    130  inline PfxEntry* getNextEQ() { return nexteq; }
    131  inline PfxEntry* getFlgNxt() { return flgnxt; }
    132 
    133  inline void setNext(PfxEntry* ptr) { next = ptr; }
    134  inline void setNextNE(PfxEntry* ptr) { nextne = ptr; }
    135  inline void setNextEQ(PfxEntry* ptr) { nexteq = ptr; }
    136  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 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  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  FLAG getFlag() { return aflag; }
    193  const char* getKey() { return rappnd.c_str(); }
    194  std::string add(const char* word, size_t len);
    195 
    196  inline const char* getMorph() { return morphcode; }
    197 
    198  inline const unsigned short* getCont() { return contclass; }
    199  inline short getContLen() { return contclasslen; }
    200  inline const char* getAffix() { return appnd.c_str(); }
    201 
    202  inline short getKeyLen() { return appnd.size(); }
    203 
    204  inline SfxEntry* getNext() { return next; }
    205  inline SfxEntry* getNextNE() { return nextne; }
    206  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  inline SfxEntry* getFlgNxt() { return flgnxt; }
    212 
    213  inline void setNext(SfxEntry* ptr) { next = ptr; }
    214  inline void setNextNE(SfxEntry* ptr) { nextne = ptr; }
    215  inline void setNextEQ(SfxEntry* ptr) { nexteq = ptr; }
    216  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