|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 4818 (0x12d2)
Types: TextFile
Names: »detex1.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/textools/detex1.c«
/* detex: strips TeX's and LaTeX's commands */
/* to compile: cc detex.c -o detex */
char *documentation[] = {
" SYNTAX",
" detex [-i] file1 [file2 .....]",
" or detex [-i] < file1 [file2 ....]",
"",
"See the manual page for more details.",
"",
" Flag:",
" -i: ignores TeX's and LaTeX's \input and \include commands",
" -w: matching is not checked",
"",
};
/* Author: Kamal Al-Yahya, Stanford University, 11/1/83 */
/* Modified: 6/30/86 */
int doclength = { sizeof documentation/sizeof documentation[0] };
#include <stdio.h>
#include <sys/ioctl.h>
#include <sgtty.h>
#define MAXLEN 100000
struct sgttyb ttystat;
extern char *strcpy(), *mktemp();
char scratch_file[100];
int wflag;
int xargc;
char **xargv;
main(argc,argv)
int argc;
char *argv[];
{
char big[MAXLEN];
FILE *temp,*scr;
register char *cptr;
int piped_in;
int iflag,i;
/* If no arguments, and not in a pipeline, self document */
piped_in = ioctl ((fileno (stdin)), TIOCGETP, &ttystat);
if (argc == 1 && !piped_in)
{
for( i=0; i<doclength; i++)
printf("%s\n",documentation[i]);
exit (0);
}
/* 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,
"unknown flag -%c\n",*cptr);
break;
}
}
}
}
/* 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,"/tmp/texXXXXXX");
mktemp(scratch_file);
scr=fopen(scratch_file,"w");
scrbuf(stdin,scr);
fclose(scr);
scr=fopen(scratch_file,"r");
unlink(scratch_file);
if (wflag != 1)
{
fprintf(stderr,"Checking matching...\n");
TeXMatch(scr);
fseek(scr,0,0);
}
/* either expand or buffer */
if (iflag != 1)
{ TeXExpand(scr,big,MAXLEN); fclose(scr); }
else
{ tmpbuf(scr,big); fclose(scr); }
if (wflag != 1)
fprintf(stderr,"Checking matching done\n\n");
DeTeX(big);
fclose(scr);
}
/* then process input line for arguments and assume they are input files */
xargc = argc;
xargv = argv;
for (xargc--,xargv++; xargc; xargc--,xargv++)
{
cptr = *xargv;
if( *cptr=='-' ) continue; /* this is a flag */
if((temp=fopen(cptr,"r")) != NULL)
{
if (wflag != 1)
{
fprintf(stderr,"Checking matching...\n");
fprintf(stderr,"%s:\n",cptr);
TeXMatch(temp);
fprintf(stderr,"\n");
fseek(temp,0,0);
}
/* either expand or buffer */
if (iflag != 1)
{ TeXExpand(temp,big,MAXLEN); fclose(temp); }
else
{ tmpbuf(temp,big); fclose(temp); }
if (wflag != 1)
fprintf(stderr,"Checking matching done\n\n");
DeTeX(big);
fclose(temp);
}
else
fprintf(stderr,"detex: Cannot open %s\n",cptr);
}
}
DeTeX(big) /* stripping TEX commands */
char *big;
{
int c,c1,be;
while ((c = *big++) != '\0')
{
switch (c)
{
/* detect TeX commands (backslash) */
case '\\':
c1=c ; /* c1 is needed to see if there is \$ */
c=' ' ; /* "erase" the backslash */
putc(c,stdout);
if ((c = *big++) =='b')
if (begin_end_buf(big,&be) == 0)
{
if (be == 1)
{
big += 14;
while ( *big++ != '\0')
{
if(begin_end_buf(big,&be) == 0)
if (be == 2)
{
big += 13;
break;
}
}
}
}
while ((c = *big++) != '\0')
{
if (c == '$') goto dollar;
if (c == '%') goto comm;
if (c == '{' || c == '#') break;
if (c == ' ' || c == '\n' || c == '(' || c == ')')
{
putc(c,stdout);
break;
}
c1=c; /* reinitialize c1 */
}
break;
/* come here if the character is dollar sign */
dollar:
case '$':
c=' ' ; /* "erase" the dollar sign */
putc (c,stdout);
if (c1 == '\\') break; /* means \$ */
c = *big++;
if(c == '$') goto dollar2;
else goto dollar1;
break;
/* see if it is an in-line equation (delimeter is one dollar sign) */
dollar1:
while((c = *big++) != '\0')
if(c == '$') break;
break;
/* see if it is a displayed equation (delimeter is two dollar signs) */
dollar2:
while((c = *big++) != '\0')
{
if(c == '$')
{
c = *big++;
if (c != '$') putc(c,stdout);
break;
}
}
break;
/* ignore commented text */
comm:
case '%':
if (c1 == '\\') break; /* means \% */
while((c = *big++) != '\0')
if (c == '\n')
{
putc(c,stdout);
break;
}
break;
/* erase these character */
case '{':
c=' ';
case '}':
c=' ';
case '_':
c=' ';
case '^':
c=' ';
case '&':
c=' ';
case '#':
c=' ';
/* default is doing nothing: pass the character to the output */
default:
putc(c,stdout);
break;
}
c1=c; /* reinitialize c1 */
}
}