Index: google.patch |
diff --git a/google.patch b/google.patch |
index 922f23b665c738cb11f71ff0d459a7ea87a40e83..b1ef4c96bb2ad5b4ff0600e7a658f0c0d78b9c17 100644 |
--- a/google.patch |
+++ b/google.patch |
@@ -4,7 +4,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/affixmgr.cxx,v |
retrieving revision 1.41 |
diff -u -r1.41 affixmgr.cxx |
--- src/hunspell/affixmgr.cxx 16 Dec 2011 09:15:34 -0000 1.41 |
-+++ src/hunspell/affixmgr.cxx 23 Mar 2012 05:56:23 -0000 |
++++ src/hunspell/affixmgr.cxx 20 Dec 2012 23:40:03 -0000 |
@@ -14,8 +14,14 @@ |
#include "csutil.hxx" |
@@ -195,7 +195,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/affixmgr.hxx,v |
retrieving revision 1.15 |
diff -u -r1.15 affixmgr.hxx |
--- src/hunspell/affixmgr.hxx 13 Oct 2011 13:41:54 -0000 1.15 |
-+++ src/hunspell/affixmgr.hxx 23 Mar 2012 05:56:23 -0000 |
++++ src/hunspell/affixmgr.hxx 20 Dec 2012 23:40:03 -0000 |
@@ -18,6 +18,40 @@ |
class PfxEntry; |
class SfxEntry; |
@@ -280,7 +280,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/filemgr.cxx,v |
retrieving revision 1.5 |
diff -u -r1.5 filemgr.cxx |
--- src/hunspell/filemgr.cxx 23 Jun 2011 09:21:50 -0000 1.5 |
-+++ src/hunspell/filemgr.cxx 23 Mar 2012 05:56:23 -0000 |
++++ src/hunspell/filemgr.cxx 20 Dec 2012 23:40:03 -0000 |
@@ -7,6 +7,32 @@ |
#include "filemgr.hxx" |
@@ -325,7 +325,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/filemgr.hxx,v |
retrieving revision 1.3 |
diff -u -r1.3 filemgr.hxx |
--- src/hunspell/filemgr.hxx 15 Apr 2010 11:22:08 -0000 1.3 |
-+++ src/hunspell/filemgr.hxx 23 Mar 2012 05:56:23 -0000 |
++++ src/hunspell/filemgr.hxx 20 Dec 2012 23:40:03 -0000 |
@@ -7,6 +7,30 @@ |
#include "hunzip.hxx" |
#include <stdio.h> |
@@ -368,7 +368,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/hashmgr.cxx,v |
retrieving revision 1.12 |
diff -u -r1.12 hashmgr.cxx |
--- src/hunspell/hashmgr.cxx 23 Jun 2011 09:21:50 -0000 1.12 |
-+++ src/hunspell/hashmgr.cxx 23 Mar 2012 05:56:23 -0000 |
++++ src/hunspell/hashmgr.cxx 20 Dec 2012 23:40:03 -0000 |
@@ -12,8 +12,14 @@ |
// build a hash table from a munched word list |
@@ -491,7 +491,28 @@ diff -u -r1.12 hashmgr.cxx |
return 0; |
} |
-@@ -339,6 +407,44 @@ |
+@@ -256,6 +324,12 @@ |
+ // remove word (personal dictionary function for standalone applications) |
+ int HashMgr::remove(const char * word) |
+ { |
++#ifdef HUNSPELL_CHROME_CLIENT |
++ std::map<base::StringPiece, int>::iterator iter = |
++ custom_word_to_affix_id_map_.find(word); |
++ if (iter != custom_word_to_affix_id_map_.end()) |
++ custom_word_to_affix_id_map_.erase(iter); |
++#else |
+ struct hentry * dp = lookup(word); |
+ while (dp) { |
+ if (dp->alen == 0 || !TESTAFF(dp->astr, forbiddenword, dp->alen)) { |
+@@ -270,6 +344,7 @@ |
+ } |
+ dp = dp->next_homonym; |
+ } |
++#endif |
+ return 0; |
+ } |
+ |
+@@ -339,6 +414,44 @@ |
// initialize: col=-1; hp = NULL; hp = walk_hashtable(&col, hp); |
struct hentry * HashMgr::walk_hashtable(int &col, struct hentry * hp) const |
{ |
@@ -536,7 +557,7 @@ diff -u -r1.12 hashmgr.cxx |
if (hp && hp->next != NULL) return hp->next; |
for (col++; col < tablesize; col++) { |
if (tableptr[col]) return tableptr[col]; |
-@@ -346,11 +452,13 @@ |
+@@ -346,11 +459,13 @@ |
// null at end and reset to start |
col = -1; |
return NULL; |
@@ -550,7 +571,7 @@ diff -u -r1.12 hashmgr.cxx |
int al; |
char * ap; |
char * dp; |
-@@ -471,6 +579,7 @@ |
+@@ -471,6 +586,7 @@ |
} |
delete dict; |
@@ -558,7 +579,7 @@ diff -u -r1.12 hashmgr.cxx |
return 0; |
} |
-@@ -479,6 +588,9 @@ |
+@@ -479,6 +595,9 @@ |
int HashMgr::hash(const char * word) const |
{ |
@@ -568,7 +589,7 @@ diff -u -r1.12 hashmgr.cxx |
long hv = 0; |
for (int i=0; i < 4 && *word != 0; i++) |
hv = (hv << 8) | (*word++); |
-@@ -487,6 +599,7 @@ |
+@@ -487,6 +606,7 @@ |
hv ^= (*word++); |
} |
return (unsigned long) hv % tablesize; |
@@ -576,7 +597,7 @@ diff -u -r1.12 hashmgr.cxx |
} |
int HashMgr::decode_flags(unsigned short ** result, char * flags, FileMgr * af) { |
-@@ -607,7 +720,12 @@ |
+@@ -607,7 +727,12 @@ |
int firstline = 1; |
// open the affix file |
@@ -589,7 +610,7 @@ diff -u -r1.12 hashmgr.cxx |
if (!afflst) { |
HUNSPELL_WARNING(stderr, "Error - could not open affix description file %s\n",affpath); |
return 1; |
-@@ -802,6 +920,121 @@ |
+@@ -802,6 +927,121 @@ |
return 0; |
} |
@@ -717,7 +738,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/hashmgr.hxx,v |
retrieving revision 1.3 |
diff -u -r1.3 hashmgr.hxx |
--- src/hunspell/hashmgr.hxx 15 Apr 2010 11:22:08 -0000 1.3 |
-+++ src/hunspell/hashmgr.hxx 23 Mar 2012 05:56:23 -0000 |
++++ src/hunspell/hashmgr.hxx 20 Dec 2012 23:40:03 -0000 |
@@ -8,10 +8,25 @@ |
#include "htypes.hxx" |
#include "filemgr.hxx" |
@@ -815,7 +836,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/htypes.hxx,v |
retrieving revision 1.3 |
diff -u -r1.3 htypes.hxx |
--- src/hunspell/htypes.hxx 6 Sep 2010 07:58:53 -0000 1.3 |
-+++ src/hunspell/htypes.hxx 23 Mar 2012 05:56:23 -0000 |
++++ src/hunspell/htypes.hxx 20 Dec 2012 23:40:03 -0000 |
@@ -1,6 +1,16 @@ |
#ifndef _HTYPES_HXX_ |
#define _HTYPES_HXX_ |
@@ -839,9 +860,16 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/hunspell.cxx,v |
retrieving revision 1.29 |
diff -u -r1.29 hunspell.cxx |
--- src/hunspell/hunspell.cxx 23 Jun 2011 09:21:50 -0000 1.29 |
-+++ src/hunspell/hunspell.cxx 23 Mar 2012 05:56:24 -0000 |
-@@ -12,15 +12,30 @@ |
++++ src/hunspell/hunspell.cxx 20 Dec 2012 23:40:03 -0000 |
+@@ -7,20 +7,37 @@ |
+ |
+ #include "hunspell.hxx" |
+ #include "hunspell.h" |
++#ifndef HUNSPELL_CHROME_CLIENT |
+ #ifndef MOZILLA_CLIENT |
+ # include "config.h" |
#endif |
++#endif |
#include "csutil.hxx" |
+#ifdef HUNSPELL_CHROME_CLIENT |
@@ -871,7 +899,7 @@ diff -u -r1.29 hunspell.cxx |
/* first set up the hash manager */ |
pHMgr[0] = new HashMgr(dpath, affpath, key); |
if (pHMgr[0]) maxdic = 1; |
-@@ -28,6 +43,7 @@ |
+@@ -28,6 +45,7 @@ |
/* next set up the affix manager */ |
/* it needs access to the hash manager lookup methods */ |
pAMgr = new AffixMgr(affpath, pHMgr, &maxdic, key); |
@@ -879,7 +907,19 @@ diff -u -r1.29 hunspell.cxx |
/* get the preferred try string and the dictionary */ |
/* encoding from the Affix Manager for that dictionary */ |
-@@ -59,10 +75,16 @@ |
+@@ -41,7 +59,11 @@ |
+ wordbreak = pAMgr->get_breaktable(); |
+ |
+ /* and finally set up the suggestion manager */ |
++#ifdef HUNSPELL_CHROME_CLIENT |
++ pSMgr = new SuggestMgr(bdict_reader, try_string, MAXSUGGESTION, pAMgr); |
++#else |
+ pSMgr = new SuggestMgr(try_string, MAXSUGGESTION, pAMgr); |
++#endif |
+ if (try_string) free(try_string); |
+ } |
+ |
+@@ -59,10 +81,16 @@ |
csconv= NULL; |
if (encoding) free(encoding); |
encoding = NULL; |
@@ -896,7 +936,7 @@ diff -u -r1.29 hunspell.cxx |
// load extra dictionaries |
int Hunspell::add_dic(const char * dpath, const char * key) { |
if (maxdic == MAXDIC || !affixpath) return 1; |
-@@ -70,6 +92,7 @@ |
+@@ -70,6 +98,7 @@ |
if (pHMgr[maxdic]) maxdic++; else return 1; |
return 0; |
} |
@@ -904,7 +944,7 @@ diff -u -r1.29 hunspell.cxx |
// make a copy of src at destination while removing all leading |
// blanks and removing any trailing periods after recording |
-@@ -322,6 +345,9 @@ |
+@@ -322,6 +351,9 @@ |
int Hunspell::spell(const char * word, int * info, char ** root) |
{ |
@@ -914,7 +954,7 @@ diff -u -r1.29 hunspell.cxx |
struct hentry * rv=NULL; |
// need larger vector. For example, Turkish capital letter I converted a |
// 2-byte UTF-8 character (dotless i) by mkallsmall. |
-@@ -586,6 +612,13 @@ |
+@@ -586,6 +618,13 @@ |
if (!len) |
return NULL; |
@@ -928,7 +968,7 @@ diff -u -r1.29 hunspell.cxx |
// word reversing wrapper for complex prefixes |
if (complexprefixes) { |
if (word != w2) { |
-@@ -675,6 +708,9 @@ |
+@@ -675,6 +714,9 @@ |
int Hunspell::suggest(char*** slst, const char * word) |
{ |
@@ -938,7 +978,7 @@ diff -u -r1.29 hunspell.cxx |
int onlycmpdsug = 0; |
char cw[MAXWORDUTF8LEN]; |
char wspace[MAXWORDUTF8LEN]; |
-@@ -1921,13 +1957,21 @@ |
+@@ -1921,13 +1963,21 @@ |
Hunhandle *Hunspell_create(const char * affpath, const char * dpath) |
{ |
@@ -966,7 +1006,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/hunspell.hxx,v |
retrieving revision 1.6 |
diff -u -r1.6 hunspell.hxx |
--- src/hunspell/hunspell.hxx 21 Jan 2011 17:30:41 -0000 1.6 |
-+++ src/hunspell/hunspell.hxx 23 Mar 2012 05:56:24 -0000 |
++++ src/hunspell/hunspell.hxx 20 Dec 2012 23:40:03 -0000 |
@@ -5,6 +5,10 @@ |
#include "suggestmgr.hxx" |
#include "langnum.hxx" |
@@ -1023,7 +1063,7 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/replist.hxx,v |
retrieving revision 1.2 |
diff -u -r1.2 replist.hxx |
--- src/hunspell/replist.hxx 15 Apr 2010 11:22:09 -0000 1.2 |
-+++ src/hunspell/replist.hxx 23 Mar 2012 05:56:24 -0000 |
++++ src/hunspell/replist.hxx 20 Dec 2012 23:40:03 -0000 |
@@ -2,6 +2,12 @@ |
#ifndef _REPLIST_HXX_ |
#define _REPLIST_HXX_ |
@@ -1043,8 +1083,8 @@ RCS file: /cvsroot/hunspell/hunspell/src/hunspell/suggestmgr.cxx,v |
retrieving revision 1.24 |
diff -u -r1.24 suggestmgr.cxx |
--- src/hunspell/suggestmgr.cxx 14 Feb 2011 21:47:24 -0000 1.24 |
-+++ src/hunspell/suggestmgr.cxx 23 Mar 2012 05:56:24 -0000 |
-@@ -12,6 +12,98 @@ |
++++ src/hunspell/suggestmgr.cxx 20 Dec 2012 23:40:03 -0000 |
+@@ -12,9 +12,110 @@ |
const w_char W_VLINE = { '\0', '|' }; |
@@ -1140,10 +1180,80 @@ diff -u -r1.24 suggestmgr.cxx |
+} // namespace |
+#endif |
+ |
++ |
++#ifdef HUNSPELL_CHROME_CLIENT |
++SuggestMgr::SuggestMgr(hunspell::BDictReader* reader, |
++ const char * tryme, int maxn, |
++ AffixMgr * aptr) |
++{ |
++ bdict_reader = reader; |
++#else |
SuggestMgr::SuggestMgr(const char * tryme, int maxn, |
AffixMgr * aptr) |
{ |
-@@ -1057,6 +1149,9 @@ |
++#endif |
+ |
+ // register affix manager and check in string of chars to |
+ // try when building candidate suggestions |
+@@ -407,6 +508,49 @@ |
+ int lenr, lenp; |
+ int wl = strlen(word); |
+ if (wl < 2 || ! pAMgr) return ns; |
++ |
++#ifdef HUNSPELL_CHROME_CLIENT |
++ const char *pattern, *pattern2; |
++ hunspell::ReplacementIterator iterator = bdict_reader->GetReplacementIterator(); |
++ while (iterator.GetNext(&pattern, &pattern2)) { |
++ r = word; |
++ lenr = strlen(pattern2); |
++ lenp = strlen(pattern); |
++ |
++ // search every occurence of the pattern in the word |
++ while ((r=strstr(r, pattern)) != NULL) { |
++ strcpy(candidate, word); |
++ if (r-word + lenr + strlen(r+lenp) >= MAXLNLEN) break; |
++ strcpy(candidate+(r-word), pattern2); |
++ strcpy(candidate+(r-word)+lenr, r+lenp); |
++ ns = testsug(wlst, candidate, wl-lenp+lenr, ns, cpdsuggest, NULL, NULL); |
++ if (ns == -1) return -1; |
++ // check REP suggestions with space |
++ char * sp = strchr(candidate, ' '); |
++ if (sp) { |
++ char * prev = candidate; |
++ while (sp) { |
++ *sp = '\0'; |
++ if (checkword(prev, strlen(prev), 0, NULL, NULL)) { |
++ int oldns = ns; |
++ *sp = ' '; |
++ ns = testsug(wlst, sp + 1, strlen(sp + 1), ns, cpdsuggest, NULL, NULL); |
++ if (ns == -1) return -1; |
++ if (oldns < ns) { |
++ free(wlst[ns - 1]); |
++ wlst[ns - 1] = mystrdup(candidate); |
++ if (!wlst[ns - 1]) return -1; |
++ } |
++ } |
++ *sp = ' '; |
++ prev = sp + 1; |
++ sp = strchr(prev, ' '); |
++ } |
++ } |
++ r++; // search for the next letter |
++ } |
++ } |
++#else |
+ int numrep = pAMgr->get_numrep(); |
+ struct replentry* reptable = pAMgr->get_reptable(); |
+ if (reptable==NULL) return ns; |
+@@ -448,6 +592,7 @@ |
+ r++; // search for the next letter |
+ } |
+ } |
++#endif |
+ return ns; |
+ } |
+ |
+@@ -1057,6 +1202,9 @@ |
struct hentry* hp = NULL; |
int col = -1; |
@@ -1153,7 +1263,7 @@ diff -u -r1.24 suggestmgr.cxx |
phonetable * ph = (pAMgr) ? pAMgr->get_phonetable() : NULL; |
char target[MAXSWUTF8L]; |
char candidate[MAXSWUTF8L]; |
-@@ -1115,7 +1210,11 @@ |
+@@ -1115,7 +1263,11 @@ |
if (sc > scores[lp]) { |
scores[lp] = sc; |
@@ -1165,3 +1275,33 @@ diff -u -r1.24 suggestmgr.cxx |
lval = sc; |
for (j=0; j < MAX_ROOTS; j++) |
if (scores[j] < lval) { |
+Index: src/hunspell/suggestmgr.hxx |
+=================================================================== |
+RCS file: /cvsroot/hunspell/hunspell/src/hunspell/suggestmgr.hxx,v |
+retrieving revision 1.5 |
+diff -u -r1.5 suggestmgr.hxx |
+--- src/hunspell/suggestmgr.hxx 21 Jan 2011 22:10:24 -0000 1.5 |
++++ src/hunspell/suggestmgr.hxx 20 Dec 2012 23:40:03 -0000 |
+@@ -52,7 +52,11 @@ |
+ |
+ |
+ public: |
++#ifdef HUNSPELL_CHROME_CLIENT |
++ SuggestMgr(hunspell::BDictReader* reader, const char * tryme, int maxn, AffixMgr *aptr); |
++#else |
+ SuggestMgr(const char * tryme, int maxn, AffixMgr *aptr); |
++#endif |
+ ~SuggestMgr(); |
+ |
+ int suggest(char*** slst, const char * word, int nsug, int * onlycmpdsug); |
+@@ -66,6 +70,10 @@ |
+ char * suggest_morph_for_spelling_error(const char * word); |
+ |
+ private: |
++#ifdef HUNSPELL_CHROME_CLIENT |
++ // Not owned by us, owned by the Hunspell object. |
++ hunspell::BDictReader* bdict_reader; |
++#endif |
+ int testsug(char** wlst, const char * candidate, int wl, int ns, int cpdsuggest, |
+ int * timer, clock_t * timelimit); |
+ int checkword(const char *, int, int, int *, clock_t *); |