104 lines
2.3 KiB
C
104 lines
2.3 KiB
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;
|
|
}
|
|
}
|