# 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;
	}
}
