? 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;icset[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;icset[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) */