MiniUnix/usr/source/s7/ne3.c
# include "ne.h"
char *res[] {
">=", "<=", "!=",
"+-", "==", "cdot", "CDOT",
"times", "TIMES",
"SIGMA", "pi", "PI",
"alpha", "beta", "gamma", "GAMMA", "delta", "epsilon", "omega",
"DELTA", "LAMBDA", "PHI", "OMEGA",
"lambda", "mu", "nu", "theta", "rho", "sigma", "tau", "phi",
"INF", "INFINITY",
"inf", "infinity",
"partial", "PARTIAL",
"zeta", "eta", "iota", "kappa", "xi", "omicron", "upsilon",
"chi", "psi", "THETA", "XI", "UPSILON", "PSI",
"del", "DEL",
"nothing", "NOTHING",
"approx", "APPROX",
0};
char *restran[] {
">\b_", "<\b_", "/\b=",
"+\b_", "=\b_", "8.9", "8.9",
"x", "x",
"R", "J", "P",
"A", "B", "\\e", "G", "D", "S", "C",
"W", "E", "F", "Z",
"L", "M", "@", "T", "K", "Y", "I", "U",
"o", "o", "o", "o",
"]", "]",
"Q", "N", "i", "k", "X", "o", "u",
"X", "V", "O", "X", "U", "H",
"[", "[",
"", "",
"~\b=", "~\b=",
0};
int csp;
int psp;
#define CSSIZE 400
char cs[420];
text(t,p1) int t; char *p1; {
int i,j,c;
int w;
yyval = oalloc();
ebase[yyval] = 0;
eht[yyval] = 2; /* ht in 1/2 spaces */
if( t=='q' )
j = p1;
else if ( t == '~' )
j = &"~";
else if ( t == '^' )
j = &"";
else if ( t == '\t' )
j = &"\\t";
else if( (i=lookup(p1,res))>=0 )
j = restran[i];
else {
for( csp=psp=0; (c=p1[psp++])!='\0'; ){
trans(c,p1);
if( csp>CSSIZE )
error(FATAL,"converted token %.20s... too long",p1);
}
cs[csp] = '\0';
j = cs;
}
ewid[yyval] = width(j);
if(dbg)printf(".\t%ctext: S%d <- %s; b=%d,h=%d,w=%d\n",
t, yyval, j, ebase[yyval], eht[yyval], ewid[yyval]);
printf(".ds %d \"%s\n",yyval,j);
}
width(s) char *s; {
int c,w;
w = 0;
while( (c = *s++) != '\0' ){
if( c == '\b' || c == 033 )
w--;
else if ( c == '\\' && *s == '\\' );
else if ( c == '\\' && *s == 'e' );
else if ( c >= 040 )
w++;
}
return(w);
}
trans(c,p1) int c; char *p1; {
switch( c){
case '>': case '<': case '=':
if( p1[psp]=='=' ){ /* look ahead for == <= >= */
cs[csp++] = c; cs[csp++] = '\b'; cs[csp++] = '_';
psp++;
} else
cs[csp++] = c;
break;
case '\\': /* troff - pass 2 or 3 more chars */
cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
if( c=='(' ) cs[csp++] = p1[psp++];
break;
default:
cs[csp++] = c; break;
}
}