home *** CD-ROM | disk | FTP | other *** search
- /* 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 */
- }
-