diff options
author | Takuji Tanaka <KXD02663@nifty.ne.jp> | 2016-02-09 11:02:48 +0000 |
---|---|---|
committer | Takuji Tanaka <KXD02663@nifty.ne.jp> | 2016-02-09 11:02:48 +0000 |
commit | adec059e95b8e5728d8fb2d8420c5e928812c282 (patch) | |
tree | 28d38c44042fea2befbccbdd71063c801518d298 /Build/source/texk/upmendex/convert.c | |
parent | b0bdd8cd0fed764f189d773b0b0f69d25415a8f5 (diff) |
texk/upmendex: upmendex 0.50
git-svn-id: svn://tug.org/texlive/trunk@39638 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/upmendex/convert.c')
-rw-r--r-- | Build/source/texk/upmendex/convert.c | 466 |
1 files changed, 466 insertions, 0 deletions
diff --git a/Build/source/texk/upmendex/convert.c b/Build/source/texk/upmendex/convert.c new file mode 100644 index 00000000000..49c535f1694 --- /dev/null +++ b/Build/source/texk/upmendex/convert.c @@ -0,0 +1,466 @@ +#include "mendex.h" + +#include <kpathsea/tex-file.h> +#include <kpathsea/variable.h> + +#include "qsort.h" + +#include "exkana.h" +#include "ktable.h" +#include "exvar.h" + +#include "kp.h" + +struct dictionary{ +UChar* dic[2]; +}; + +static struct dictionary *dictable,*envdic; +static int dlines=0,elines=0; + +static int dicvalread(const char *filename, struct dictionary *dicval, int line); + +#define is_alpha_numeric(a) (((a)>=ALPHATOP && (a)<=ALPHAEND) || (a)==YENSIGN) + +UChar * u_xstrdup (const UChar *string) +{ + return u_strcpy(xmalloc((u_strlen(string)+1)*sizeof(UChar)), string); +} + +/* initialize kana table */ +void initkanatable(void) +{ + int i,cc; + + akasatana=u_xstrdup(AKASATANA); + for (i=0;;i++) { + if (akasatana[i]==0) break; + akasatana[i]+=KATATOP-HIRATOP; /* hiragana -> katakana */ + } + + aiueo=u_xstrdup(AIUEO); + for (i=0;;i++) { + if (aiueo[i]==0) break; + aiueo[i]+=KATATOP-HIRATOP; /* hiragana -> katakana */ + } + + u_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) { + filename = KP_find_file(&kp_dict,filename); + if(kpse_in_name_ok(filename)) + fp=fopen(filename,"rb"); + 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 (fgets(buff,4095,fp)==NULL) break; + if ((buff[0]=='\r')||(buff[0]=='\n')||(buff[0]=='\0')) i--; + } + fclose(fp); + + dictable=xmalloc(sizeof(struct dictionary)*i); + + dlines=dicvalread(filename,dictable,i); + + verb_printf(efp,"...done.\n"); + } + +ENV: + envfile=kpse_var_value("INDEXDEFAULTDICTIONARY"); + if ((envfile!=NULL)&&(strlen(envfile)!=0)) { + envfile = KP_find_file(&kp_dict,envfile); + if(kpse_in_name_ok(envfile)) + fp=fopen(envfile,"rb"); + 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 (fgets(buff,255,fp)==NULL) break; + if ((buff[0]=='\r')||(buff[0]=='\n')||(buff[0]=='\0')) i--; + } + fclose(fp); + + envdic=xmalloc(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],buff2[256]; + UChar ubuff[256],ubuff2[256]; + FILE *fp; + + if(kpse_in_name_ok(filename)) + fp=fopen(filename,"rb"); + else { + fprintf(stderr, "upmendex: %s is forbidden to open for reading.\n",filename); + exit(255); + } + for (i=0;i<line;i++) { + if (fgets(buff,255,fp)==NULL) break; + if ((buff[0]=='\r')||(buff[0]=='\n')||(buff[0]=='\0')) { + i--; + continue; + } + for (j=0;((buff[j]==' ')||(buff[j]=='\t'));j++); + for (k=0;((buff[j]!='\r')&&(buff[j]!='\n')&&(buff[j]!=' ')&&(buff[j]!='\t'));j++,k++) { + buff2[k]=buff[j]; + } + buff2[k]='\0'; + if (strlen(buff2)==0) { + i--; + continue; + } + multibyte_to_widechar(ubuff,256,buff2); + dicval[i].dic[0]=u_xstrdup(ubuff); + for (;((buff[j]==' ')||(buff[j]=='\t'));j++); + for (k=0;((buff[j]!='\r')&&(buff[j]!='\n')&&(buff[j]!=' ')&&(buff[j]!='\t'));j++,k++) { + buff2[k]=buff[j]; + } + buff2[k]='\0'; + if (strlen(buff2)==0) { + free(dicval[i].dic[0]); + i--; + continue; + } + multibyte_to_widechar(ubuff,256,buff2); + convert(ubuff,ubuff2); + dicval[i].dic[1]=u_xstrdup(ubuff2); + } + + fclose(fp); + + qsort(dicval,i,sizeof(struct dictionary),dcomp); + return(i); +} + +/* comp-function of dictionary sorting */ +static int dcomp(const void *bf1, const void *bf2) +{ + const struct dictionary *buff1 = (const struct dictionary *) bf1; + const struct dictionary *buff2 = (const struct dictionary *) bf2; + int i; + + for (i=0;i<256;i++) { + if (((*buff1).dic[0][i]==L'\0')&&((*buff2).dic[0][i]==L'\0')) return 0; + else if (((*buff1).dic[0][i]==L'\0')&&((*buff2).dic[0][i]!=L'\0')) return 1; + else if (((*buff1).dic[0][i]!=L'\0')&&((*buff2).dic[0][i]==L'\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(UChar *buff1, UChar *buff2) +{ + int i=0,j=0,k,l; + char errbuff[4096],errbuff2[4096]; + int chr,wclen; + UChar buff3[3]; + + while(1) { + if (buff1[i]==L'\0') { + buff2[j]=L'\0'; + break; + } + else { + wclen = is_surrogate_pair(&buff1[i]) ? 2 : 1; + buff3[0] =buff1[i]; + if (wclen==2) buff3[1] =buff1[i+1]; + buff3[wclen]=L'\0'; + + if ( lorder==1 &&( buff1[i]==' ' || buff1[i]=='\t' || buff3[0]==0x00A0 + || buff3[0]==0x202F || buff3[0]==0x2060 || buff3[0]==0xFEFF )) { + i++; + } + + else if (buff1[i]<0x80) { + buff2[j]=buff1[i]; + i++; + j++; + } + + else if (is_latin(buff3)||is_cyrillic(buff3)||is_greek(buff3) + ||is_jpn_kana(buff3)||is_kor_hngl(buff3)||is_zhuyin(buff3) + ||is_comb_diacritical_mark(buff3)) { + buff2[j]=buff3[0]; + i++; + j+=wclen; + } + + else if (buff1[i]>=0x80) { + if (is_alpha_numeric(buff3[0])) { +/* alpha-numeric,symbols */ + for (k=0;k<u_strlen(symboltable);k++) { + if (buff3[0]==symboltable[k]) { + buff2[j]=k+0x20; + if ((buff2[j]>='a')&&(buff2[j]<='z')) buff2[j]-=32; + i++; + j+=wclen; + break; + } + } + if (k==u_strlen(symboltable)) { + i++; + buff2[j++]=buff3[0]; + } + } + + else { + for (k=0;k<dlines;k++) { +/* dictionary table */ + if (u_strncmp(dictable[k].dic[0],&buff1[i],u_strlen(dictable[k].dic[0]))==0) { + u_strncpy(&buff2[j],dictable[k].dic[1],u_strlen(dictable[k].dic[1])); + i+=u_strlen(dictable[k].dic[0]); + j+=u_strlen(dictable[k].dic[1]); + break; + } + } + if ((k==dlines)&&(elines!=0)) { +/* environment dictionary table */ + for (k=0;k<elines;k++) { + if (u_strncmp(envdic[k].dic[0],&buff1[i],u_strlen(envdic[k].dic[0]))==0) { + u_strncpy(&buff2[j],envdic[k].dic[1],u_strlen(envdic[k].dic[1])); + i+=u_strlen(dictable[k].dic[0]); + j+=u_strlen(envdic[k].dic[1]); + break; + } + } + } + if (((k==dlines)&&(elines==0))||((k==elines)&&(elines!=0))) { + if (is_hanzi(buff3) || force==1) { +/* forced convert */ + buff2[j]=buff3[0]; + if (wclen==2) buff2[j+1]=buff3[1]; + i+=wclen; + j+=wclen; + } + else { + widechar_to_multibyte(errbuff2,4096,&buff1[i]); + sprintf(errbuff,"\nError: %s is no entry in dictionary file ",errbuff2); + 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; +} |