/*
* texproc: embedded command preprocessor for TeX and LaTeX
* (c) 1992 Dougal Scott
* Any comments, criticisms, patches to
* [email protected]
*
* Convert LaTeX:
* ....
* %# gnuplot
* plot sin, cos, and tan
* %#
* ....
*
* to
*
* ....
* \begin{picture}
* \lotsadots
* \end{picture}
* ....
*
* Makefile commands:
*
* CAT=/bin/cat
* PROC=texproc
*
* .SUFFIXES:.zd .tex
*
* .zd.tex:
*      $(CAT) $< | $(PROC) > $*.tex
*
*/

#define TRACE(x)        /* x */

#include <stdio.h>
#include <strings.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>

extern int errno;
FILE *tmp;

main(argc,argv)
int argc;
char **argv;
{
char buff[BUFSIZ];

while(gets(buff)!=NULL) {
          if(buff[0]=='%' && buff[1]=='#')
                  process(buff);
          else
                  fprintf(stdout,"%s\n",buff);
          }
return(0);
}

process(buff)
char *buff;
{
char    tmpname[80],            /* Name of tmp file */
                  progname[80],                /* Name of program to execute */
                  cmdline[80],         /* What to feed to popen */
                  outbuff[BUFSIZ];     /* What to take output of prgram from */
FILE    *p;

strcpy(tmpname,"/tmp/PrcXXXXXX");
mktemp(tmpname);
if((tmp=fopen(tmpname,"w"))==NULL) {
          fprintf(stderr,"Could not open %s for writing\n",tmpname);
          fprintf(stderr,"Program aborting\n");
          exit(-1);
          }
TRACE(fprintf(stderr,"Saving to tmp file %s\n",tmpname));
strcpy(progname,&buff[3]);
fprintf(stdout,"%% Including output from %s\n",progname);
/* Put buffer to file for executing */
while(gets(buff)!=NULL) {
          if(buff[0]=='%' && buff[1]=='#') {
                  fclose(tmp);
                  sprintf(cmdline,"%s %s",progname,tmpname);
                  fprintf(stderr,"%s\n",progname);
                  if((p=popen(cmdline,"r"))==NULL) {
                          fprintf(stderr,"Could not open pipe to %s\n",cmdline);
                          exit(-1);
                          }
                  while(fgets(outbuff,BUFSIZ,p)!=NULL)
                          fprintf(stdout,"%s",outbuff);
                  pclose(p);
                  unlink(tmpname);
                  return(0);
                  }
          else {
                  TRACE(fprintf(stderr,"%s\n",buff));
                  fprintf(tmp,"%s\n",buff);
                  }
          }
}