#include #include #include #include #include #include #include #include "mendex.h" #include "exkana.h" #include "exvar.h" int line_length=0; static void printpage(struct index *ind, FILE *fp, int num, char *lbuff); static int range_check(struct index ind, int count, char *lbuff); static void linecheck(char *lbuff, char *tmpbuff); static void crcheck(char *lbuff, FILE *fp); #define TAIL(x) (x+strlen(x)) /* if we don't have vsnprintf() */ /* #define vsnprintf(buff,len,format,argptr) vsprintf(buff,format,argptr) */ /* fprintf with convert kanji code */ int fprintf2(FILE *fp, const char *format, ...) { char print_buff[8000]; va_list argptr; int n; va_start(argptr, format); n = vsnprintf(print_buff, sizeof print_buff, format, argptr); va_end(argptr); fputs(print_buff, fp); return n; } int warn_printf(FILE *fp, const char *format, ...) { char print_buff[8000]; va_list argptr; int n; va_start(argptr, format); n = vsnprintf(print_buff, sizeof print_buff, format, argptr); va_end(argptr); warn++; fputs(print_buff, stderr); if (fp!=stderr) fputs(print_buff, fp); return n; } int verb_printf(FILE *fp, const char *format, ...) { char print_buff[8000]; va_list argptr; int n; va_start(argptr, format); n = vsnprintf(print_buff, sizeof print_buff, format, argptr); va_end(argptr); if (verb!=0) fputs(print_buff, stderr); if (fp!=stderr) fputs(print_buff, fp); return n; } /* write ind file */ void indwrite(char *filename, struct index *ind, int pagenum) { int i,j,hpoint=0; unsigned char datama[256],lbuff[4096]; FILE *fp; if (filename[0]!='\0' && kpse_out_name_ok(filename)) fp=fopen(filename,"w"); else fp=stdout; convert(atama,datama); fputs(preamble,fp); if (fpage>0) { fprintf(fp,"%s%d%s",setpage_prefix,pagenum,setpage_suffix); } for (i=line_length=0;i0) { fprintf(fp,"%s%s%s",lethead_prefix,symhead_positive,lethead_suffix); } else if (lethead_flag<0) { fprintf(fp,"%s%s%s",lethead_prefix,symhead_negative,lethead_suffix); } } sprintf(lbuff,"%s%s",item_0,ind[i].idx[0]); } else if (alphabet(ind[i].dic[0][0])) { if (lethead_flag>0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0],lethead_suffix); } else if (lethead_flag<0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0]+32,lethead_suffix); } sprintf(lbuff,"%s%s",item_0,ind[i].idx[0]); } else if (japanese(ind[i].dic[0])) { if (lethead_flag) { fputs(lethead_prefix,fp); for (j=hpoint;j<(strlen(datama)/2);j++) { if (ind[i].dic[0][1]0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0],lethead_suffix); } else if (lethead_flag<0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0]+32,lethead_suffix); } } } else if (japanese(ind[i].dic[0])) { for (j=hpoint;j<(strlen(datama)/2);j++) { if ((ind[i].dic[0][0]<=datama[j*2])&&(ind[i].dic[0][1]=0)&&(strncmp(ind[i-1].dic[0],ind[i].dic[0],2)!=0)) { fputs(group_skip,fp); if (lethead_flag!=0) { fputs(lethead_prefix,fp); fprintf(fp,"%c%c",ind[i].dic[0][0],ind[i].dic[0][1]); fputs(lethead_suffix,fp); } } } switch (ind[i].words) { case 1: sprintf(TAIL(lbuff),"%s%s%s",item_0,ind[i].idx[0],delim_0); break; case 2: if (strcmp(ind[i-1].idx[0],ind[i].idx[0])!=0 || strcmp(ind[i-1].dic[0],ind[i].dic[0])!=0) { sprintf(TAIL(lbuff),"%s%s%s",item_0,ind[i].idx[0],item_x1); } else { if (ind[i-1].words==1) { sprintf(TAIL(lbuff),"%s",item_01); } else { sprintf(TAIL(lbuff),"%s",item_1); } } sprintf(TAIL(lbuff),"%s",ind[i].idx[1]); sprintf(TAIL(lbuff),"%s",delim_1); break; case 3: if (strcmp(ind[i-1].idx[0],ind[i].idx[0])!=0 || strcmp(ind[i-1].dic[0],ind[i].dic[0])!=0) { sprintf(TAIL(lbuff),"%s%s",item_0,ind[i].idx[0]); sprintf(TAIL(lbuff),"%s%s%s",item_x1,ind[i].idx[1],item_x2); } else if (ind[i-1].words==1) { sprintf(TAIL(lbuff),"%s%s%s",item_01,ind[i].idx[1],item_x2); } else if (strcmp(ind[i-1].idx[1],ind[i].idx[1])!=0 || strcmp(ind[i-1].dic[1],ind[i].dic[1])!=0) { if (ind[i-1].words==2) sprintf(TAIL(lbuff),"%s%s%s",item_1,ind[i].idx[1],item_12); else sprintf(TAIL(lbuff),"%s%s%s",item_1,ind[i].idx[1],item_x2); } else { sprintf(TAIL(lbuff),"%s",item_2); } sprintf(TAIL(lbuff),"%s%s",ind[i].idx[2],delim_2); break; default: break; } printpage(ind,fp,i,lbuff); } } fputs(postamble,fp); if (filename[0]!='\0') fclose(fp); } /* write page block */ static void printpage(struct index *ind, FILE *fp, int num, char *lbuff) { int i,j,k,cc; char buff[4096],tmpbuff[4096],errbuff[4096]; buff[0]=tmpbuff[0]='\0'; crcheck(lbuff,fp); line_length=strlen(lbuff); for(j=0;jj) { if (pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0])==pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])) { j=cc-1; continue; } /* range process */ if (ind[num].p[j].enc[0]==range_open || ind[num].p[j].enc[0]==range_close) ind[num].p[j].enc++; if (strlen(ind[num].p[j].enc)>0) { sprintf(buff,"%s%s%s",encap_prefix,ind[num].p[j].enc,encap_infix); } if (strlen(suffix_3p)>0 && (pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])-pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0]))==2) { sprintf(TAIL(buff),"%s%s",ind[num].p[j].page,suffix_3p); } else if (strlen(suffix_mp)>0 && (pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])-pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0]))>=2) { sprintf(TAIL(buff),"%s%s",ind[num].p[j].page,suffix_mp); } else if (strlen(suffix_2p)>0 && (pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])-pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0]))==1) { sprintf(TAIL(buff),"%s%s",ind[num].p[j].page,suffix_2p); } else { sprintf(TAIL(buff),"%s%s",ind[num].p[j].page,delim_r); sprintf(TAIL(buff),"%s",ind[num].p[cc].page); } sprintf(TAIL(tmpbuff),"%s",buff); buff[0]='\0'; if (strlen(ind[num].p[j].enc)>0) { sprintf(TAIL(tmpbuff),"%s",encap_suffix); } linecheck(lbuff,tmpbuff); j=cc; if (j==ind[num].num) { goto PRINT; } else { sprintf(TAIL(tmpbuff),"%s",delim_n); linecheck(lbuff,tmpbuff); } } else if (strlen(ind[num].p[j].enc)>0) { /* normal encap */ if (ind[num].p[j].enc[0]==range_close) { sprintf(errbuff,"Warning: Unmatched range closing operator \'%c\',",range_close); for (i=0;i0) { sprintf(TAIL(tmpbuff),"%s%s%s",encap_prefix,ind[num].p[j].enc,encap_infix); sprintf(TAIL(tmpbuff),"%s%s%s",ind[num].p[j].page,encap_suffix,delim_n); linecheck(lbuff,tmpbuff); } else { sprintf(TAIL(tmpbuff),"%s%s",ind[num].p[j].page,delim_n); linecheck(lbuff,tmpbuff); } } else { /* no encap */ sprintf(TAIL(tmpbuff),"%s%s",ind[num].p[j].page,delim_n); linecheck(lbuff,tmpbuff); } } if (ind[num].p[j].enc[0]==range_open) { sprintf(errbuff,"Warning: Unmatched range opening operator \'%c\',",range_open); for (k=0;k0) { sprintf(TAIL(tmpbuff),"%s%s%s",encap_prefix,ind[num].p[j].enc,encap_infix); sprintf(TAIL(tmpbuff),"%s%s",ind[num].p[j].page,encap_suffix); } else { sprintf(TAIL(tmpbuff),"%s",ind[num].p[j].page); } linecheck(lbuff,tmpbuff); PRINT: fputs(lbuff,fp); fputs(delim_t,fp); lbuff[0]='\0'; } static int range_check(struct index ind, int count, char *lbuff) { int i,j,k,cc1,cc2,start,force=0; char tmpbuff[4096],errbuff[4096]; for (i=count;i0) { sprintf(tmpbuff,"%s%s%s",encap_prefix,ind.p[j].enc,encap_infix); sprintf(tmpbuff,"%s%s%s",ind.p[j].page,encap_suffix,delim_n); linecheck(lbuff,tmpbuff); } } } if (j==ind.num+1) { sprintf(errbuff,"Warning: Unmatched range opening operator \'%c\',",range_open); for (k=0;k=cc2+2 || (cc1>=cc2+1 && strlen(suffix_2p)) || force) { return i-1; } else return count; } /* check line length */ static void linecheck(char *lbuff, char *tmpbuff) { if (line_length+strlen(tmpbuff)>line_max) { sprintf(TAIL(lbuff),"\n%s%s",indent_space,tmpbuff); line_length=indent_length+strlen(tmpbuff); tmpbuff[0]='\0'; } else { sprintf(TAIL(lbuff),"%s",tmpbuff); line_length+=strlen(tmpbuff); tmpbuff[0]='\0'; } } static void crcheck(char *lbuff, FILE *fp) { int i; char buff[4096]; for (i=strlen(lbuff);i>=0;i--) { if (lbuff[i]=='\n') { strncpy(buff,lbuff,i+1); buff[i+1]='\0'; fputs(buff,fp); strcpy(buff,&lbuff[i+1]); strcpy(lbuff,buff); break; } } }