summaryrefslogtreecommitdiff
path: root/Build/source/texk/mendexk/fwrite.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2010-04-11 00:28:06 +0000
committerKarl Berry <karl@freefriends.org>2010-04-11 00:28:06 +0000
commit001b7975ce276ec6e72bf2b317cef8afe92c2948 (patch)
tree3c73cdd11c93462911cb416a231af743f48d5368 /Build/source/texk/mendexk/fwrite.c
parent22d2dd3a9e8cc227f8d51b2fe8cf1734c2844959 (diff)
add ptex from Akira, Norbert, and jTeX group; ptex not actually built by default yet
git-svn-id: svn://tug.org/texlive/trunk@17797 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/mendexk/fwrite.c')
-rw-r--r--Build/source/texk/mendexk/fwrite.c454
1 files changed, 454 insertions, 0 deletions
diff --git a/Build/source/texk/mendexk/fwrite.c b/Build/source/texk/mendexk/fwrite.c
new file mode 100644
index 00000000000..aac5e7528e8
--- /dev/null
+++ b/Build/source/texk/mendexk/fwrite.c
@@ -0,0 +1,454 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include <kpathsea/config.h>
+#include <ptexenc/ptexenc.h>
+#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') 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;i<lines;i++) {
+ if (i==0) {
+ if (!((alphabet(ind[i].dic[0][0]))||(japanese(ind[i].dic[0])))) {
+ if (lethead_flag) {
+ if (symbol_flag && strlen(symbol)) {
+ fprintf(fp,"%s%s%s",lethead_prefix,symbol,lethead_suffix);
+ }
+ else if (lethead_flag>0) {
+ 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]<datama[j*2+1]) {
+ fprintf(fp,"%c%c",atama[(j-1)*2],atama[(j-1)*2+1]);
+ hpoint=j;
+ break;
+ }
+ }
+ if (j==(strlen(datama)/2)) {
+ fprintf(fp,"%c%c",atama[(j-1)*2],atama[(j-1)*2+1]);
+ }
+ fputs(lethead_suffix,fp);
+ }
+ sprintf(lbuff,"%s%s",item_0,ind[i].idx[0]);
+ for (hpoint=0;hpoint<(strlen(datama)/2);hpoint++) {
+ if (ind[i].dic[0][1]<datama[hpoint*2+1]) {
+ break;
+ }
+ }
+ }
+ switch (ind[i].words) {
+ case 1:
+ sprintf(TAIL(lbuff),"%s",delim_0);
+ break;
+
+ case 2:
+ sprintf(TAIL(lbuff),"%s%s",item_x1,ind[i].idx[1]);
+ sprintf(TAIL(lbuff),"%s",delim_1);
+ break;
+
+ case 3:
+ sprintf(TAIL(lbuff),"%s%s",item_x1,ind[i].idx[1]);
+ sprintf(TAIL(lbuff),"%s%s",item_x2,ind[i].idx[2]);
+ sprintf(TAIL(lbuff),"%s",delim_2);
+ break;
+
+ default:
+ break;
+ }
+ printpage(ind,fp,i,lbuff);
+ }
+ else {
+ if (!((alphabet(ind[i].dic[0][0]))||(japanese(ind[i].dic[0])))) {
+ if ((alphabet(ind[i-1].dic[0][0]))||(japanese(ind[i-1].dic[0]))){
+ fputs(group_skip,fp);
+ if (lethead_flag && symbol_flag) {
+ fprintf(fp,"%s%s%s",lethead_prefix,symbol,lethead_suffix);
+ }
+ }
+ }
+ else if (alphabet(ind[i].dic[0][0])) {
+ if (ind[i].dic[0][0]!=ind[i-1].dic[0][0]) {
+ fputs(group_skip,fp);
+ 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);
+ }
+ }
+ }
+ 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]<datama[j*2+1])) {
+ break;
+ }
+ }
+ if ((j!=hpoint)||(j==0)) {
+ hpoint=j;
+ fputs(group_skip,fp);
+ if (lethead_flag!=0) {
+ fputs(lethead_prefix,fp);
+ fprintf(fp,"%c%c",atama[(j-1)*2],atama[(j-1)*2+1]);
+ fputs(lethead_suffix,fp);
+ }
+ }
+
+ else if ((strncmp(ind[i].dic[0],HIRAEND,2)>=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;j<ind[num].num;j++) {
+ cc=range_check(ind[num],j,lbuff);
+ if (cc>j) {
+ 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;i<ind[num].words;i++) sprintf(TAIL(errbuff),"%s.",ind[num].idx[i]);
+ warn_printf(efp, "%s\n", errbuff);
+ ind[num].p[j].enc++;
+ }
+ if (strlen(ind[num].p[j].enc)>0) {
+ 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;k<ind[num].words;k++) sprintf(TAIL(errbuff),"%s.",ind[num].idx[k]);
+ warn_printf(efp, "%s\n", errbuff);
+ ind[num].p[j].enc++;
+ }
+ else if (ind[num].p[j].enc[0]==range_close) {
+ sprintf(errbuff,"Warning: Unmatched range closing operator \'%c\',",range_close);
+ for (k=0;k<ind[num].words;k++) sprintf(TAIL(errbuff),"%s.",ind[num].idx[k]);
+ warn_printf(efp, "%s\n", errbuff);
+ ind[num].p[j].enc++;
+ }
+ if (strlen(ind[num].p[j].enc)>0) {
+ 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;i<ind.num+1;i++) {
+ if (ind.p[i].enc[0]==range_close) {
+ sprintf(errbuff,"Warning: Unmatched range closing operator \'%c\',",range_close);
+ sprintf(TAIL(errbuff),"%s.",ind.idx[0]);
+ warn_printf(efp, "%s\n", errbuff);
+ ind.p[i].enc++;
+ }
+ if (ind.p[i].enc[0]==range_open) {
+ start=i;
+ ind.p[i].enc++;
+ for (j=i;j<ind.num+1;j++) {
+ if (strcmp(ind.p[start].enc,ind.p[j].enc)) {
+ if (ind.p[j].enc[0]==range_close) {
+ ind.p[j].enc++;
+ ind.p[j].enc[0]='\0';
+ force=1;
+ break;
+ }
+ else if (j!=i && ind.p[j].enc[0]==range_open) {
+ sprintf(errbuff,"Warning: Unmatched range opening operator \'%c\',",range_open);
+ for (k=0;k<ind.words;k++) sprintf(TAIL(errbuff),"%s.",ind.idx[k]);
+ warn_printf(efp, "%s\n", errbuff);
+ ind.p[j].enc++;
+ }
+ if (strlen(ind.p[j].enc)>0) {
+ 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<ind.words;k++) sprintf(TAIL(errbuff),"%s.",ind.idx[k]);
+ warn_printf(efp, "%s\n", errbuff);
+ }
+ i=j-1;
+ }
+ else if (prange && i<ind.num) {
+ if (chkcontinue(ind.p,i)
+ && (!strcmp(ind.p[i].enc,ind.p[i+1].enc)
+ || ind.p[i+1].enc[0]==range_open))
+ continue;
+ else {
+ i++;
+ break;
+ }
+ }
+ else {
+ i++;
+ break;
+ }
+ }
+ cc1=pnumconv(ind.p[i-1].page,ind.p[i-1].attr[0]);
+ cc2=pnumconv(ind.p[count].page,ind.p[count].attr[0]);
+ if (cc1>=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;
+ }
+ }
+}