diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/kamal/Expand.c |
Initial commit
Diffstat (limited to 'support/kamal/Expand.c')
-rw-r--r-- | support/kamal/Expand.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/support/kamal/Expand.c b/support/kamal/Expand.c new file mode 100644 index 0000000000..5cca17d37b --- /dev/null +++ b/support/kamal/Expand.c @@ -0,0 +1,165 @@ +/* COPYRIGHT (C) 1987 Kamal Al-Yahya */ + +#include "setups.h" +unsigned int len=0; /* length of document */ + +Expand(fp,buf) /* expand TeX and LaTeX's \input and \include */ + +FILE *fp; +char *buf; +{ +char *buf2; +FILE *fpp; +int c; +int c1=' '; /* previous character */ +char w[MAXWORD]; +int i,j; +extern wflag; + +if (((buf2 = (char *)malloc(MAXLEN*sizeof(char))) == (char *)NULL)) + { + fprintf(stderr,"Expand: Cannot malloc() internal buffer space\n\ +Need an arrays of %d characters\n",MAXLEN); + exit(-1); + } + +while ((c = getc(fp)) != EOF) + { + if (++len >= MAXLEN) + { + fprintf(stderr,"Document is too large\n"); + exit(-1); + } + if (c == '%' || c1 == '%') + { + *buf++ = c; + while ((c =getc(fp)) != EOF) + { + if (++len >= MAXLEN) + { + fprintf(stderr,"Sorry: document is too large\n"); + exit(-1); + } + *buf++=c; + if (c == '\n') break; + } + c1=c; + continue; + } + if (c != '\\') + *buf++ = c; + else /* detect TeX commands (backslash) */ + { + /* see if \input or \include is the control sequence */ + i=0; + c1=c; /* update last character */ + while ((c = getc(fp)) != EOF && i < MAXWORD) + { + if (++len >= MAXLEN) + { + fprintf(stderr,"Document is too large\n"); + exit(-1); + } + if (c == ' ' || c=='\n' || c=='$' || c=='#' || c=='%' + || c=='{' || c=='(' || c==')' || c == '\\') + break; + w[i++] = (char)c; + } + if (strncmp(w,"input",5) == 0 || (strncmp(w,"include",7) == 0 + && strcmp(w,"includeonly") !=0)) + { +/* if it is \input or \include , get the file name */ + i=0; + while ((c=getc(fp)) != EOF && i < MAXWORD) + { + if (c == ' ' || c == '\n' + || c == '\t' || c == '}' || c == '%') + break; + w[i++] = (char)c; + } + w[i] = NULL; + fpp=fopen(w, "r"); /* open the new file */ + if( fpp == NULL ) + { +/* if file is not found, try file.tex */ + strcat(w,".tex"); + fpp=fopen(w, "r"); + if( fpp == NULL ) + { + fprintf(stderr, + "TeXExpand: Cannot open %s\n",w); + buf2[0] = NULL; + } + else + { + if (wflag != 1) + { + fprintf(stderr,"%s:\n",w); + Match(fpp); + fprintf(stderr,"\n"); + fseek(fpp,0,0); + } + Expand(fpp,buf2); + fclose(fpp); + } + } + else + { + if (wflag != 1) + { + fprintf(stderr,"%s:\n",w); + Match(fpp); + fprintf(stderr,"\n"); + fseek(fpp,0,0); + } + Expand(fpp,buf2); + fclose(fpp); + } + strcat(buf,buf2); + buf += strlen(buf2); + w[0] = NULL; + } + else +/* if the control sequence is not \input or \include write it out */ + { +/* if it is \def, \newcommand, or \newenvironment, write the full command */ + if (strncmp(w,"def",3) == 0) + { + i = def_file(fp,&j,0); + fseek(fp,-i,1); + strcat(buf,"\\def\\"); + buf += 5; + for (j=0; j < i; j++) + *buf++=getc(fp); + } + else if (strncmp(w,"newcommand",10) == 0) + { + i = comm_file(fp,&j,0); + fseek(fp,-i,1); + strcat(buf,"\\newcommand{"); + buf += 12; + for (j=0; j < i; j++) + *buf++=getc(fp); + } + else if (strncmp(w,"newenvironment",14)==0) + { + i = getenv_file(fp,&j,0); + fseek(fp,-i,1); + strcat(buf,"\\newenvironment{"); + buf += 16; + for (j=0; j < i; j++) + *buf++=getc(fp); + } + else + { + *buf++='\\'; + for (j=0; j < i; j++) + *buf++ = w[j]; + *buf++ = c; + } + } + } + c1 = c; /* update last character */ + } +*buf = NULL; /* terminate it with a null */ +} |