diff options
Diffstat (limited to 'Build/source/texk/mendexk/convert.c')
-rw-r--r-- | Build/source/texk/mendexk/convert.c | 517 |
1 files changed, 517 insertions, 0 deletions
diff --git a/Build/source/texk/mendexk/convert.c b/Build/source/texk/mendexk/convert.c new file mode 100644 index 00000000000..30455e4d6fb --- /dev/null +++ b/Build/source/texk/mendexk/convert.c @@ -0,0 +1,517 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <kpathsea/config.h> +#include <kpathsea/lib.h> +#include <ptexenc/ptexenc.h> +#include "mendex.h" + +#include "exkana.h" +#include "ktable.h" +#include "exvar.h" + +#ifdef KPATHSEA +#include "kp.h" +extern KpathseaSupportInfo kp_dict; +#endif + +struct dictionary{ +unsigned char dic[2][50]; +}; + +struct dictionary *dictable,*envdic; +int dlines=0,elines=0; + +int dicvalread(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]=(unsigned char)((i>>8)&0xff); + hiragana[cc*2+1]=(unsigned char)(i&0xff); + } + hiragana[(i-0xa4a1)*2]=0; + + for (i=0xa5a1;i<=0xa5f6;i++) { + cc=i-0xa5a1; + katakana[cc*2]=(unsigned char)((i>>8)&0xff); + katakana[cc*2+1]=(unsigned char)(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(char *filename) +{ + int i,ecount=0; + char *envfile,buff[4096]; + FILE *fp; + + if (filename!=NULL) { +#ifdef KPATHSEA + filename = KP_find_file(&kp_dict,filename); +#endif + fp=nkf_open(filename,"r"); + 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=(struct dictionary *)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 + fp=nkf_open(envfile,"r"); + 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=(struct dictionary *)malloc(sizeof(struct dictionary)*i); + + elines=dicvalread(envfile,envdic,i); + + verb_printf(efp,"...done.\n"); + } +} + +/* read dictionary file */ +int dicvalread(char *filename, struct dictionary *dicval, int line) +{ + int i,j,k; + unsigned char buff[256]; + FILE *fp; + + int dcomp(); + + fp=nkf_open(filename,"r"); + for (i=0;i<line;i++) { + if (mfgets(buff,255,fp)==NULL) break; + if ((buff[0]=='\n')||(buff[0]=='\0')) { + i--; + continue; + } + for (j=0;((buff[j]==' ')||(buff[j]=='\t'));j++); + for (k=0;((buff[j]!='\n')&&(buff[j]!=' ')&&(buff[j]!='\t'));j++,k++) { + dicval[i].dic[0][k]=buff[j]; + } + dicval[i].dic[0][k]='\0'; + if (strlen(dicval[i].dic[0])==0) { + i--; + continue; + } + for (;((buff[j]==' ')||(buff[j]=='\t'));j++); + for (k=0;((buff[j]!='\n')&&(buff[j]!=' ')&&(buff[j]!='\t'));j++,k++) { + dicval[i].dic[1][k]=buff[j]; + } + dicval[i].dic[1][k]='\0'; + if (strlen(dicval[i].dic[1])==0) { + i--; + continue; + } + + convert(dicval[i].dic[1],buff); + strcpy(dicval[i].dic[1],buff); + } + + nkf_close(fp); + + qsort(dicval,i,sizeof(struct dictionary),dcomp); + return(i); +} + +/* comp-function of dictionary sorting */ +int dcomp(struct dictionary *buff1, struct dictionary *buff2) +{ + int i; + + for (i=0;i<50;i++) { + if (((*buff1).dic[0][i]=='\0')&&((*buff2).dic[0][i]=='\0')) return 0; + else if (((*buff1).dic[0][i]=='\0')&&((*buff2).dic[0][i]!='\0')) return 1; + else if (((*buff1).dic[0][i]!='\0')&&((*buff2).dic[0][i]=='\0')) return -1; + else if ((*buff1).dic[0][i]<(*buff2).dic[0][i]) return 1; + else if ((*buff1).dic[0][i]>(*buff2).dic[0][i]) return -1; + } + return 0; +} + +/* convert to capital-hiragana character */ +int convert(unsigned char *buff1, unsigned 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 (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<strlen(katakana);k+=2) { + if (strncmp(&buff1[i],&katakana[k],2)==0) { + strncpy(&buff2[j],&kanatable[k],2); + goto MATCH1; + } + } + sprintf(errbuff,"\nError: %s is bad katakana ",&buff1[i]); + fputs(errbuff,efp); + if (efp!=stderr) fputs(errbuff,stderr); + return -1; +MATCH1: + i+=2; + j+=2; + } + + else if ((strncmp(&buff1[i],HIRATOP,2)>=0)&&(strncmp(&buff1[i],HIRAEND,2)<=0)) { +/* hiragana */ + for (k=0;k<strlen(hiragana);k+=2) { + if (strncmp(&buff1[i],&hiragana[k],2)==0) { + strncpy(&buff2[j],&kanatable[k],2); + goto MATCH2; + } + } + sprintf(errbuff,"\nError: %s is bad hiragana ",&buff1[i]); + fputs(errbuff,efp); + if (efp!=stderr) fputs(errbuff,stderr); + return -1; +MATCH2: + i+=2; + j+=2; + } + + else if (strncmp(&buff1[i],ONBIKI,2)==0) { +/* onbiki */ + if (j>=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 (buff1[i]>=0x80) { + if ((strncmp(&buff1[i],SPACE,2)>=0)&&(strncmp(&buff1[i],ALPHAEND,2)<=0)) { +/* alpha-numeric,symbols */ + for (k=0;k<strlen(symboltable);k+=2) { + if (strncmp(&buff1[i],&symboltable[k],2)==0) { + buff2[j]=k/2+0x20; + if ((buff2[j]>='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<dlines;k++) { +/* dictionary table */ + if (strncmp(dictable[k].dic[0],&buff1[i],strlen(dictable[k].dic[0]))==0) { + strncpy(&buff2[j],dictable[k].dic[1],strlen(dictable[k].dic[1])); + i+=strlen(dictable[k].dic[0]); + j+=strlen(dictable[k].dic[1]); + break; + } + } + if ((k==dlines)&&(elines!=0)) { +/* environment dictionary table */ + for (k=0;k<elines;k++) { + if (strncmp(envdic[k].dic[0],&buff1[i],strlen(envdic[k].dic[0]))==0) { + strncpy(&buff2[j],envdic[k].dic[1],strlen(envdic[k].dic[1])); + i+=strlen(envdic[k].dic[0]); + j+=strlen(envdic[k].dic[1]); + break; + } + } + } + if (((k==dlines)&&(elines==0))||((k==elines)&&(elines!=0))) { + if (force==1) { +/* forced convert */ + buff2[j++]=buff1[i++]; + buff2[j++]=buff1[i++]; + } + else { + sprintf(errbuff,"\nError: %s is no entry in dictionary file ",&buff1[i]); + fputs(errbuff,efp); + if (efp!=stderr) fputs(errbuff,stderr); + return -1; + } + } + } + } + } + } + return 0; +} + +int pnumconv(char *page, int attr) +{ + int i,cc=0; + + switch (page_precedence[attr]) { + case 'a': + cc=page[0]-'a'+1; + break; + + case 'A': + cc=page[0]-'A'+1; + break; + + case 'n': + cc=atoi(page); + break; + + case 'r': + case 'R': + for (i=0;i<strlen(page);i++) { + switch (page[i]) { + case 'i': + case 'I': + if (i==0) cc=1; + else cc++; + break; + + case 'v': + case 'V': + if (i==0) cc=5; + else { + switch (page[i-1]) { + case 'i': + case 'I': + cc+=3; + break; + + case 'x': + case 'X': + case 'l': + case 'L': + case 'c': + case 'C': + case 'd': + case 'D': + case 'm': + case 'M': + cc+=5; + break; + + default: + break; + } + } + break; + + case 'x': + case 'X': + if (i==0) cc=10; + else { + switch (page[i-1]) { + case 'i': + case 'I': + cc+=8; + break; + + case 'x': + case 'X': + case 'l': + case 'L': + case 'c': + case 'C': + case 'd': + case 'D': + case 'm': + case 'M': + cc+=10; + break; + + default: + break; + } + } + break; + + case 'l': + case 'L': + if (i==0) cc=50; + else { + switch (page[i-1]) { + case 'x': + case 'X': + cc+=30; + break; + + case 'c': + case 'C': + case 'd': + case 'D': + case 'm': + case 'M': + cc+=50; + break; + + default: + break; + } + } + break; + + case 'c': + case 'C': + if (i==0) cc=100; + switch (page[i-1]) { + case 'x': + case 'X': + cc+=80; + break; + + case 'c': + case 'C': + case 'd': + case 'D': + case 'm': + case 'M': + cc+=100; + break; + + default: + break; + } + break; + + case 'd': + case 'D': + if (i==0) cc=500; + else { + switch (page[i-1]) { + case 'c': + case 'C': + cc+=300; + break; + + case 'm': + case 'M': + cc+=500; + break; + + default: + break; + } + } + break; + + case 'm': + case 'M': + if (i==0) cc=1000; + switch (page[i-1]) { + case 'c': + case 'C': + cc+=800; + break; + + case 'm': + case 'M': + cc+=1000; + break; + + default: + break; + } + break; + + default: + break; + } + } + break; + default: + break; + } + return cc; +} + +int nbyte(unsigned char *str, int n) +{ + return (unsigned int)str[n]; +} |