# #include "ne.h" #include "y.tab.c" char *cntrl[] { "sup", "super", "sub", ".EN", "sum", "from", "to", "hat", "dot", "dotdot", "bar", "tilde", "under", "prod", "int", "integral", "union", "inter", "pile", "lpile", "cpile", "rpile", "over", "sqrt", "above", "size", "font", "roman", "italic", "bold", "left", "right", "delim", "DELIM", "DEFINE","define", ".gsize", ".GSIZE", "gsize", "GSIZE", "gfont", "GFONT", "HAT", "DOT", "DOTDOT", "BAR", "TILDE", "UNDER", "PROD", "INT", "INTEGRAL", "UNION", "INTER", "SUM", "FROM", "TO", "SUP", "SUPER", "SUB", "PILE", "LPILE", "CPILE", "RPILE", "OVER", "SQRT", "ABOVE", "SIZE", "FONT", "ROMAN", "ITALIC", "BOLD", "LEFT", "RIGHT", "up", "UP", "down", "DOWN", "fwd", "FWD", "back", "BACK", "mark", "MARK", "lineup", "LINEUP", "matrix", "lcol", "ccol", "rcol", "col", 0}; int icntrl[]{ SUPER, SUPER, SUB, 0, /* EOF */ SUM, FROM, TO, HAT, DOT, DOTDOT, BAR, TILDE, UNDER, PROD, INT, INT, UNION, INTER, PILE, LPILE, CPILE, RPILE, OVER, SQRT, ABOVE, SIZE, FONT, ROMAN, ITALIC, BOLD, LEFT, RIGHT, DELIM, DELIM, DEFINE, DEFINE, GSIZE, GSIZE, GSIZE, GSIZE, GFONT, GFONT, HAT, DOT, DOTDOT, BAR, TILDE, UNDER, PROD, INT, INT, UNION, INTER, SUM, FROM, TO, SUPER, SUPER, SUB, PILE, LPILE, CPILE, RPILE, OVER, SQRT, ABOVE, SIZE, FONT, ROMAN, ITALIC, BOLD, LEFT, RIGHT, UP, UP, DOWN, DOWN, FWD, FWD, BACK, BACK, MARK, MARK, LINEUP, LINEUP, MATRIX, LCOL, CCOL, RCOL, COL, 0}; int peek -1; #define SSIZE 400 char token[SSIZE]; int sp; int speek[10]; char *swt[10]; int sw -1; getc(){ loop: if(sw >= 0){ lastchar = (peek<0) ? *swt[sw]++ : peek; peek = -1; if(lastchar != '\0')return(lastchar); peek = speek[sw--]; return(' '); } lastchar = (peek<0) ? getchar() : peek; if( lastchar=='\n' ) linect++; peek = -1; if( lastchar!= '\0' ) return(lastchar); if( ++ifile > svargc ){ peek = '\0'; return('\0'); } close(fin); linect = 1; if( (fin=open(svargv[ifile],0)) >= 0 ) goto loop; error(FATAL,"can't open file %s\n", svargv[ifile]); } yylex(){ int c, type; beg: while( (c=getc())==' ' || c=='\n'); yylval=c; switch(c){ case '\0': return('\0'); case '~': return(SPACE); case '^': return(THIN); case '\t': return(TAB); case '{': return(MQ); case '}': return(MQ1); case '"': for(sp=0; (c=getc())!='"'; ){ if(c !='\\')token[sp++]=c; else { if((c=getc())!= '"')token[sp++]='\\'; token[sp++] = c; } if( sp>=SSIZE ) error(FATAL,"quoted string %.20s... too long", token); } token[sp]='\0'; yylval= &token[0]; return(QTEXT); } if( c==righteq ) return('\0'); getstr(token, c); if((type = lookup(token,nptr)) >= 0){ if(sw >= 9) error(FATAL,"definitions nested > 9", sw); swt[++sw] = sptr[type]; speek[sw] = peek; peek = -1; goto beg; } type = lookup(token,cntrl); if( type < 0 ) return(CONTIG); if( icntrl[type]==DEFINE ) { define(); goto beg; } else if( icntrl[type]==DELIM ) { delim(); goto beg; } else if( icntrl[type]==GSIZE ){ globsize(); goto beg; } else if( icntrl[type]==GFONT ) { globfont(); goto beg; } else return( icntrl[type] ); } getstr(s,c) char *s, c; { for (sp=0; c!=' ' && c!='\t' && c!='\n' && c!='{' && c!='}' && c!='"' && c!='~' && c!='^' && c!=righteq; ) { if(c == '\\') if((c = getc()) != '"')s[sp++] = '\\'; s[sp++] = c; if( sp>=SSIZE ) error(FATAL,"token %.20s... too long",s); c = getc(); } if( c=='{' || c=='}' || c=='"' || c=='~' || c=='^' || c=='\t' || c==righteq ) peek = c; s[sp]='\0'; yylval = s; } lookup(str,tbl) char *str; char *tbl[]; { register i,j, r; for(i=0; tbl[i]!=0; i++){ /* table of tbl wds */ for( j=0; (r=tbl[i][j])==str[j] && r!='\0'; j++); if( r == str[j] ) return(i); } return( -1 ); } cstr(s,quote) char *s; int quote; { int del,c,i; while((del=getc()) == ' ' || del == '\t' || del == '\n'); if(quote) for(i=0; (c=getc()) != del;) s[i++] = c; else { s[0] = del; for(i=1; (c=getc())!=' ' && c!= '\t' && c!='\n';) s[i++]=c; } s[i] = '\0'; return(s); } define() { char *alloc(); int i, c; while( (c=getc())==' ' || c=='\n' ); getstr(token,c); if((i = lookup(token,nptr)) >= 0){ yyval = i; free(sptr[yyval]); } else { yyval = ptr++; for(i=0; token[i] != '\0'; i++); nptr[yyval] = alloc(i+1); for(i=0; nptr[yyval][i]=token[i]; i++); } if(dbg)printf(".\tdefine %s\n",nptr[yyval]); cstr(token,1); for(i=0; token[i] != '\0'; i++); sptr[yyval] = alloc(i+1); for(i=0; sptr[yyval][i] = token[i]; i++); if(dbg)printf(".\tname %s defined as %s\n",nptr[yyval],sptr[yyval]); } delim() { char *s; yyval = eqnreg = 0; cstr(token,0); lefteq = token[0]; righteq = token[1]; if( (lefteq == 'o' && righteq == 'f') || (lefteq == 'O' && righteq == 'F') ) lefteq = righteq = '\0'; } globsize() { extern int gsize; int c; while( (c=getc())==' ' || c=='\n' ); getstr(token,c); gsize = numb(token); yyval = eqnreg = 0; } globfont() { extern int gfont; while( (gfont=getc())==' ' || gfont=='\n' ); yyval = eqnreg = 0; }