|
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
Length: 9163 (0x23cb) Types: TextFile Names: »TeXMatch.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/textools/TeXMatch.c«
#include <stdio.h> TeXMatch(fp) /* check matching */ FILE *fp; { int l=1; /* line counter */ int ld=0; /* single left dollar signs */ int rd=0; /* single right dollar signs */ int ldd=0; /* left double dollar signs */ int rdd=0; /* right double dollar signs */ int lateq=0; /* LaTeX \begin{equation} \end{equation} */ int lp=0; /* left paranthesis */ int rp=0; /* right paranthesis */ int lb=0; /* left brackets */ int rb=0; /* right brackets */ int lbr=0; /* left braces */ int rbr=0; /* right braces */ int c=' '; /* current character */ int c1=' '; /* previous character */ int lbrl=1; /* line number of left braces */ int lbl=1; /* line number of left bracket */ int lpl=1; /* line number of left parenthesis */ int ldl=1; /* line number of left single dollar sign */ int lddl=1; /* line number of left double dollar sign */ int lbeg=1; /* line of \begin{equation} */ int war=0; /* warning status */ int esc=0; /* escape status */ int i=0; while ((c =getc(fp)) != EOF) { if (ldd == 1 && ld == 1 && c != '$') { fprintf(stderr,"line %d: a double dollar sign is closed by a single dollar sign\n",l); ld=0.; ldd=0.; /* reset dollar signs */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces in equation\n",lddl,lbr-rbr); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets in equation\n",lddl,lb-rb); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parantheses in equation\n",lddl,lp-rp); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } top: switch(c) { case '\n': l++; /* increment line counter */ /* check to see if a single dollar sign is not closed at the same line */ if (ld == 1 && war == 0) { fprintf(stderr,"line %d: single dollar sign is not closed on the same line\n",l-1); war=1; /* warning has been given */ } esc = 0; /* escape status */ break; case '%': /* ignore commented text */ if (esc == 1) /* escaped % */ { esc=0; break; } while ((c =getc(fp)) != EOF) if (c == '\n') {l++; break;} esc=0; break; case '{': if (esc == 0) { lbr++; if (lbrl == 0) lbrl=l; } esc = 0; /* escape status */ break; case '}': if (esc == 0) rbr++; esc = 0; /* escape status */ if (rbr > lbr) { fprintf(stderr,"line %d: unmatched braces\n",l); rbr--; /* reset the count */ } if (lbr == rbr) lbrl=0; break; case '[': if (esc == 0) { lb++; if (lbl == 0) lbl=l; } esc = 0; /* escape status */ break; case ']': if (esc == 0) rb++; esc = 0; /* escape status */ if (rb > lb) { fprintf(stderr,"line %d: unmatched brackets\n",l); rb--; /* reset the count */ } if (lb == rb) lbl=0; break; case '(': if (esc == 0) { lp++; if (lpl == 0) lpl=l; } esc = 0; /* escape status */ break; case ')': if (esc == 0) rp++; esc = 0; /* escape status */ if (rp > lp) { fprintf(stderr,"line %d: unmatched parentheses\n",l); rp--; /* reset the count */ } if (lp == rp) lpl=0; break; case '$': if (esc == 1) /* escaped dollar sign */ { c=' '; /* reset the dollar sign */ esc = 0; /* escape status */ break; } if (c1 == '$') /* double dollar sign */ { if (ld == 0) { fprintf(stderr,"line %d: single dollar sign is closed by a duble dollar sign\n",l); c=' '; /* reset the dollar sign */ break; } if (ldd == 1) { rdd=1; /* right double dollar sign */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces in equation\n",lddl,lbr-rbr); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets in equation\n",lddl,lb-rb); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parantheses in equation\n",lddl,lp-rp); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } else { ldd=1; /* left double dollar sign */ lddl=l; /* line number */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces before equation, first opened at line %d\n",lddl,lbr-rbr,lbrl); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets before equation, first opened at line %d\n",lddl,lb-rb,lbl); if ((lp-rp) > 0) fprintf(stderr,"line %d: unclosed parentheses before equation, first opened at line %d\n",lddl,lp-rp,lpl); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } } if (ld == 1) rd=1; /* right dollar sign */ else { ld=1; /* left dollar sign */ ldl=l; /* line number */ war=0; /* no warning has been given */ } esc = 0; /* escape status */ break; case '\\': /* check if \begin{equation} or \end{equation} */ i=begin_end_file(fp,&c); /* check escape status */ if (c == '\\') { if (i == 0) esc = 0; else esc = 1; } if (i < 0) /* not equation */ { if (c != '\\') esc = 0; c1 = ' '; /* doesn't matter */ goto top; } if (i == 0) { if (c == '\n') l++; esc = 0; c1 = ' '; /* doesn't matter */ } else if (i == 1) { if (lateq == 1) fprintf(stderr,"line %d: new equation starts while equation on line %d is not closed\n",l,lbeg); lateq=1; /* \begin{equation} */ lbeg=l; /* line number */ /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces before equation, first opened at line %d\n",lbeg,lbr-rbr,lbrl); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets before equation, first opened at line %d\n",lbeg,lb-rb,lbl); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parentheses before equation, first opened at line %d\n",lbeg,lp-rp,lpl); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; } else { if (lateq == 0) fprintf(stderr,"line %d: equation ends but no beginning\n",l); /* Give warning about unclosed openings */ if ((lbr-rbr) > 0) fprintf(stderr,"line %d: %d unclosed braces in equation\n",l,lbr-rbr); if ((lb-rb) > 0) fprintf(stderr,"line %d: %d unclosed brackets in equation\n",l,lb-rb); if ((lp-rp) > 0) fprintf(stderr,"line %d: %d unclosed parantheses in equation\n",l,lp-rp); /* clear registers */ lp=0; lb=0; lbr=0; rp=0; rb=0; rbr=0; lpl=0; lbrl=0; lbl=0; lateq=0; } break; default: esc=0; /* escape status */ break; } c1=c; /* update previous character */ if (ld == 1 && rd == 1) {ld=0.; rd=0.;} /* matched dollar signs */ if (ldd == 1 && rdd == 1) {ldd=0.; rdd=0.;} /* matched double dollar signs */ } if ((lbr-rbr) > 0) fprintf(stderr,"file ends: %d unclosed left braces, first opened at line %d \n",lbr-rbr,lbrl); if ((lb-rb) > 0) fprintf(stderr,"file ends: %d unclosed left brackets, first opened at line %d \n",lb-rb,lbl); if ((lp-rp) > 0) fprintf(stderr,"file ends: %d unclosed left parentheses, first opened at line %d \n",lp-rp,lpl); if (ld == 1) fprintf(stderr,"file ends: single dollar sign opened at line %d unclosed\n",ldl); if (ldd == 1) fprintf(stderr,"file ends: double dollar sign opened at line %d unclosed\n",lddl); if (lateq == 1) fprintf(stderr,"file ends: equation started at line %d unclosed\n",lbeg); } tmpbuf(in,buffer) /* copy input to buffer, assume buffer is big enough */ FILE *in; char *buffer; { while (( *buffer++ = getc(in)) != EOF) ; } scrbuf(in,out) /* copy input to output */ FILE *in,*out; { int c; while ((c =getc(in)) != EOF) putc(c,out); } begin_end_buf(buffer,be) /* reads from a buffer and returns 1 if \begin{equation} is found, 2 if \end{equation} is found and -1 if neither is found */ char *buffer; int *be; { int i; char w[11]; *be = -1; for (i=0; (w[i] = *buffer++) != '\0' && i < 5; i++) if (w[i] < 'a' || w[i] > 'z') break; buffer--; w[i]='\0'; if (strcmp(w,"egin") == 0) *be=1; /* \begin */ else if (strcmp(w,"end") == 0) *be=2; /* \end */ if ( *be > 0) { for (i=0; (w[i] = *buffer++) != '\0' && i < 10; i++) ; w[i]='\0'; if (strcmp(w,"{equation}") == 0) return(0); } return(i); } #define MAXWORD 20 begin_end_file(fp,c) /* reads from a file and checks for equations; returns 1 if \begin{equation} is found and 2 if \end{equation} is found; returns -1 if neither is found; return 0 if no letter is consumed. */ FILE *fp; int *c; { int i,be; char w[MAXWORD]; for (i=0; (w[i] = getc(fp)) != EOF && i < MAXWORD; i++) if (w[i] < 'a' || w[i] > 'z') break; *c=w[i]; w[i]='\0'; be = -1; if (strcmp(w,"begin") == 0) be=1; else if (strcmp(w,"end") == 0) be=2; if (i == 0) return(0); if (be > 0) { w[0] = *c; for (i=1; (w[i] = getc(fp)) != EOF && i < MAXWORD; i++) if (w[i] < 'a' || w[i] > 'z') if (w[i] != '{') break; *c=w[i]; w[i]='\0'; if (strcmp(w,"{equation") == 0) return(be); *c=' '; /* so that the brace does not count */ } return(-1); }