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