tor-browser

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

suggestmgr.hxx (7744B)


      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 SUGGESTMGR_HXX_
     72 #define SUGGESTMGR_HXX_
     73 
     74 #define MAX_ROOTS 100
     75 #define MAX_WORDS 100
     76 #define MAX_GUESS 200
     77 #define MAXNGRAMSUGS 4
     78 #define MAXPHONSUGS 2
     79 #define MAXCOMPOUNDSUGS 3
     80 
     81 #define NGRAM_LONGER_WORSE (1 << 0)
     82 #define NGRAM_ANY_MISMATCH (1 << 1)
     83 #define NGRAM_LOWERING (1 << 2)
     84 #define NGRAM_WEIGHTED (1 << 3)
     85 
     86 #include "atypes.hxx"
     87 #include "affixmgr.hxx"
     88 #include "hashmgr.hxx"
     89 #include "langnum.hxx"
     90 
     91 enum { LCS_UP, LCS_LEFT, LCS_UPLEFT };
     92 
     93 class SuggestMgr {
     94 private:
     95  SuggestMgr(const SuggestMgr&);
     96  SuggestMgr& operator=(const SuggestMgr&);
     97 
     98 private:
     99  char* ckey;
    100  size_t ckeyl;
    101  std::vector<w_char> ckey_utf;
    102 
    103  char* ctry;
    104  size_t ctryl;
    105  std::vector<w_char> ctry_utf;
    106  bool lang_with_dash_usage;
    107 
    108  AffixMgr* pAMgr;
    109  unsigned int maxSug;
    110  struct cs_info* csconv;
    111  int utf8;
    112  int langnum;
    113  int nosplitsugs;
    114  int maxngramsugs;
    115  int maxcpdsugs;
    116  int complexprefixes;
    117 
    118 public:
    119  SuggestMgr(const char* tryme, unsigned int maxn, AffixMgr* aptr);
    120  ~SuggestMgr();
    121 
    122  bool suggest(std::vector<std::string>& slst, const char* word, int* onlycmpdsug);
    123  void ngsuggest(std::vector<std::string>& slst, const char* word, const std::vector<HashMgr*>& rHMgr, int captype);
    124 
    125  std::string suggest_morph(const std::string& word);
    126  std::string suggest_gen(const std::vector<std::string>& pl, const std::string& pattern);
    127 
    128 private:
    129  void testsug(std::vector<std::string>& wlst,
    130               const std::string& candidate,
    131               int cpdsuggest,
    132               int* timer,
    133               clock_t* timelimit);
    134  int checkword(const std::string& word, int, int*, clock_t*);
    135  int check_forbidden(const char*, int);
    136 
    137  void capchars(std::vector<std::string>&, const char*, int);
    138  int replchars(std::vector<std::string>&, const char*, int);
    139  int doubletwochars(std::vector<std::string>&, const char*, int);
    140  int forgotchar(std::vector<std::string>&, const char*, int);
    141  int swapchar(std::vector<std::string>&, const char*, int);
    142  int longswapchar(std::vector<std::string>&, const char*, int);
    143  int movechar(std::vector<std::string>&, const char*, int);
    144  int extrachar(std::vector<std::string>&, const char*, int);
    145  int badcharkey(std::vector<std::string>&, const char*, int);
    146  int badchar(std::vector<std::string>&, const char*, int);
    147  bool twowords(std::vector<std::string>&, const char*, int, bool);
    148 
    149  void capchars_utf(std::vector<std::string>&, const w_char*, int wl, int);
    150  int doubletwochars_utf(std::vector<std::string>&, const w_char*, int wl, int);
    151  int forgotchar_utf(std::vector<std::string>&, const w_char*, int wl, int);
    152  int extrachar_utf(std::vector<std::string>&, const w_char*, int wl, int);
    153  int badcharkey_utf(std::vector<std::string>&, const w_char*, int wl, int);
    154  int badchar_utf(std::vector<std::string>&, const w_char*, int wl, int);
    155  int swapchar_utf(std::vector<std::string>&, const w_char*, int wl, int);
    156  int longswapchar_utf(std::vector<std::string>&, const w_char*, int, int);
    157  int movechar_utf(std::vector<std::string>&, const w_char*, int, int);
    158 
    159  int mapchars(std::vector<std::string>&, const char*, int);
    160  int map_related(const char*,
    161                  std::string&,
    162                  int,
    163                  std::vector<std::string>& wlst,
    164                  int,
    165                  const std::vector<mapentry>&,
    166                  int*,
    167                  clock_t*);
    168  int ngram(int n, const std::vector<w_char>& su1,
    169            const std::vector<w_char>& su2, int opt);
    170  int ngram(int n, const std::string& s1, const std::string& s2, int opt);
    171  int mystrlen(const char* word);
    172  int leftcommonsubstring(const std::vector<w_char>& su1,
    173                          const std::vector<w_char>& su2);
    174  int leftcommonsubstring(const char* s1, const char* s2);
    175  int commoncharacterpositions(const char* s1, const char* s2, int* is_swap);
    176  void bubblesort(char** rwd, char** rwd2, int* rsc, int n);
    177  void lcs(const char* s, const char* s2, int* l1, int* l2, char** result);
    178  int lcslen(const char* s, const char* s2);
    179  int lcslen(const std::string& s, const std::string& s2);
    180  std::string suggest_hentry_gen(hentry* rv, const char* pattern);
    181 };
    182 
    183 #endif