Index: third_party/hyphen/google.patch |
=================================================================== |
--- third_party/hyphen/google.patch (revision 0) |
+++ third_party/hyphen/google.patch (revision 0) |
@@ -0,0 +1,148 @@ |
+? google.patch |
+Index: hyphen.c |
+=================================================================== |
+RCS file: /cvsroot/hunspell/hyphen/hyphen.c,v |
+retrieving revision 1.4 |
+diff -u -r1.4 hyphen.c |
+--- hyphen.c 1 Dec 2010 01:30:20 -0000 1.4 |
++++ hyphen.c 1 Mar 2012 05:18:32 -0000 |
+@@ -242,12 +242,71 @@ |
+ } |
+ #endif |
+ |
++#ifdef HYPHEN_CHROME_CLIENT |
++typedef struct { |
++ const unsigned char *data; |
++ size_t offset; |
++ size_t size; |
++} hnj_file; |
++ |
++static hnj_file * |
++hnj_fopen (const unsigned char *data, size_t size) |
++{ |
++ hnj_file *f; |
++ |
++ f = hnj_malloc (sizeof(hnj_file)); |
++ if (f == NULL) |
++ return NULL; |
++ f->offset = 0; |
++ f->data = data; |
++ f->size = size; |
++ return f; |
++} |
++ |
++static void |
++hnj_fclose (hnj_file *f) |
++{ |
++ hnj_free (f); |
++} |
++ |
++static char * |
++hnj_fgets (char *s, int size, hnj_file *f) |
++{ |
++ int i; |
++ |
++ if (f->offset >= f->size) |
++ return NULL; |
++ for (i = 0; i < size - 1; i++) { |
++ char c; |
++ |
++ if (f->offset >= f->size) |
++ break; |
++ c = f->data[f->offset++]; |
++ if (c == '\r' || c == '\n') |
++ break; |
++ s[i] = c; |
++ } |
++ s[i] = '\0'; |
++ return s; |
++} |
++#else |
++typedef FILE hnj_file; |
++#define hnj_fopen(fn, mode) fopen((fn), (mode)) |
++#define hnj_fclose(f) fclose(f) |
++#define hnj_fgets(s, size, f) fgets((s), (size), (f)) |
++#endif |
++ |
++#ifdef HYPHEN_CHROME_CLIENT |
++HyphenDict * |
++hnj_hyphen_load (const unsigned char *data, size_t size) |
++#else |
+ HyphenDict * |
+ hnj_hyphen_load (const char *fn) |
++#endif |
+ { |
+ HyphenDict *dict[2]; |
+ HashTab *hashtab; |
+- FILE *f; |
++ hnj_file *f; |
+ char buf[MAX_CHARS]; |
+ char word[MAX_CHARS]; |
+ char pattern[MAX_CHARS]; |
+@@ -261,7 +320,11 @@ |
+ HashEntry *e; |
+ int nextlevel = 0; |
+ |
++#ifdef HYPHEN_CHROME_CLIENT |
++ f = hnj_fopen (data, size); |
++#else |
+ f = fopen (fn, "r"); |
++#endif |
+ if (f == NULL) |
+ return NULL; |
+ |
+@@ -291,7 +354,7 @@ |
+ /* read in character set info */ |
+ if (k == 0) { |
+ for (i=0;i<MAX_NAME;i++) dict[k]->cset[i]= 0; |
+- if (fgets(dict[k]->cset, sizeof(dict[k]->cset),f) != NULL) { |
++ if (hnj_fgets(dict[k]->cset, sizeof(dict[k]->cset),f) != NULL) { |
+ for (i=0;i<MAX_NAME;i++) |
+ if ((dict[k]->cset[i] == '\r') || (dict[k]->cset[i] == '\n')) |
+ dict[k]->cset[i] = 0; |
+@@ -304,7 +367,7 @@ |
+ dict[k]->utf8 = dict[0]->utf8; |
+ } |
+ |
+- while (fgets (buf, sizeof(buf), f) != NULL) |
++ while (hnj_fgets (buf, sizeof(buf), f) != NULL) |
+ { |
+ if (buf[0] != '%') |
+ { |
+@@ -385,7 +448,7 @@ |
+ if (dict[k]->utf8) { |
+ int pu = -1; /* unicode character position */ |
+ int ps = -1; /* unicode start position (original replindex) */ |
+- int pc = (*word == '.') ? 1: 0; /* 8-bit character position */ |
++ size_t pc = (*word == '.') ? 1: 0; /* 8-bit character position */ |
+ for (; pc < (strlen(word) + 1); pc++) { |
+ /* beginning of an UTF-8 character (not '10' start bits) */ |
+ if ((((unsigned char) word[pc]) >> 6) != 2) pu++; |
+@@ -478,7 +541,7 @@ |
+ #endif |
+ state_num = 0; |
+ } |
+- fclose(f); |
++ hnj_fclose(f); |
+ if (k == 2) dict[0]->nextlevel = dict[1]; |
+ return dict[0]; |
+ } |
+Index: hyphen.h |
+=================================================================== |
+RCS file: /cvsroot/hunspell/hyphen/hyphen.h,v |
+retrieving revision 1.2 |
+diff -u -r1.2 hyphen.h |
+--- hyphen.h 27 Nov 2010 02:20:33 -0000 1.2 |
++++ hyphen.h 1 Mar 2012 05:18:33 -0000 |
+@@ -93,7 +93,11 @@ |
+ int new_state; |
+ }; |
+ |
++#ifdef HYPHEN_CHROME_CLIENT |
++HyphenDict *hnj_hyphen_load (const unsigned char *data, size_t size); |
++#else |
+ HyphenDict *hnj_hyphen_load (const char *fn); |
++#endif |
+ void hnj_hyphen_free (HyphenDict *dict); |
+ |
+ /* obsolete, use hnj_hyphen_hyphenate2() or *hyphenate3() functions) */ |