| Index: third_party/hyphen/hyphen.c
|
| ===================================================================
|
| --- third_party/hyphen/hyphen.c (revision 146932)
|
| +++ third_party/hyphen/hyphen.c (working copy)
|
| @@ -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;
|
|
|
| - f = fopen (fn, "r");
|
| +#ifdef HYPHEN_CHROME_CLIENT
|
| + f = hnj_fopen (data, size);
|
| +#else
|
| + f = hnj_fopen (fn, "r");
|
| +#endif
|
| if (f == NULL)
|
| return NULL;
|
|
|
| @@ -289,7 +352,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;
|
| @@ -302,7 +365,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] != '%')
|
| {
|
| @@ -368,7 +431,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++;
|
| @@ -461,7 +524,7 @@
|
| #endif
|
| state_num = 0;
|
| }
|
| - fclose(f);
|
| + hnj_fclose(f);
|
| if (k == 2) dict[0]->nextlevel = dict[1];
|
| return dict[0];
|
| }
|
|
|