/* 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 */
}