/* COPYRIGHT (C) 1987 Kamal Al-Yahya */
/* texeqn: TeX equation stripping */

char *documentation[] = {
" SYNTAX",
"        texeqn [-iw] [parameters] [inputfiles]",
"",
"        flags:",
"              -i   ignores TeX's and LaTeX's \input and \include commands",
"              -w   does not check matching",
"",
"        parameters:",
"              in=filename       filename is the input file",
"                                (Default: in=stdin)",
"",
"              out=filename      filename is the output file",
"                                (Default: out=stdout)",
""
};

/* Author: Kamal Al-Yahya, Stanford University,         11/1/83 */
/* Last modified:                                       1/25/87 */

int     doclength = { sizeof documentation/sizeof documentation[0] };

#include     "setups.h"

#ifdef tops20
#define TEMPFILE "texXXXXXX"
#else
#define TEMPFILE "/tmp/texXXXXXX"
#endif

#ifdef MSC
#else
struct sgttyb ttystat;
#endif

extern char *mktemp();
char string[MAXWORD], filename[MAXWORD], scratch_file[MAXWORD];
FILE *out_file;
int wflag;
int xargc;
char **xargv;

main(argc,argv)
int argc;
char *argv[];
{
char *buf;
FILE *temp,*scr;
register char *cptr;
int piped_in;
int iflag,i;

if (((buf = (char *)malloc(MAXLEN*sizeof(char))) == (char *)NULL))
       {
       fprintf(stderr,"texmatch: Cannot malloc() internal buffer space\n\
Need an arrays of %d characters\n",MAXLEN);
       exit(-1);
       }

/* If no arguments, and not in a pipeline, self document */
#ifdef MSC      /* MS-DOS cannot distinguish piped input from no input */
piped_in = (argc == 1);
#else
piped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat);
#endif
if (argc == 1 && !piped_in)
       {
       for( i=0; i<doclength; i++)
               printf("%s\n",documentation[i]);
       exit (0);
       }

out_file=stdout;                        /* default standard output */

/* process option flags */
xargc = argc;
xargv = argv;
for (xargc--,xargv++; xargc; xargc--,xargv++)
       {
       cptr = *xargv;
       if( *cptr=='-' )
               {
               while( *(++cptr))
                       {
                       switch( *cptr )
                               {
                               case 'i':
                                       iflag=1;
                                       break;
                               case 'w':
                                       wflag=1;
                                       break;
                               default:
                                       fprintf(stderr,
                                               "texeqn: unknown flag -%c\n",*cptr);
                                       break;
                               }
                       }
               }
       }

/* process getpar parameters */
xargc = argc;
xargv = argv;

if(getpar_("out","s",string))
       {
       sscanf(string,"%s",filename);
       if((temp=fopen(filename,"w")) == NULL)
               fprintf(stderr,"texeqn: Cannot open output file %s\n",filename);
       else
               out_file = temp;
       }

/* first process pipe input */
if(piped_in)
       {
/* need to buffer; can't seek in pipes */
/* make a temporary and volatile file in /tmp */
       strcpy(scratch_file,TEMPFILE);
       mktemp(scratch_file);
       if ((scr=fopen(scratch_file,"w")) == (FILE *)NULL)
               {
               fprintf(stderr,
               "texmatch: Cannot open scratch file [%s]\n",scratch_file);
               exit(-1);
               }
       scrbuf(stdin,scr);
       fclose(scr);
       scr=fopen(scratch_file,"r");
       unlink(scratch_file);
       if (wflag != 1)
               {
               fprintf(stderr,"Checking matching...\n");
               Match(scr);
               fseek(scr,0,0);
               }
/* either expand or buffer */
       if (iflag != 1)
               { Expand(scr,buf);      fclose(scr); }
       else
               { tmpbuf(scr,buf);      fclose(scr); }
       if (wflag != 1)
               fprintf(stderr,"Checking matching done\n");
       Eqn(buf,out_file);
       fclose(scr);
       }

/* next process in=inputfiles */
if(getpar_("in","s",string))
       {
       sscanf(string,"%s",filename);
       if((temp=fopen(filename,"r")) != NULL)
               {
               if (wflag != 1)
                       {
                       fprintf(stderr,"Checking matching...\n");
                       fprintf(stderr,"%s:\n",filename);
                       Match(temp);
                       fprintf(stderr,"\n");
                       fseek(temp,0,0);
                       }
/* either expand or buffer */
               if (iflag != 1)
                       { Expand(temp,buf);     fclose(temp); }
               else
                       { tmpbuf(temp,buf);     fclose(temp); }
               if (wflag != 1)
                       fprintf(stderr,"Checking matching done\n\n");
               Eqn(buf,out_file);
               fclose(temp);
               }
               else
                       fprintf(stderr,"texeqn: Cannot open %s\n",filename);
       }

/* then process input line for arguments and assume they are input files */
for (xargc--,xargv++; xargc; xargc--,xargv++)
       {
       cptr = *xargv;
       if( *cptr=='-' ) continue;              /* this is a flag */
       while (*cptr)
               {
               if (*cptr == '=')  break; /* this is for getpar */
               cptr++;
               }
       if (*cptr)  continue;
       cptr = *xargv;
       if((temp=fopen(cptr,"r")) != (FILE *)NULL)
               {
               if (wflag != 1)
                       {
                       fprintf(stderr,"Checking matching...\n");
                       fprintf(stderr,"%s:\n",cptr);
                       Match(temp);
                       fprintf(stderr,"\n");
                       fseek(temp,0,0);
                       }
/* either expand or buffer */
               if (iflag != 1)
                       { Expand(temp,buf);     fclose(temp); }
               else
                       { tmpbuf(temp,buf);     fclose(temp); }
               if (wflag != 1)
                       fprintf(stderr,"Checking matching done\n\n");
               Eqn(buf,out_file);
               fclose(temp);
               }
       else
               fprintf(stderr,"texeqn: Cannot open %s\n",cptr);
       }

}