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/styfile.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/styfile.c')
-rw-r--r-- | Build/source/texk/upmendex/styfile.c | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/Build/source/texk/upmendex/styfile.c b/Build/source/texk/upmendex/styfile.c new file mode 100644 index 00000000000..25e100fb6df --- /dev/null +++ b/Build/source/texk/upmendex/styfile.c @@ -0,0 +1,343 @@ +#include "mendex.h" + +#include <kpathsea/tex-file.h> + +#include "exvar.h" + +#include "kp.h" + +FILE *fp; +static char icu_attr_str[STYBUFSIZE]; + +static void convline(char *buff1, int start, char *buff2); +static int scompare(char *buff1, const char *buff2); +static int getparam(char *buff, const char *paraname, char *param); +static int getparachar(char *buff, const char *paraname, char *param); +static size_t sstrlen(const char *buff); +static int sstrcmp(const char *s1, const char *s2); +static int sstrncmp(const char *s1, const char *s2, size_t len); +static int escape_mode=0; + +static char * +bfgets (char *buf, int size, FILE *fp) +{ + char *p, *q; + p = fgets (buf, size, fp); + for (q = buf; *q; q++) { + if(*q == '\r') { + *q++ = '\n'; + *q = '\0'; + break; + } + } + return p; +} +#define fgets bfgets + +/* read style file */ +void styread(const char *filename) +{ + int i,cc; + char buff[4096],tmp[4096]; + + filename = KP_find_file(&kp_ist,filename); + if(kpse_in_name_ok(filename)) + fp=fopen(filename,"rb"); + else + fp=NULL; + if (fp==NULL) { + fprintf(stderr,"%s does not exist.\n",filename); + exit(0); + } + + for (i=0;;i++) { + if (fgets(buff,4095,fp)==NULL) break; + if (getparam(buff,"keyword",keyword)) continue; + if (getparachar(buff,"arg_open",&arg_open)) continue; + if (getparachar(buff,"arg_close",&arg_close)) continue; + if (getparachar(buff,"range_open",&range_open)) continue; + if (getparachar(buff,"range_close",&range_close)) continue; + if (getparachar(buff,"level",&level)) continue; + if (getparachar(buff,"actual",&actual)) continue; + if (getparachar(buff,"encap",&encap)) continue; + if (getparachar(buff,"quote","e)) continue; + if (getparachar(buff,"escape",&escape)) continue; + if (getparam(buff,"preamble",preamble)) continue; + if (getparam(buff,"postamble",postamble)) continue; + if (getparam(buff,"group_skip",group_skip)) continue; + if (getparam(buff,"lethead_prefix",lethead_prefix)) continue; + if (getparam(buff,"heading_prefix",lethead_prefix)) continue; + if (getparam(buff,"lethead_suffix",lethead_suffix)) continue; + if (getparam(buff,"heading_suffix",lethead_suffix)) continue; + if (getparam(buff,"symhead_positive",symhead_positive)) continue; + if (getparam(buff,"symhead_negative",symhead_negative)) continue; + if (getparam(buff,"numhead_positive",numhead_positive)) continue; + if (getparam(buff,"numhead_negative",numhead_negative)) continue; + cc=scompare(buff,"lethead_flag"); + if (cc!= -1) { + lethead_flag=atoi(&buff[cc]); + continue; + } + cc=scompare(buff,"heading_flag"); + if (cc!= -1) { + lethead_flag=atoi(&buff[cc]); + continue; + } + cc=scompare(buff,"priority"); + if (cc!= -1) { + priority=atoi(&buff[cc]); + continue; + } + if (getparam(buff,"item_0",item_0)) continue; + if (getparam(buff,"item_1",item_1)) continue; + if (getparam(buff,"item_2",item_2)) continue; + if (getparam(buff,"item_2",item_2)) continue; + if (getparam(buff,"item_01",item_01)) continue; + if (getparam(buff,"item_x1",item_x1)) continue; + if (getparam(buff,"item_12",item_12)) continue; + if (getparam(buff,"item_x2",item_x2)) continue; + if (getparam(buff,"delim_0",delim_0)) continue; + if (getparam(buff,"delim_1",delim_1)) continue; + if (getparam(buff,"delim_2",delim_2)) continue; + if (getparam(buff,"delim_n",delim_n)) continue; + if (getparam(buff,"delim_r",delim_r)) continue; + if (getparam(buff,"delim_t",delim_t)) continue; + if (getparam(buff,"suffix_2p",suffix_2p)) continue; + if (getparam(buff,"suffix_3p",suffix_3p)) continue; + if (getparam(buff,"suffix_mp",suffix_mp)) continue; + if (getparam(buff,"encap_prefix",encap_prefix)) continue; + if (getparam(buff,"encap_infix",encap_infix)) continue; + if (getparam(buff,"encap_suffix",encap_suffix)) continue; + cc=scompare(buff,"line_max"); + if (cc!= -1) { + line_max=atoi(&buff[cc]); + continue; + } + if (getparam(buff,"indent_space",indent_space)) continue; + cc=scompare(buff,"indent_length"); + if (cc!= -1) { + indent_length=atoi(&buff[cc]); + continue; + } + if (getparam(buff,"symbol",symbol)) continue; + cc=scompare(buff,"symbol_flag"); + if (cc!= -1) { + symbol_flag=atoi(&buff[cc]); + continue; + } + cc=scompare(buff,"letter_head"); + if (cc!= -1) { + letter_head=atoi(&buff[cc]); + continue; + } + if (getparam(buff,"atama",tmp)) { + multibyte_to_widechar(atama,STYBUFSIZE,tmp); + continue; + } + if (getparam(buff,"tumunja",tmp)) { + multibyte_to_widechar(tumunja,STYBUFSIZE,tmp); + continue; + } + if (getparam(buff,"hanzi_head",tmp)) { + multibyte_to_widechar(hanzi_head,STYBUFSIZE,tmp); + continue; + } + if (getparam(buff,"page_compositor",page_compositor)) continue; + if (getparam(buff,"page_precedence",page_precedence)) continue; + if (getparam(buff,"character_order",character_order)) continue; + if (getparam(buff,"icu_locale", icu_locale )) continue; + cc=scompare(buff,"icu_rules"); + if (cc!= -1) { + escape_mode=1; + getparam(buff,"icu_rules",icu_rules); + escape_mode=0; + continue; + } + if (getparam(buff,"icu_attributes", icu_attr_str )) continue; + } + fclose(fp); +} + +/* analize string parameter of style file */ +static void convline(char *buff1, int start, char *buff2) +{ + int i,j,cc; + + for (i=start,j=cc=0;;i++) { + if (buff1[i]=='\"') { + if (cc==0) { + cc=1; + } + else { + buff2[j]='\0'; + break; + } + } + else if ((buff1[i]=='\n')||(buff1[i]=='\0')) { + + if (cc==1) { + buff2[j++]='\n'; + } + if (fgets(buff1,4095,fp)==NULL) { + buff2[j]='\0'; + break; + } + i= -1; + } + else if (cc==1) { + if ((unsigned char)buff1[i]>0x80) { + int len = multibytelen((unsigned char)buff1[i]); + if (len<0) { + verb_printf(efp,"\nWarning: Illegal input of lead byte 0x%x in UTF-8.", (unsigned char)buff1[i]); + continue; + } + while(len--) { + buff2[j++]=buff1[i++]; + } + i--; + continue; + } + else if (buff1[i]=='\\' && !escape_mode) { + i++; + if (buff1[i]=='\\') buff2[j]='\\'; + else if (buff1[i]=='n') buff2[j]='\n'; + else if (buff1[i]=='t') buff2[j]='\t'; + else if (buff1[i]=='r') buff2[j]='\r'; + else if (buff1[i]=='\"') buff2[j]='\"'; + } + else buff2[j]=buff1[i]; + j++; + } + } +} + +/* compare strings */ +static int scompare(char *buff1, const char *buff2) +{ + int i; + + if (sstrlen(buff1) == sstrlen(buff2)) { + if (sstrcmp(buff1,buff2) == 0) { + if (fgets(buff1,4095,fp)==NULL) return -1; + return 0; + } + return -1; + } + for (i=0;i<sstrlen(buff1)-sstrlen(buff2);i++) { + if (buff1[i]==' ' || buff1[i]=='\t') { + continue; + } + else if ((sstrncmp(&buff1[i],buff2,sstrlen(buff2))==0) + &&((buff1[i+strlen(buff2)]==' ')||(buff1[i+strlen(buff2)]=='\t')||(buff1[i+strlen(buff2)]=='\n'))) { + return i+strlen(buff2); + } + else return -1; + } + return -1; +} + +/* get string of style patameter */ +static int getparam(char *buff, const char *paraname, char *param) +{ + int cc; + + cc=scompare(buff,paraname); + if (cc!=-1) { + convline(buff,cc,param); + return 1; + } + return 0; +} + +/* get character of style parameter */ +static int getparachar(char *buff, const char *paraname, char *param) +{ + int j,cc; + + cc=scompare(buff,paraname); + if (cc!=-1) { + for (j=cc;j<strlen(buff);j++) { + if (buff[j]=='\'') { + (*param)=buff[j+1]; + break; + } + else if (buff[j]=='\n') { + if (fgets(buff,4095,fp)==NULL) { + break; + } + else j= -1; + } + } + return 1; + } + return 0; +} + +static size_t sstrlen(const char *s) +{ + if (s == NULL) return 0; + return strlen(s); +} + +static int sstrcmp(const char *s1, const char *s2) +{ + if (s1 == NULL) return -1; + if (s2 == NULL) return 1; + return strcmp(s1, s2); +} + +static int sstrncmp(const char *s1, const char *s2, size_t len) +{ + if (s1 == NULL) return -1; + if (s2 == NULL) return 1; + return strncmp(s1, s2, len); +} + +void set_icu_attributes() +{ + int i,attr; + char *pos, *tmp; + + for (i=0;i<UCOL_ATTRIBUTE_COUNT;i++) icu_attributes[i]=UCOL_DEFAULT; + tmp=icu_attr_str; + if (pos=strstr(tmp,"alternate:")) { + pos+=10; attr=UCOL_ALTERNATE_HANDLING; + if (strstr(pos,"shifted")) icu_attributes[attr]=UCOL_SHIFTED; + else if (strstr(pos,"non-ignorable")) icu_attributes[attr]=UCOL_NON_IGNORABLE; + else verb_printf(efp,"\nWarning: Illegal input for icu_attributes (alternate)."); + } + if (pos=strstr(tmp,"strength:")) { + pos+=9; attr=UCOL_STRENGTH; + if (strstr(pos,"primary")) icu_attributes[attr]=UCOL_PRIMARY; + else if (strstr(pos,"secondary")) icu_attributes[attr]=UCOL_SECONDARY; + else if (strstr(pos,"tertiary")) icu_attributes[attr]=UCOL_TERTIARY; + else if (strstr(pos,"quaternary")) icu_attributes[attr]=UCOL_QUATERNARY; + else if (strstr(pos,"identical")) icu_attributes[attr]=UCOL_IDENTICAL; + else verb_printf(efp,"\nWarning: Illegal input for icu_attributes (strength)."); + } + if (pos=strstr(tmp,"french-collation:")) { + pos+=17; attr=UCOL_FRENCH_COLLATION; + if (strstr(pos,"on")) icu_attributes[attr]=UCOL_ON; + else if (strstr(pos,"off")) icu_attributes[attr]=UCOL_OFF; + else verb_printf(efp,"\nWarning: Illegal input for icu_attributes (french-collation)."); + } + if (pos=strstr(tmp,"case-first:")) { + pos+=11; attr=UCOL_CASE_FIRST; + if (strstr(pos,"off")) icu_attributes[attr]=UCOL_OFF; + else if (strstr(pos,"upper-first")) icu_attributes[attr]=UCOL_UPPER_FIRST; + else if (strstr(pos,"lower-first")) icu_attributes[attr]=UCOL_LOWER_FIRST; + else verb_printf(efp,"\nWarning: Illegal input for icu_attributes (case-first)."); + } + if (pos=strstr(tmp,"case-level:")) { + pos+=11; attr=UCOL_CASE_LEVEL; + if (strstr(pos,"on")) icu_attributes[attr]=UCOL_ON; + else if (strstr(pos,"off")) icu_attributes[attr]=UCOL_OFF; + else verb_printf(efp,"\nWarning: Illegal input for icu_attributes (case-level)."); + } + if (pos=strstr(tmp,"normalization-mode:")) { + pos+=19; attr=UCOL_NORMALIZATION_MODE; + if (strstr(pos,"on")) icu_attributes[attr]=UCOL_ON; + else if (strstr(pos,"off")) icu_attributes[attr]=UCOL_OFF; + else verb_printf(efp,"\nWarning: Illegal input for icu_attributes (normalization-mode)."); + } +} |