michael@0: /******* BEGIN LICENSE BLOCK ******* michael@0: * Version: MPL 1.1/GPL 2.0/LGPL 2.1 michael@0: * michael@0: * The contents of this file are subject to the Mozilla Public License Version michael@0: * 1.1 (the "License"); you may not use this file except in compliance with michael@0: * the License. You may obtain a copy of the License at michael@0: * http://www.mozilla.org/MPL/ michael@0: * michael@0: * Software distributed under the License is distributed on an "AS IS" basis, michael@0: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License michael@0: * for the specific language governing rights and limitations under the michael@0: * License. michael@0: * michael@0: * The Initial Developers of the Original Code are Kevin Hendricks (MySpell) michael@0: * and László Németh (Hunspell). Portions created by the Initial Developers michael@0: * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved. michael@0: * michael@0: * Contributor(s): Kevin Hendricks (kevin.hendricks@sympatico.ca) michael@0: * David Einstein (deinst@world.std.com) michael@0: * László Németh (nemethl@gyorsposta.hu) michael@0: * Caolan McNamara (caolanm@redhat.com) michael@0: * Davide Prina michael@0: * Giuseppe Modugno michael@0: * Gianluca Turconi michael@0: * Simon Brouwer michael@0: * Noll Janos michael@0: * Biro Arpad michael@0: * Goldman Eleonora michael@0: * Sarlos Tamas michael@0: * Bencsath Boldizsar michael@0: * Halacsy Peter michael@0: * Dvornik Laszlo michael@0: * Gefferth Andras michael@0: * Nagy Viktor michael@0: * Varga Daniel michael@0: * Chris Halls michael@0: * Rene Engelhard michael@0: * Bram Moolenaar michael@0: * Dafydd Jones michael@0: * Harri Pitkanen michael@0: * Andras Timar michael@0: * Tor Lillqvist michael@0: * michael@0: * Alternatively, the contents of this file may be used under the terms of michael@0: * either the GNU General Public License Version 2 or later (the "GPL"), or michael@0: * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), michael@0: * in which case the provisions of the GPL or the LGPL are applicable instead michael@0: * of those above. If you wish to allow use of your version of this file only michael@0: * under the terms of either the GPL or the LGPL, and not to allow others to michael@0: * use your version of this file under the terms of the MPL, indicate your michael@0: * decision by deleting the provisions above and replace them with the notice michael@0: * and other provisions required by the GPL or the LGPL. If you do not delete michael@0: * the provisions above, a recipient may use your version of this file under michael@0: * the terms of any one of the MPL, the GPL or the LGPL. michael@0: * michael@0: ******* END LICENSE BLOCK *******/ michael@0: michael@0: #ifndef _SUGGESTMGR_HXX_ michael@0: #define _SUGGESTMGR_HXX_ michael@0: michael@0: #define MAXSWL 100 michael@0: #define MAXSWUTF8L (MAXSWL * 4) michael@0: #define MAX_ROOTS 100 michael@0: #define MAX_WORDS 100 michael@0: #define MAX_GUESS 200 michael@0: #define MAXNGRAMSUGS 4 michael@0: #define MAXPHONSUGS 2 michael@0: #define MAXCOMPOUNDSUGS 3 michael@0: michael@0: // timelimit: max ~1/4 sec (process time on Linux) for a time consuming function michael@0: #define TIMELIMIT (CLOCKS_PER_SEC >> 2) michael@0: #define MINTIMER 100 michael@0: #define MAXPLUSTIMER 100 michael@0: michael@0: #define NGRAM_LONGER_WORSE (1 << 0) michael@0: #define NGRAM_ANY_MISMATCH (1 << 1) michael@0: #define NGRAM_LOWERING (1 << 2) michael@0: #define NGRAM_WEIGHTED (1 << 3) michael@0: michael@0: #include "hunvisapi.h" michael@0: michael@0: #include "atypes.hxx" michael@0: #include "affixmgr.hxx" michael@0: #include "hashmgr.hxx" michael@0: #include "langnum.hxx" michael@0: #include michael@0: michael@0: enum { LCS_UP, LCS_LEFT, LCS_UPLEFT }; michael@0: michael@0: class LIBHUNSPELL_DLL_EXPORTED SuggestMgr michael@0: { michael@0: char * ckey; michael@0: int ckeyl; michael@0: w_char * ckey_utf; michael@0: michael@0: char * ctry; michael@0: int ctryl; michael@0: w_char * ctry_utf; michael@0: michael@0: AffixMgr* pAMgr; michael@0: int maxSug; michael@0: struct cs_info * csconv; michael@0: int utf8; michael@0: int langnum; michael@0: int nosplitsugs; michael@0: int maxngramsugs; michael@0: int maxcpdsugs; michael@0: int complexprefixes; michael@0: michael@0: michael@0: public: michael@0: SuggestMgr(const char * tryme, int maxn, AffixMgr *aptr); michael@0: ~SuggestMgr(); michael@0: michael@0: int suggest(char*** slst, const char * word, int nsug, int * onlycmpdsug); michael@0: int ngsuggest(char ** wlst, char * word, int ns, HashMgr** pHMgr, int md); michael@0: int suggest_auto(char*** slst, const char * word, int nsug); michael@0: int suggest_stems(char*** slst, const char * word, int nsug); michael@0: int suggest_pos_stems(char*** slst, const char * word, int nsug); michael@0: michael@0: char * suggest_morph(const char * word); michael@0: char * suggest_gen(char ** pl, int pln, char * pattern); michael@0: char * suggest_morph_for_spelling_error(const char * word); michael@0: michael@0: private: michael@0: int testsug(char** wlst, const char * candidate, int wl, int ns, int cpdsuggest, michael@0: int * timer, clock_t * timelimit); michael@0: int checkword(const char *, int, int, int *, clock_t *); michael@0: int check_forbidden(const char *, int); michael@0: michael@0: int capchars(char **, const char *, int, int); michael@0: int replchars(char**, const char *, int, int); michael@0: int doubletwochars(char**, const char *, int, int); michael@0: int forgotchar(char **, const char *, int, int); michael@0: int swapchar(char **, const char *, int, int); michael@0: int longswapchar(char **, const char *, int, int); michael@0: int movechar(char **, const char *, int, int); michael@0: int extrachar(char **, const char *, int, int); michael@0: int badcharkey(char **, const char *, int, int); michael@0: int badchar(char **, const char *, int, int); michael@0: int twowords(char **, const char *, int, int); michael@0: int fixstems(char **, const char *, int); michael@0: michael@0: int capchars_utf(char **, const w_char *, int wl, int, int); michael@0: int doubletwochars_utf(char**, const w_char *, int wl, int, int); michael@0: int forgotchar_utf(char**, const w_char *, int wl, int, int); michael@0: int extrachar_utf(char**, const w_char *, int wl, int, int); michael@0: int badcharkey_utf(char **, const w_char *, int wl, int, int); michael@0: int badchar_utf(char **, const w_char *, int wl, int, int); michael@0: int swapchar_utf(char **, const w_char *, int wl, int, int); michael@0: int longswapchar_utf(char **, const w_char *, int, int, int); michael@0: int movechar_utf(char **, const w_char *, int, int, int); michael@0: michael@0: int mapchars(char**, const char *, int, int); michael@0: int map_related(const char *, char *, int, int, char ** wlst, int, int, const mapentry*, int, int *, clock_t *); michael@0: int ngram(int n, char * s1, const char * s2, int opt); michael@0: int mystrlen(const char * word); michael@0: int leftcommonsubstring(char * s1, const char * s2); michael@0: int commoncharacterpositions(char * s1, const char * s2, int * is_swap); michael@0: void bubblesort( char ** rwd, char ** rwd2, int * rsc, int n); michael@0: void lcs(const char * s, const char * s2, int * l1, int * l2, char ** result); michael@0: int lcslen(const char * s, const char* s2); michael@0: char * suggest_hentry_gen(hentry * rv, char * pattern); michael@0: michael@0: }; michael@0: michael@0: #endif michael@0: