void load_phrase(char *fname, time_t *modtime, struct keystruc *tr, int trN) { FILE *fp; char kname[32]; char ttt[512]; // dbg("load_phrase %s\n", fname); if ((fp=watch_fopen(fname, modtime)) == NULL) { return; } // dbg("load succcc %s\n", fname); skip_utf8_sigature(fp); while (!feof(fp)) { int i,j; char str[512]; kname[0]=str[0]=0; myfgets(ttt, sizeof(ttt), fp); if (ttt[0]=='#') continue; for(i=0; ttt[i]!=' ' && ttt[i]!=9 && ttt[i]; i++) kname[i]=ttt[i]; kname[i]=0; gboolean is_upper = FALSE; if (!(kname[0]&0x80) && isupper(kname[0])) { is_upper = TRUE; kname[0] = tolower(kname[0]); } while((ttt[i]==' ' || ttt[i]==9) && ttt[i]) i++; for(j=0; ttt[i]!='\n' && ttt[i]; i++,j++) str[j]=ttt[i]; if (!str[0] || !kname[0]) continue; str[j]=0; for(i=0; i < trN; i++) if (!strcmp(kname, tr[i].kname)) break; if (i==trN) { dbg("unknown key: %s\n", kname); continue; } if (is_upper) tr[i].str_caps = strdup(str); else tr[i].str = strdup(str); } }
static gboolean read_syms() { FILE *fp; static char symbol_table[] = "symbol-table"; static time_t file_modify_time; if ((fp=watch_fopen(symbol_table, &file_modify_time))==NULL) return FALSE; skip_utf8_sigature(fp); int pg; for(pg=0; pg < pagesN; pg++) { syms = pages[pg].syms; symsN = pages[pg].symsN; int i; for(i=0; i < symsN; i++) { int j; for(j=0; j < syms[i].symN; j++) if (syms[i].sym[j]) free(syms[i].sym[j]); } free(syms); } pagesN = 0; pages = NULL; syms = NULL; symsN = 0; while (!feof(fp)) { char tt[1024]; bzero(tt, sizeof(tt)); myfgets(tt, sizeof(tt), fp); // dbg("%d] %s\n",strlen(tt), tt); int len=strlen(tt); #if 0 if (!len) continue; if (tt[len-1]=='\n') { tt[len-1]=0; } #endif if (tt[0]==0) save_page(); if (tt[0]=='#') continue; char *p=tt; syms=trealloc(syms, SYM_ROW, symsN+1); SYM_ROW *psym = &syms[symsN++]; bzero(psym, sizeof(SYM_ROW)); while (*p) { char *n = p; while (*n && *n!='\t') n++; *n = 0; psym->sym=trealloc(psym->sym, char *, psym->symN+1); psym->sym[psym->symN++] = strdup(p); p = n + 1; } if (!psym->symN) { free(syms); syms=NULL; symsN=0; } } if (symsN) save_page(); fclose(fp); idx = 0; syms = pages[idx].syms; symsN = pages[idx].symsN; return TRUE; }
int main(int argc, char **argv) { FILE *fp,*fw; char s[1024]; u_char chbuf[MAX_PHRASE_LEN * CH_SZ]; u_short phbuf[80]; u_int phbuf32[80]; u_int64_t phbuf64[80]; int i,j,idx,len, ofs; u_short kk; u_int64_t kk64; int hashidx[TSIN_HASH_N]; u_char clen; int lineCnt=0; gboolean reload = getenv("HIME_NO_RELOAD")==NULL; if (reload) { dbg("need reload\n"); } else { dbg("NO_GTK_INIT\n"); } if (getenv("NO_GTK_INIT")==NULL) gtk_init(&argc, &argv); dbg("enter %s\n", argv[0]); if (argc < 2) p_err("must specify input file"); init_TableDir(); if ((fp=fopen(argv[1], "rb"))==NULL) { printf("Cannot open %s\n", argv[1]); exit(-1); } skip_utf8_sigature(fp); char *outfile; int fofs = ftell(fp); myfgets(s, sizeof(s), fp); if (strstr(s, "!!pinyin")) { b_pinyin = TRUE; printf("is pinyin\n"); load_pin_juyin(); } else fseek(fp, fofs, SEEK_SET); fofs = ftell(fp); int keybits=0, maxkey=0; char keymap[128]; char kno[128]; bzero(kno, sizeof(kno)); myfgets(s, sizeof(s), fp); puts(s); if (strstr(s, TSIN_GTAB_KEY)) { is_gtab = TRUE; lineCnt++; if (argc < 3) p_err("useage %s input_file output_file", argv[0]); outfile = argv[2]; len=strlen((char *)s); if (s[len-1]=='\n') s[--len]=0; char aa[128]; keymap[0]=' '; sscanf(s, "%s %d %d %s", aa, &keybits, &maxkey, keymap+1); for(i=0; keymap[i]; i++) kno[keymap[i]]=i; if (maxkey * keybits > 32) gtabkey64 = TRUE; } else { if (argc==3) outfile = argv[2]; else outfile = "tsin32"; fseek(fp, fofs, SEEK_SET); } INMD inmd, *cur_inmd = &inmd; char *cphbuf; if (is_gtab) { cur_inmd->keybits = keybits; if (gtabkey64) { cphbuf = (char *)phbuf64; phsz = 8; key_cmp = key_cmp64; hash_shift = TSIN_HASH_SHIFT_64; cur_inmd->key64 = TRUE; } else { cphbuf = (char *)phbuf32; phsz = 4; hash_shift = TSIN_HASH_SHIFT_32; key_cmp = key_cmp32; cur_inmd->key64 = FALSE; } cur_inmd->last_k_bitn = (((cur_inmd->key64 ? 64:32) / cur_inmd->keybits) - 1) * cur_inmd->keybits; dbg("cur_inmd->last_k_bitn %d\n", cur_inmd->last_k_bitn); } else { cphbuf = (char *)phbuf; phsz = 2; key_cmp = key_cmp16; hash_shift = TSIN_HASH_SHIFT; } dbg("phsz: %d\n", phsz); phcount=ofs=0; while (!feof(fp)) { usecount_t usecount=0; lineCnt++; myfgets((char *)s,sizeof(s),fp); len=strlen((char *)s); if (s[0]=='#') continue; if (strstr(s, TSIN_GTAB_KEY)) continue; if (s[len-1]=='\n') s[--len]=0; if (len==0) continue; i=0; int chbufN=0; int charN = 0; while (s[i]!=' ' && i<len) { int len = utf8_sz((char *)&s[i]); memcpy(&chbuf[chbufN], &s[i], len); i+=len; chbufN+=len; charN++; } while ((i < len && s[i]==' ') || s[i]=='\t') i++; int phbufN=0; while (i<len && phbufN < charN && s[i]!=' ') { if (is_gtab) { kk64=0; int idx=0; while (s[i]!=' ' && i<len) { int k = kno[s[i]]; kk64|=(u_int64_t)k << ( LAST_K_bitN - idx*keybits); i++; idx++; } if (phsz==8) phbuf64[phbufN++]=kk64; else phbuf32[phbufN++]=(u_int)kk64; } else { kk=0; if (b_pinyin) { kk = pinyin2phokey(s+i); while (s[i]!=' ' && i<len) i++; } else { while (s[i]!=' ' && i<len) { if (kk==(BACK_QUOTE_NO << 9)) kk|=s[i]; else kk |= lookup((u_char *)&s[i]); i+=utf8_sz((char *)&s[i]); } } phbuf[phbufN++]=kk; } i++; } if (phbufN!=charN) { p_err("%s Line %d problem in phbufN!=chbufN %d != %d\n", s, lineCnt, phbufN, chbufN); } clen=phbufN; while (i<len && s[i]==' ') i++; if (i==len) usecount = 0; else usecount = atoi((char *)&s[i]); /* printf("len:%d\n", clen); */ if (phcount >= phidxsize) { phidxsize+=1024; if (!(phidx=(int *)realloc(phidx,phidxsize*4))) { puts("realloc err"); exit(1); } } phidx[phcount++]=ofs; int new_bfN = ofs + 1 + sizeof(usecount_t)+ phsz * clen + chbufN; if (bfsize < new_bfN) { bfsize = new_bfN + 1024*1024; bf = (char *)realloc(bf, bfsize); } memcpy(&bf[ofs++],&clen,1); memcpy(&bf[ofs],&usecount, sizeof(usecount_t)); ofs+=sizeof(usecount_t); memcpy(&bf[ofs], cphbuf, clen * phsz); ofs+=clen * phsz; memcpy(&bf[ofs], chbuf, chbufN); ofs+=chbufN; } fclose(fp); /* dumpbf(bf,phidx); */ puts("Sorting ...."); qsort(phidx,phcount, sizeof(phidx[0]),qcmp); if (!(sf=(u_char *)malloc(bfsize))) { puts("malloc err"); exit(1); } if (!(sidx=(int *)malloc(phidxsize*sizeof(int)))) { puts("malloc err"); exit(1); } // delete duplicate ofs=0; j=0; for(i=0;i<phcount;i++) { idx = phidx[i]; sidx[j]=ofs; len=bf[idx]; int tlen = utf8_tlen(&bf[idx + 1 + sizeof(usecount_t) + phsz*len], len); clen= phsz*len + tlen + 1 + sizeof(usecount_t); if (i && !qcmp_eq(&phidx[i-1], &phidx[i])) continue; memcpy(&sf[ofs], &bf[idx], clen); j++; ofs+=clen; } phcount=j; #if 1 puts("Sorting by usecount ...."); qsort(sidx, phcount, 4, qcmp_usecount); #endif for(i=0;i<256;i++) hashidx[i]=-1; for(i=0;i<phcount;i++) { idx=sidx[i]; idx+= 1 + sizeof(usecount_t); int v; if (phsz==2) { phokey_t kk; memcpy(&kk, &sf[idx], phsz); v = kk >> TSIN_HASH_SHIFT; } else if (phsz==4) {
void load_gtab_list(gboolean skip_disabled) { char ttt[128]; FILE *fp; get_hime_user_fname(gtab_list, ttt); if ((fp=fopen(ttt, "rb"))==NULL) { get_sys_table_file_name(gtab_list, ttt); if ((fp=fopen(ttt, "rb"))==NULL) p_err("cannot open %s", ttt); } dbg("load_gtab_list %s\n", ttt); skip_utf8_sigature(fp); int i; for (i=0; i < inmdN; i++) { INMD *pinmd = &inmd[i]; free(pinmd->filename); pinmd->filename=NULL; free(pinmd->cname); pinmd->cname=NULL; free(pinmd->icon); pinmd->icon=NULL; } inmdN = 0; char *def_file = strrchr(default_input_method_str, ' '); if (def_file) def_file++; while (!feof(fp)) { char line[256]; char name_ar[32], *name=name_ar; char key[32]; char file[32]; char icon[128]; inmd = trealloc(inmd, INMD, inmdN); name[0]=0; key[0]=0; file[0]=0; icon[0]=0; line[0]=0; myfgets(line, sizeof(line), fp); if (strlen(line) < 2) continue; if (line[0]=='#') continue; if (skip_disabled && line[0]=='!') continue; sscanf(line, "%s %s %s %s", name, key, file, icon); // dbg("%s %c\n", line, key[0]); if (strlen(name) < 1) break; int inmd_idx; INMD *pinmd = &inmd[inmd_idx = inmdN++]; bzero(pinmd, sizeof(INMD)); pinmd->key_ch = key[0]; pinmd->in_cycle = strchr(hime_str_im_cycle, key[0]) != NULL; // dbg("%d %d '%c'\n",inmdN, pinmd->in_cycle, pinmd->key_ch); if (!strcmp(file, "!ANTHY")) { strcpy(file, "anthy-module.so"); } if (!strcmp(file, "!INT_CODE")) { strcpy(file, "intcode-module.so"); } pinmd->filename = strdup(file); if (strstr(file, ".so") || strstr(file, ".dll")) { pinmd->method_type = method_type_MODULE; dbg("%s is module file\n", file); } else { int i; for(i=0; method_codes[i].id; i++) if (!strcmp(file, method_codes[i].id)) break; if (method_codes[i].id) pinmd->method_type = method_codes[i].method_type; } if (name[0]=='!') { name++; pinmd->disabled = TRUE; } if (default_input_method_str[0]==key[0] && !pinmd->disabled && (!def_file || !strcmp(file, def_file))) { default_input_method = inmd_idx; dbg("default_input_method %s %s %s %d\n", name, default_input_method_str, key, default_input_method); } pinmd->cname = strdup(name); if (strlen(icon)) pinmd->icon = strdup(icon); } fclose(fp); }