Index: third_party/hyphen/hyphen.c |
=================================================================== |
--- third_party/hyphen/hyphen.c (revision 124320) |
+++ 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]; |
} |