238 lines
4.9 KiB
C
238 lines
4.9 KiB
C
#
|
|
#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;
|
|
}
|