#include #include #include #include #include #include #include #include "mendex.h" #include "exkana.h" #include "ktable.h" #include "exvar.h" #ifdef KPATHSEA #include "kp.h" #endif struct dictionary{ char dic[2][50]; }; static struct dictionary *dictable,*envdic; static int dlines=0,elines=0; static int dicvalread(const char *filename, struct dictionary *dicval, int line); /* initialize kana table */ void initkanatable(void) { int i,cc; for (i=0xa4a1;i<=0xa4f3;i++) { cc=i-0xa4a1; hiragana[cc*2]=((i>>8)&0xff); hiragana[cc*2+1]=(i&0xff); } hiragana[(i-0xa4a1)*2]=0; for (i=0xa5a1;i<=0xa5f6;i++) { cc=i-0xa5a1; katakana[cc*2]=((i>>8)&0xff); katakana[cc*2+1]=(i&0xff); } katakana[(i-0xa5a1)*2]=0; akasatana=xstrdup(AKASATANA); for (i=0;;i++) { if (akasatana[i*2]==0) break; akasatana[i*2]++; } aiueo=xstrdup(AIUEO); for (i=0;;i++) { if (aiueo[i*2]==0) break; aiueo[i*2]++; } strcpy(atama,akasatana); } /* get dictionary */ int dicread(const char *filename) { int i,ecount=0; const char *envfile; char buff[4096]; FILE *fp; if (filename!=NULL) { #ifdef KPATHSEA filename = KP_find_file(&kp_dict,filename); #endif if(kpse_in_name_ok(filename)) fp=nkf_open(filename,"r"); else fp = NULL; if (fp==NULL) { warn_printf(efp,"Warning: Couldn't find dictionary file %s.\n",filename); goto ENV; } verb_printf(efp,"Scanning dictionary file %s.",filename); for (i=0;;i++) { if (mfgets(buff,4095,fp)==NULL) break; if ((buff[0]=='\n')||(buff[0]=='\0')) i--; } nkf_close(fp); dictable=malloc(sizeof(struct dictionary)*i); dlines=dicvalread(filename,dictable,i); verb_printf(efp,"...done.\n"); } ENV: #ifdef KPATHSEA #ifdef KPATHSEA3 envfile=KP_get_value("INDEXDEFAULTDICTIONARY",NULL); #else envfile=KP_get_value("INDEXDEFAULTDICTIONARY","INDEXDEFAULTDICTIONARY",NULL); #endif #else envfile=getenv("INDEXDEFAULTDICTIONARY"); #endif if ((envfile!=NULL)&&(strlen(envfile)!=0)) { #ifdef KPATHSEA envfile = KP_find_file(&kp_dict,envfile); #endif if(kpse_in_name_ok(envfile)) fp=nkf_open(envfile,"r"); else fp = NULL; if (fp==NULL) { warn_printf(efp,"Warning: Couldn't find environment dictionary file %s.\n",envfile); return ecount; } verb_printf(efp,"Scanning environment dictionary file %s.",envfile); for (i=0;;i++) { if (mfgets(buff,255,fp)==NULL) break; if ((buff[0]=='\n')||(buff[0]=='\0')) i--; } nkf_close(fp); envdic=malloc(sizeof(struct dictionary)*i); elines=dicvalread(envfile,envdic,i); verb_printf(efp,"...done.\n"); } return 0; /* FIXME: is this right? */ } static int dcomp(const void *bf1, const void *bf2); /* read dictionary file */ static int dicvalread(const char *filename, struct dictionary *dicval, int line) { int i,j,k; char buff[256]; FILE *fp; if(kpse_in_name_ok(filename)) fp=nkf_open(filename,"r"); else { fprintf(stderr, "mendex: %s is forbidden to open for reading.\n",filename); exit(-1); } for (i=0;i(unsigned char)(*buff2).dic[0][i]) return -1; } return 0; } /* convert to capital-hiragana character */ int convert(char *buff1, char *buff2) { int i=0,j=0,k,l; char errbuff[4096]; while(1) { if (buff1[i]=='\0') { buff2[j]='\0'; break; } else { if ((buff1[i]>='a')&&(buff1[i]<='z')) { buff2[j]=buff1[i]-32; i++; j++; } else if ((lorder==1)&&((buff1[i]==' ')||(buff1[i]=='\t'))) { i++; } else if ((unsigned char)buff1[i]<0x80) { buff2[j]=buff1[i]; i++; j++; } else if ((strncmp(&buff1[i],KATATOP,2)>=0)&&(strncmp(&buff1[i],KATAEND,2)<=0)) { /* katakana */ for (k=0;k=0)&&(strncmp(&buff1[i],HIRAEND,2)<=0)) { /* hiragana */ for (k=0;k=2) { for (k=0;k<20;k+=2) { for (l=0;l<6;l++) { if (strncmp(&buff2[j-2],&btable[l][k],2)==0) { strncpy(&buff2[j],&btable[l][0],2); goto MATCH3; } } } } sprintf(errbuff,"\nError: %s is Illegal line ",buff1); fputs(errbuff,efp); if (efp!=stderr) fputs(errbuff,stderr); return -1; MATCH3: i+=2; j+=2; } else if ((unsigned char)buff1[i]>=0x80) { if ((strncmp(&buff1[i],SPACE,2)>=0)&&(strncmp(&buff1[i],ALPHAEND,2)<=0)) { /* alpha-numeric,symbols */ for (k=0;k='a')&&(buff2[j]<='z')) buff2[j]-=32; j++; i+=2; break; } } if (k==strlen(symboltable)) { buff2[j++]=buff1[i++]; buff2[j++]=buff1[i++]; } } else { for (k=0;k