Mozilla Home
Privacy
Cookies
Legal
Bugzilla
Browse
Advanced Search
New Bug
Reports
Documentation
Log In
Log In with GitHub
or
Remember me
Browse
Advanced Search
New Bug
Reports
Documentation
Attachment 501297 Details for
Bug 620626
[patch]
So, here's a replacement upgrade patch
replacement.upgrade.patch (text/plain), 34.27 KB, created by
Caolan McNamara
(
hide
)
Description:
So, here's a replacement upgrade patch
Filename:
MIME Type:
Creator:
Caolan McNamara
Size:
34.27 KB
patch
obsolete
>diff -r 1494caa22150 extensions/spellcheck/hunspell/src/README.hunspell >--- a/extensions/spellcheck/hunspell/src/README.hunspell Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/README.hunspell Wed Jan 05 11:36:53 2011 +0000 >@@ -35,8 +35,8 @@ > * > ******* END LICENSE BLOCK ******* > >-Hunspell Version: 1.2.12 >-Additional Patches: 583582 >+Hunspell Version: 1.2.13 >+Additional Patches: > > Hunspell Author: László Németh > MySpell Author: Kevin Hendricks & David Einstein >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/affentry.cpp >--- a/extensions/spellcheck/hunspell/src/affentry.cpp Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/affentry.cpp Wed Jan 05 11:36:53 2011 +0000 >@@ -160,7 +160,7 @@ > pos = NULL; > p = nextchar(p); > // skip the next character >- if (!ingroup) for (st++; (opts & aeUTF8) && (*st & 0xc0) == 0x80; st++); >+ if (!ingroup && *st) for (st++; (opts & aeUTF8) && (*st & 0xc0) == 0x80; st++); > if (*st == '\0' && p) return 0; // word <= condition > break; > } >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/affixmgr.cpp >--- a/extensions/spellcheck/hunspell/src/affixmgr.cpp Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/affixmgr.cpp Wed Jan 05 11:36:53 2011 +0000 >@@ -83,7 +83,7 @@ > maptable = NULL; > nummap = 0; > breaktable = NULL; >- numbreak = 0; >+ numbreak = -1; > reptable = NULL; > numrep = 0; > iconvtable = NULL; >@@ -763,7 +763,7 @@ > } > > // default BREAK definition >- if (!breaktable) { >+ if (numbreak == -1) { > breaktable = (char **) malloc(sizeof(char *) * 3); > if (!breaktable) return 1; > breaktable[0] = mystrdup("-"); >@@ -1321,7 +1321,7 @@ > } > > // forbid compoundings when there are special patterns at word bound >-int AffixMgr::cpdpat_check(const char * word, int pos, hentry * r1, hentry * r2) >+int AffixMgr::cpdpat_check(const char * word, int pos, hentry * r1, hentry * r2, const char affixed) > { > int len; > for (int i = 0; i < numcheckcpd; i++) { >@@ -1330,8 +1330,14 @@ > (r1->astr && TESTAFF(r1->astr, checkcpdtable[i].cond, r1->alen))) && > (!r2 || !checkcpdtable[i].cond2 || > (r2->astr && TESTAFF(r2->astr, checkcpdtable[i].cond2, r2->alen))) && >- (len = strlen(checkcpdtable[i].pattern)) && (pos > len) && >- (strncmp(word + pos - len, checkcpdtable[i].pattern, len) == 0)) return 1; >+ // zero length pattern => only TESTAFF >+ // zero pattern (0/flag) => unmodified stem (zero affixes allowed) >+ (!*(checkcpdtable[i].pattern) || ( >+ (*(checkcpdtable[i].pattern)=='0' && r1->blen <= pos && strncmp(word + pos - r1->blen, r1->word, r1->blen) == 0) || >+ (*(checkcpdtable[i].pattern)!='0' && (len = strlen(checkcpdtable[i].pattern)) && >+ strncmp(word + pos - len, checkcpdtable[i].pattern, len) == 0)))) { >+ return 1; >+ } > } > return 0; > } >@@ -1516,6 +1522,7 @@ > } > } > >+ > // check if compound word is correctly spelled > // hu_mov_rule = spec. Hungarian rule (XXX) > struct hentry * AffixMgr::compound_check(const char * word, int len, >@@ -1538,6 +1545,8 @@ > int oldcmax = 0; > int oldlen = 0; > int checkedstriple = 0; >+ int onlycpdrule; >+ int affixed = 0; > > int checked_prefix; > >@@ -1546,17 +1555,20 @@ > strcpy(st, word); > > for (i = cmin; i < cmax; i++) { >- >- oldnumsyllable = numsyllable; >- oldwordnum = wordnum; >- checked_prefix = 0; >- > // go to end of the UTF-8 character > if (utf8) { > for (; (st[i] & 0xc0) == 0x80; i++); > if (i >= cmax) return NULL; > } > >+ onlycpdrule = 0; >+ >+ do { // onlycpdrule loop >+ >+ oldnumsyllable = numsyllable; >+ oldwordnum = wordnum; >+ checked_prefix = 0; >+ > do { // simplified checkcompoundpattern loop > > if (scpd > 0) { >@@ -1579,7 +1591,6 @@ > cmax = len - cpdmin + 1; > } > >- > ch = st[i]; > st[i] = '\0'; > >@@ -1588,26 +1599,30 @@ > > // FIRST WORD > >+ affixed = 1; > rv = lookup(st); // perhaps without prefix > > // search homonym with compound flag > while ((rv) && !hu_mov_rule && > ((needaffix && TESTAFF(rv->astr, needaffix, rv->alen)) || >- !((compoundflag && !words && TESTAFF(rv->astr, compoundflag, rv->alen)) || >- (compoundbegin && !wordnum && >+ !((compoundflag && !words && !onlycpdrule && TESTAFF(rv->astr, compoundflag, rv->alen)) || >+ (compoundbegin && !wordnum && !onlycpdrule && > TESTAFF(rv->astr, compoundbegin, rv->alen)) || >- (compoundmiddle && wordnum && !words && >+ (compoundmiddle && wordnum && !words && !onlycpdrule && > TESTAFF(rv->astr, compoundmiddle, rv->alen)) || > (numdefcpd && > ((!words && !wordnum && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)) || >- (words && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0))))) || >+ (words && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0))) && (onlycpdrule = 1))) || // switch onlycpdrule on > (scpd != 0 && checkcpdtable[scpd-1].cond != FLAG_NULL && > !TESTAFF(rv->astr, checkcpdtable[scpd-1].cond, rv->alen))) > ) { > rv = rv->next_homonym; > } > >+ if (rv) affixed = 0; >+ > if (!rv) { >+ if (onlycpdrule) break; > if (compoundflag && > !(rv = prefix_check(st, i, hu_mov_rule ? IN_CPD_OTHER : IN_CPD_BEGIN, compoundflag))) { > if ((rv = suffix_check(st, i, 0, NULL, NULL, 0, NULL, >@@ -1631,11 +1646,13 @@ > ) checked_prefix = 1; > // else check forbiddenwords and needaffix > } else if (rv->astr && (TESTAFF(rv->astr, forbiddenword, rv->alen) || >- TESTAFF(rv->astr, needaffix, rv->alen) || >+ TESTAFF(rv->astr, needaffix, rv->alen) || >+ TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || > (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)) > )) { > st[i] = ch; >- continue; >+ //continue; >+ break; > } > > // check non_compound flag in suffix and prefix >@@ -1673,6 +1690,7 @@ > > // check forbiddenwords > if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || >+ TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || > (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) { > return NULL; > } >@@ -1735,7 +1753,6 @@ > } > // END of LANG_hu section > >- > // NEXT WORD(S) > rv_first = rv; > st[i] = ch; >@@ -1782,6 +1799,7 @@ > > // check forbiddenwords > if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || >+ TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || > (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) return NULL; > > // second word is acceptable, as a root? >@@ -1800,7 +1818,7 @@ > ) && > ( > // test CHECKCOMPOUNDPATTERN >- !numcheckcpd || scpd != 0 || !cpdpat_check(word, i, rv_first, rv) >+ !numcheckcpd || scpd != 0 || !cpdpat_check(word, i, rv_first, rv, 0) > ) && > ( > (!checkcompounddup || (rv != rv_first)) >@@ -1821,8 +1839,8 @@ > // perhaps second word has prefix or/and suffix > sfx = NULL; > sfxflag = FLAG_NULL; >- rv = (compoundflag) ? affix_check((word+i),strlen(word+i), compoundflag, IN_CPD_END) : NULL; >- if (!rv && compoundend) { >+ rv = (compoundflag && !onlycpdrule) ? affix_check((word+i),strlen(word+i), compoundflag, IN_CPD_END) : NULL; >+ if (!rv && compoundend && !onlycpdrule) { > sfx = NULL; > pfx = NULL; > rv = affix_check((word+i),strlen(word+i), compoundend, IN_CPD_END); >@@ -1839,7 +1857,7 @@ > TESTAFF(rv->astr, checkcpdtable[scpd-1].cond2, rv->alen))) rv = NULL; > > // test CHECKCOMPOUNDPATTERN conditions (forbidden compounds) >- if (rv && numcheckcpd && scpd == 0 && cpdpat_check(word, i, rv_first, rv)) rv = NULL; >+ if (rv && numcheckcpd && scpd == 0 && cpdpat_check(word, i, rv_first, rv, affixed)) rv = NULL; > > // check non_compound flag in suffix and prefix > if ((rv) && >@@ -1854,6 +1872,7 @@ > > // check forbiddenwords > if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || >+ TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || > (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) return NULL; > > // pfxappnd = prefix of word+i, or NULL >@@ -1883,7 +1902,7 @@ > switch (sfxflag) { > case 'c': { numsyllable+=2; break; } > case 'J': { numsyllable += 1; break; } >- case 'I': { if (TESTAFF(rv->astr, 'J', rv->alen)) numsyllable += 1; break; } >+ case 'I': { if (rv && TESTAFF(rv->astr, 'J', rv->alen)) numsyllable += 1; break; } > } > } > } >@@ -1919,14 +1938,33 @@ > if (wordnum < maxwordnum) { > rv = compound_check((st+i),strlen(st+i), wordnum+1, > numsyllable, maxwordnum, wnum + 1, words, 0, is_sug); >- if (rv && numcheckcpd && ((scpd == 0 && cpdpat_check(word, i, rv_first, rv)) || >- (scpd != 0 && !cpdpat_check(word, i, rv_first, rv)))) rv = NULL; >+ if (rv && numcheckcpd && ((scpd == 0 && cpdpat_check(word, i, rv_first, rv, affixed)) || >+ (scpd != 0 && !cpdpat_check(word, i, rv_first, rv, affixed)))) rv = NULL; > } else { > rv=NULL; > } > if (rv) { > // forbid compound word, if it is a non compound word with typical fault >- if (checkcompoundrep && cpdrep_check(word, len)) return NULL; >+ if (checkcompoundrep || forbiddenword) { >+ struct hentry * rv2 = NULL; >+ if (checkcompoundrep && cpdrep_check(word, len)) return NULL; >+ // check first part >+ if (strncmp(rv->word, word + i, rv->blen) == 0) { >+ char r = *(st + i + rv->blen); >+ *(st + i + rv->blen) = '\0'; >+ if (checkcompoundrep && cpdrep_check(st, i + rv->blen)) return NULL; >+ if (forbiddenword) { >+ rv2 = lookup(word); >+ if (!rv2) rv2 = affix_check(word, len); >+ if (rv2 && rv2->astr && TESTAFF(rv2->astr, forbiddenword, rv2->alen) && >+ (strncmp(rv2->word, st, i + rv->blen) == 0)) { >+ return NULL; >+ } >+ } >+ *(st + i + rv->blen) = r; >+ } >+ } >+ > return rv_first; > } > } while (striple && !checkedstriple); // end of striple loop >@@ -1948,7 +1986,11 @@ > } > scpd++; > >- } while (simplifiedcpd && scpd <= numcheckcpd); // end of simplifiedcpd loop >+ } while (!onlycpdrule && simplifiedcpd && scpd <= numcheckcpd); // end of simplifiedcpd loop >+ >+ scpd = 0; >+ wordnum = oldwordnum; >+ numsyllable = oldnumsyllable; > > if (soldi != 0) { > i = soldi; >@@ -1956,9 +1998,8 @@ > soldi = 0; > } else st[i] = ch; > >- scpd = 0; >- wordnum = oldwordnum; >- numsyllable = oldnumsyllable; >+ } while (numdefcpd && oldwordnum == 0 && !onlycpdrule && (onlycpdrule = 1)); // end of onlycpd loop >+ > } > > return NULL; >@@ -2080,6 +2121,7 @@ > } > // else check forbiddenwords > } else if (rv->astr && (TESTAFF(rv->astr, forbiddenword, rv->alen) || >+ TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || > TESTAFF(rv->astr, needaffix, rv->alen))) { > st[i] = ch; > continue; >@@ -2119,7 +2161,8 @@ > } > > // check forbiddenwords >- if ((rv) && (rv->astr) && TESTAFF(rv->astr, forbiddenword, rv->alen)) continue; >+ if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) >+ || TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen))) continue; > > // increment word number, if the second root has a compoundroot flag > if ((rv) && (compoundroot) && >@@ -2151,7 +2194,7 @@ > ) || > ( > // test CHECKCOMPOUNDPATTERN >- numcheckcpd && !words && cpdpat_check(word, i, rv, NULL) >+ numcheckcpd && !words && cpdpat_check(word, i, rv, NULL, 0) > ) || > ( > checkcompoundcase && !words && cpdcase_check(word, i) >@@ -2227,7 +2270,8 @@ > } > > // check forbiddenwords >- if ((rv) && (rv->astr) && TESTAFF(rv->astr, forbiddenword, rv->alen)) { >+ if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || >+ TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen))) { > st[i] = ch; > continue; > } >@@ -2321,7 +2365,8 @@ > } > > // check forbiddenwords >- if ((rv) && (rv->astr) && (TESTAFF(rv->astr,forbiddenword,rv->alen)) >+ if ((rv) && (rv->astr) && (TESTAFF(rv->astr,forbiddenword,rv->alen) || >+ TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen)) > && (! TESTAFF(rv->astr, needaffix, rv->alen))) { > st[i] = ch; > continue; >@@ -2891,7 +2936,8 @@ > if (newword) { > hentry * check = pHMgr->lookup(newword); // XXX extra dic > if (!check || !check->astr || >- !TESTAFF(check->astr, forbiddenword, check->alen)) { >+ !(TESTAFF(check->astr, forbiddenword, check->alen) || >+ TESTAFF(check->astr, ONLYUPCASEFLAG, check->alen))) { > return newword; > } > free(newword); >@@ -3445,7 +3491,16 @@ > } > break; > } >- case 1: { reptable[j].pattern = mystrrep(mystrdup(piece),"_"," "); break; } >+ case 1: { >+ if (*piece == '^') reptable[j].start = true; else reptable[j].start = false; >+ reptable[j].pattern = mystrrep(mystrdup(piece + int(reptable[j].start)),"_"," "); >+ int lr = strlen(reptable[j].pattern) - 1; >+ if (reptable[j].pattern[lr] == '$') { >+ reptable[j].end = true; >+ reptable[j].pattern[lr] = '\0'; >+ } else reptable[j].end = false; >+ break; >+ } > case 2: { reptable[j].pattern2 = mystrrep(mystrdup(piece),"_"," "); break; } > default: break; > } >@@ -3535,8 +3590,12 @@ > piece = mystrsep(&tp, 0); > } > if (!pattern || !pattern2) { >- HUNSPELL_WARNING(stderr, "error: line %d: table is corrupt\n", af->getlinenum()); >- return 1; >+ if (pattern) >+ free(pattern); >+ if (pattern2) >+ free(pattern2); >+ HUNSPELL_WARNING(stderr, "error: line %d: table is corrupt\n", af->getlinenum()); >+ return 1; > } > (*rl)->add(pattern, pattern2); > } >@@ -3932,7 +3991,7 @@ > /* parse in the word breakpoint table */ > int AffixMgr::parse_breaktable(char * line, FileMgr * af) > { >- if (numbreak != 0) { >+ if (numbreak > -1) { > HUNSPELL_WARNING(stderr, "error: line %d: multiple table definitions\n", af->getlinenum()); > return 1; > } >@@ -3947,10 +4006,11 @@ > case 0: { np++; break; } > case 1: { > numbreak = atoi(piece); >- if (numbreak < 1) { >+ if (numbreak < 0) { > HUNSPELL_WARNING(stderr, "error: line %d: bad entry number\n", af->getlinenum()); > return 1; > } >+ if (numbreak == 0) return 0; > breaktable = (char **) malloc(numbreak * sizeof(char *)); > if (!breaktable) return 1; > np++; >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/affixmgr.hxx >--- a/extensions/spellcheck/hunspell/src/affixmgr.hxx Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/affixmgr.hxx Wed Jan 05 11:36:53 2011 +0000 >@@ -200,7 +200,8 @@ > > short get_syllable (const char * word, int wlen); > int cpdrep_check(const char * word, int len); >- int cpdpat_check(const char * word, int len, hentry * r1, hentry * r2); >+ int cpdpat_check(const char * word, int len, hentry * r1, hentry * r2, >+ const char affixed); > int defcpd_check(hentry *** words, short wnum, hentry * rv, > hentry ** rwords, char all); > int cpdcase_check(const char * word, int len); >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/csutil.cpp >--- a/extensions/spellcheck/hunspell/src/csutil.cpp Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/csutil.cpp Wed Jan 05 11:36:53 2011 +0000 >@@ -65,6 +65,13 @@ > #include "atypes.hxx" > #include "langnum.hxx" > >+// Unicode character encoding information >+struct unicode_info { >+ unsigned short c; >+ unsigned short cupper; >+ unsigned short clower; >+}; >+ > #ifdef OPENOFFICEORG > # include <unicode/uchar.h> > #else >@@ -79,14 +86,18 @@ > #include "nsServiceManagerUtils.h" > #include "nsIUnicodeEncoder.h" > #include "nsIUnicodeDecoder.h" >+#include "nsUnicharUtils.h" > #include "nsICharsetConverterManager.h" >-#include "nsUnicharUtilCIID.h" >-#include "nsUnicharUtils.h" > > static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID); >-static NS_DEFINE_CID(kUnicharUtilCID, NS_UNICHARUTIL_CID); > #endif > >+struct unicode_info2 { >+ char cletter; >+ unsigned short cupper; >+ unsigned short clower; >+}; >+ > static struct unicode_info2 * utf_tbl = NULL; > static int utf_tbl_count = 0; // utf_tbl can be used by multiple Hunspell instances > >@@ -595,8 +606,9 @@ > char * mystrrep(char * word, const char * pat, const char * rep) { > char * pos = strstr(word, pat); > if (pos) { >- int replen = strlen(rep); >- int patlen = strlen(pat); >+ int replen = strlen(rep); >+ int patlen = strlen(pat); >+ while (pos) { > if (replen < patlen) { > char * end = word + strlen(word); > char * next = pos + replen; >@@ -610,6 +622,8 @@ > for (; prev >= end; *next = *prev, prev--, next--); > } > strncpy(pos, rep, replen); >+ pos = strstr(word, pat); >+ } > } > return word; > } >@@ -5170,35 +5184,78 @@ > { 0x00, 0xff, 0xff } > }; > >-static struct enc_entry encds[] = { >-{"ISO8859-1",iso1_tbl}, >-{"ISO8859-2",iso2_tbl}, >-{"ISO8859-3",iso3_tbl}, >-{"ISO8859-4",iso4_tbl}, >-{"ISO8859-5",iso5_tbl}, >-{"ISO8859-6",iso6_tbl}, >-{"ISO8859-7",iso7_tbl}, >-{"ISO8859-8",iso8_tbl}, >-{"ISO8859-9",iso9_tbl}, >-{"ISO8859-10",iso10_tbl}, >-{"KOI8-R",koi8r_tbl}, >-{"KOI8-U",koi8u_tbl}, >-{"microsoft-cp1251",cp1251_tbl}, >-{"ISO8859-13", iso13_tbl}, >-{"ISO8859-14", iso14_tbl}, >-{"ISO8859-15", iso15_tbl}, >-{"ISCII-DEVANAGARI", iscii_devanagari_tbl} >+struct enc_entry { >+ const char * enc_name; >+ struct cs_info * cs_table; > }; > >+static struct enc_entry encds[] = { >+ {"iso88591",iso1_tbl}, //ISO-8859-1 >+ {"iso88592",iso2_tbl}, //ISO-8859-2 >+ {"iso88593",iso3_tbl}, //ISO-8859-3 >+ {"iso88594",iso4_tbl}, //ISO-8859-4 >+ {"iso88595",iso5_tbl}, //ISO-8859-5 >+ {"iso88596",iso6_tbl}, //ISO-8859-6 >+ {"iso88597",iso7_tbl}, //ISO-8859-7 >+ {"iso88598",iso8_tbl}, //ISO-8859-8 >+ {"iso88599",iso9_tbl}, //ISO-8859-9 >+ {"iso885910",iso10_tbl}, //ISO-8859-10 >+ {"iso885913", iso13_tbl}, //ISO-8859-13 >+ {"iso885914", iso14_tbl}, //ISO-8859-14 >+ {"iso885915", iso15_tbl}, //ISO-8859-15 >+ {"koi8r",koi8r_tbl}, //KOI8-R >+ {"koi8u",koi8u_tbl}, //KOI8-U >+ {"cp1251",cp1251_tbl}, //CP-1251 >+ {"microsoftcp1251",cp1251_tbl}, //microsoft-cp1251 >+ {"xisciias", iscii_devanagari_tbl}, //x-iscii-as >+ {"isciidevanagari", iscii_devanagari_tbl} //ISCII-DEVANAGARI >+}; >+ >+/* map to lower case and remove non alphanumeric chars */ >+static void toAsciiLowerAndRemoveNonAlphanumeric( const char* pName, char* pBuf ) >+{ >+ while ( *pName ) >+ { >+ /* A-Z */ >+ if ( (*pName >= 0x41) && (*pName <= 0x5A) ) >+ { >+ *pBuf = (*pName)+0x20; /* toAsciiLower */ >+ pBuf++; >+ } >+ /* a-z, 0-9 */ >+ else if ( ((*pName >= 0x61) && (*pName <= 0x7A)) || >+ ((*pName >= 0x30) && (*pName <= 0x39)) ) >+ { >+ *pBuf = *pName; >+ pBuf++; >+ } >+ >+ pName++; >+ } >+ >+ *pBuf = '\0'; >+} >+ > struct cs_info * get_current_cs(const char * es) { >- struct cs_info * ccs = encds[0].cs_table; >+ char *normalized_encoding = new char[strlen(es)+1]; >+ toAsciiLowerAndRemoveNonAlphanumeric(es, normalized_encoding); >+ >+ struct cs_info * ccs = NULL; > int n = sizeof(encds) / sizeof(encds[0]); > for (int i = 0; i < n; i++) { >- if (strcmp(es,encds[i].enc_name) == 0) { >+ if (strcmp(normalized_encoding,encds[i].enc_name) == 0) { > ccs = encds[i].cs_table; > break; > } > } >+ >+ delete[] normalized_encoding; >+ >+ if (!ccs) { >+ HUNSPELL_WARNING(stderr, "error: unknown encoding %s: using %s as fallback\n", es, encds[0].enc_name); >+ ccs = encds[0].cs_table; >+ } >+ > return ccs; > } > #else >@@ -5225,6 +5282,9 @@ > return nsnull; > decoder->SetInputErrorBehavior(decoder->kOnError_Signal); > >+ if (NS_FAILED(rv)) >+ return nsnull; >+ > ccs = new cs_info[256]; > > for (unsigned int i = 0; i <= 0xff; ++i) { >@@ -5299,51 +5359,46 @@ > return mystrdup(expw); > } > >+// language to encoding default map > >+struct lang_map { >+ const char * lang; >+ int num; >+}; > > static struct lang_map lang2enc[] = { >-{"ar", "UTF-8", LANG_ar}, >-{"az", "UTF-8", LANG_az}, >-{"bg", "microsoft-cp1251", LANG_bg}, >-{"ca", "ISO8859-1", LANG_ca}, >-{"cs", "ISO8859-2", LANG_cs}, >-{"da", "ISO8859-1", LANG_da}, >-{"de", "ISO8859-1", LANG_de}, >-{"el", "ISO8859-7", LANG_el}, >-{"en", "ISO8859-1", LANG_en}, >-{"es", "ISO8859-1", LANG_es}, >-{"eu", "ISO8859-1", LANG_eu}, >-{"gl", "ISO8859-1", LANG_gl}, >-{"fr", "ISO8859-15", LANG_fr}, >-{"hr", "ISO8859-2", LANG_hr}, >-{"hu", "ISO8859-2", LANG_hu}, >-{"it", "ISO8859-1", LANG_it}, >-{"la", "ISO8859-1", LANG_la}, >-{"lv", "ISO8859-13", LANG_lv}, >-{"nl", "ISO8859-1", LANG_nl}, >-{"pl", "ISO8859-2", LANG_pl}, >-{"pt", "ISO8859-1", LANG_pt}, >-{"sv", "ISO8859-1", LANG_sv}, >-{"tr", "UTF-8", LANG_tr}, >-{"ru", "KOI8-R", LANG_ru}, >-{"uk", "KOI8-U", LANG_uk} >+{"ar", LANG_ar}, >+{"az", LANG_az}, >+{"bg", LANG_bg}, >+{"ca", LANG_ca}, >+{"cs", LANG_cs}, >+{"da", LANG_da}, >+{"de", LANG_de}, >+{"el", LANG_el}, >+{"en", LANG_en}, >+{"es", LANG_es}, >+{"eu", LANG_eu}, >+{"gl", LANG_gl}, >+{"fr", LANG_fr}, >+{"hr", LANG_hr}, >+{"hu", LANG_hu}, >+{"it", LANG_it}, >+{"la", LANG_la}, >+{"lv", LANG_lv}, >+{"nl", LANG_nl}, >+{"pl", LANG_pl}, >+{"pt", LANG_pt}, >+{"sv", LANG_sv}, >+{"tr", LANG_tr}, >+{"ru", LANG_ru}, >+{"uk", LANG_uk} > }; > > >-const char * get_default_enc(const char * lang) { >- int n = sizeof(lang2enc) / sizeof(lang2enc[0]); >- for (int i = 0; i < n; i++) { >- if (strcmp(lang,lang2enc[i].lang) == 0) { >- return lang2enc[i].def_enc; >- } >- } >- return NULL; >-} >- > int get_lang_num(const char * lang) { > int n = sizeof(lang2enc) / sizeof(lang2enc[0]); > for (int i = 0; i < n; i++) { >- if (strncmp(lang,lang2enc[i].lang,2) == 0) { >+ if (strcmp(lang, lang2enc[i].lang) == 0) { > return lang2enc[i].num; > } > } >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/csutil.hxx >--- a/extensions/spellcheck/hunspell/src/csutil.hxx Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/csutil.hxx Wed Jan 05 11:36:53 2011 +0000 >@@ -173,42 +173,14 @@ > unsigned char cupper; > }; > >-// Unicode character encoding information >-struct unicode_info { >- unsigned short c; >- unsigned short cupper; >- unsigned short clower; >-}; >- >-struct unicode_info2 { >- char cletter; >- unsigned short cupper; >- unsigned short clower; >-}; >- > LIBHUNSPELL_DLL_EXPORTED int initialize_utf_tbl(); > LIBHUNSPELL_DLL_EXPORTED void free_utf_tbl(); > LIBHUNSPELL_DLL_EXPORTED unsigned short unicodetoupper(unsigned short c, int langnum); > LIBHUNSPELL_DLL_EXPORTED unsigned short unicodetolower(unsigned short c, int langnum); > LIBHUNSPELL_DLL_EXPORTED int unicodeisalpha(unsigned short c); > >-struct enc_entry { >- const char * enc_name; >- struct cs_info * cs_table; >-}; >- >-// language to encoding default map >- >-struct lang_map { >- const char * lang; >- const char * def_enc; >- int num; >-}; >- > LIBHUNSPELL_DLL_EXPORTED struct cs_info * get_current_cs(const char * es); > >-LIBHUNSPELL_DLL_EXPORTED const char * get_default_enc(const char * lang); >- > // get language identifiers of language codes > LIBHUNSPELL_DLL_EXPORTED int get_lang_num(const char * lang); > >@@ -276,9 +248,9 @@ > if (!h->var) > ret = NULL; > else if (h->var & H_OPT_ALIASM) >- ret = get_stored_pointer(&(h->word[0]) + h->blen + 1); >+ ret = get_stored_pointer(HENTRY_WORD(h) + h->blen + 1); > else >- ret = &(h->word[0]) + h->blen + 1; >+ ret = HENTRY_WORD(h) + h->blen + 1; > return ret; > } > >@@ -289,9 +261,9 @@ > if (!h->var) > ret = ""; > else if (h->var & H_OPT_ALIASM) >- ret = get_stored_pointer(&(h->word[0]) + h->blen + 1); >+ ret = get_stored_pointer(HENTRY_WORD(h) + h->blen + 1); > else >- ret = &(h->word[0]) + h->blen + 1; >+ ret = HENTRY_WORD(h) + h->blen + 1; > return ret; > } > >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/hashmgr.cpp >--- a/extensions/spellcheck/hunspell/src/hashmgr.cpp Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/hashmgr.cpp Wed Jan 05 11:36:53 2011 +0000 >@@ -502,6 +502,7 @@ > al = decode_flags(&flags, ap + 1, dict); > if (al == -1) { > HUNSPELL_WARNING(stderr, "Can't allocate memory.\n"); >+ delete dict; > return 6; > } > flag_qsort(flags, 0, al); >@@ -545,7 +546,6 @@ > int HashMgr::decode_flags(unsigned short ** result, char * flags, FileMgr * af) { > int len; > if (*flags == '\0') { >- HUNSPELL_WARNING(stderr, "error: line %d: bad flagvector\n", af->getlinenum()); > *result = NULL; > return 0; > } >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/hunspell.cpp >--- a/extensions/spellcheck/hunspell/src/hunspell.cpp Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/hunspell.cpp Wed Jan 05 11:36:53 2011 +0000 >@@ -87,9 +87,10 @@ > /* encoding from the Affix Manager for that dictionary */ > char * try_string = pAMgr->get_try_string(); > encoding = pAMgr->get_encoding(); >- csconv = get_current_cs(encoding); > langnum = pAMgr->get_langnum(); > utf8 = pAMgr->get_utf8(); >+ if (!utf8) >+ csconv = get_current_cs(encoding); > complexprefixes = pAMgr->get_complexprefixes(); > wordbreak = pAMgr->get_breaktable(); > >@@ -623,6 +624,11 @@ > word = w2; > } else word = w; > >+ len = strlen(word); >+ >+ if (!len) >+ return NULL; >+ > // word reversing wrapper for complex prefixes > if (complexprefixes) { > if (word != w2) { >@@ -660,7 +666,6 @@ > // check with affixes > if (!he && pAMgr) { > // try stripping off affixes */ >- len = strlen(word); > he = pAMgr->affix_check(word, len, 0); > > // check compound restriction and onlyupcase >@@ -1013,10 +1018,12 @@ > if (strcmp((*slst)[k], (*slst)[j]) == 0) { > free((*slst)[j]); > l--; >+ break; > } > } > l++; > } >+ ns = l; > > // output conversion > rl = (pAMgr) ? pAMgr->get_oconvtable() : NULL; >@@ -1529,7 +1536,12 @@ > if (dash[1] == '\0') { // base word ending with dash > if (spell(cw)) { > char * p = pSMgr->suggest_morph(cw); >- if (p) return line_tok(pSMgr->suggest_morph(cw), slst, MSEP_REC); >+ if (p) { >+ int ret = line_tok(p, slst, MSEP_REC); >+ free(p); >+ return ret; >+ } >+ > } > } else if ((dash[1] == 'e') && (dash[2] == '\0')) { // XXX (HU) -e hat. > if (spell(cw) && (spell("-e"))) { >@@ -1712,7 +1724,7 @@ > for (p = list, n = 0; (p = strstr(p, tag)); p++, n++) { > int l = strlen(p); > (*slst)[n] = (char *) malloc(l + 1); >- if (!(*slst)[n]) return (n > 0 ? n - 1 : 0); >+ if (!(*slst)[n]) return n; > if (!get_xml_par((*slst)[n], p + strlen(tag) - 1, l)) { > free((*slst)[n]); > break; >@@ -1764,12 +1776,14 @@ > return generate(slst, cw, cw2); > } > } else { >- char ** slst2; >- if ((q2 = strstr(q2 + 1, "<code")) && >- (n = get_xml_list(&slst2, strchr(q2, '>'), "<a>"))) { >- int n2 = generate(slst, cw, slst2, n); >- freelist(&slst2, n); >- return uniqlist(*slst, n2); >+ if ((q2 = strstr(q2 + 1, "<code"))) { >+ char ** slst2; >+ if ((n = get_xml_list(&slst2, strchr(q2, '>'), "<a>"))) { >+ int n2 = generate(slst, cw, slst2, n); >+ freelist(&slst2, n); >+ return uniqlist(*slst, n2); >+ } >+ freelist(&slst2, n); > } > } > } >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/replist.cpp >--- a/extensions/spellcheck/hunspell/src/replist.cpp Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/replist.cpp Wed Jan 05 11:36:53 2011 +0000 >@@ -89,6 +89,8 @@ > if (r == NULL) return 1; > r->pattern = mystrrep(pat1, "_", " "); > r->pattern2 = mystrrep(pat2, "_", " "); >+ r->start = false; >+ r->end = false; > dat[pos++] = r; > for (int i = pos - 1; i > 0; i--) { > r = dat[i]; >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/suggestmgr.cpp >--- a/extensions/spellcheck/hunspell/src/suggestmgr.cpp Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/suggestmgr.cpp Wed Jan 05 11:36:53 2011 +0000 >@@ -93,14 +93,18 @@ > maxngramsugs = MAXNGRAMSUGS; > > if (pAMgr) { >- char * enc = pAMgr->get_encoding(); >- csconv = get_current_cs(enc); >- free(enc); > langnum = pAMgr->get_langnum(); > ckey = pAMgr->get_key_string(); > nosplitsugs = pAMgr->get_nosplitsugs(); >- if (pAMgr->get_maxngramsugs() >= 0) maxngramsugs = pAMgr->get_maxngramsugs(); >+ if (pAMgr->get_maxngramsugs() >= 0) >+ maxngramsugs = pAMgr->get_maxngramsugs(); > utf8 = pAMgr->get_utf8(); >+ if (!utf8) >+ { >+ char * enc = pAMgr->get_encoding(); >+ csconv = get_current_cs(enc); >+ free(enc); >+ } > complexprefixes = pAMgr->get_complexprefixes(); > } > >@@ -178,7 +182,7 @@ > char ** wlst; > w_char word_utf[MAXSWL]; > int wl = 0; >- >+ int nsugorig = nsug; > char w2[MAXWORDUTF8LEN]; > const char * word = w; > >@@ -239,7 +243,7 @@ > } > > // only suggest compound words when no other suggestion >- if ((cpdsuggest == 0) && (nsug > 0)) nocompoundtwowords=1; >+ if ((cpdsuggest == 0) && (nsug > nsugorig)) nocompoundtwowords=1; > > // did we add a char that should not be there > if ((nsug < maxSug) && (nsug > -1)) { >@@ -449,7 +453,8 @@ > lenr = strlen(reptable[i].pattern2); > lenp = strlen(reptable[i].pattern); > // search every occurence of the pattern in the word >- while ((r=strstr(r, reptable[i].pattern)) != NULL) { >+ while ((r=strstr(r, reptable[i].pattern)) != NULL && (!reptable[i].end || strlen(r) == strlen(reptable[i].pattern)) && >+ (!reptable[i].start || r == word)) { > strcpy(candidate, word); > if (r-word + lenr + strlen(r+lenp) >= MAXSWUTF8L) break; > strcpy(candidate+(r-word),reptable[i].pattern2); >@@ -459,19 +464,24 @@ > // check REP suggestions with space > char * sp = strchr(candidate, ' '); > if (sp) { >- *sp = '\0'; >- if (checkword(candidate, strlen(candidate), 0, NULL, NULL)) { >- int oldns = ns; >+ 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 = ' '; >- 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 > } >diff -r 1494caa22150 extensions/spellcheck/hunspell/src/w_char.hxx >--- a/extensions/spellcheck/hunspell/src/w_char.hxx Tue Jan 04 11:33:12 2011 -0600 >+++ b/extensions/spellcheck/hunspell/src/w_char.hxx Wed Jan 05 11:36:53 2011 +0000 >@@ -47,6 +47,8 @@ > struct replentry { > char * pattern; > char * pattern2; >+ bool start; >+ bool end; > }; > > #endif
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
|
Diff
|
Review
Attachments on
bug 620626
:
499654
|
501038
|
501297
|
501846
|
507294
|
507295
|
509332
|
510818