1*14634Sslatteng # include "e.h"
2*14634Sslatteng # include "e.def"
3*14634Sslatteng # include "ctype.h"
4*14634Sslatteng 
5*14634Sslatteng int	csp;
6*14634Sslatteng int	psp;
7*14634Sslatteng #define	CSSIZE	400
8*14634Sslatteng char	cs[420];
9*14634Sslatteng 
10*14634Sslatteng int	lf, rf;	/* temporary spots for left and right fonts */
11*14634Sslatteng 
text(t,p1)12*14634Sslatteng text(t,p1) int t; char *p1; {
13*14634Sslatteng 	int c;
14*14634Sslatteng 	char *p;
15*14634Sslatteng 	tbl *tp, *lookup();
16*14634Sslatteng 	extern tbl *restbl;
17*14634Sslatteng 
18*14634Sslatteng 	yyval = oalloc();
19*14634Sslatteng 	ebase[yyval] = 0;
20*14634Sslatteng 	eht[yyval] = VERT( EM(1.0, EFFPS(ps)) );	/* ht in machine units */
21*14634Sslatteng 	lfont[yyval] = rfont[yyval] = ROM;
22*14634Sslatteng 	if (t == QTEXT)
23*14634Sslatteng 		p = p1;
24*14634Sslatteng 	else if ( t == SPACE )
25*14634Sslatteng 		p = "\\ ";
26*14634Sslatteng 	else if ( t == THIN )
27*14634Sslatteng 		p = "\\|";
28*14634Sslatteng 	else if ( t == TAB )
29*14634Sslatteng 		p = "\\t";
30*14634Sslatteng 	else if ((tp = lookup(&restbl, p1, NULL)) != NULL) {
31*14634Sslatteng 		p = tp->defn;
32*14634Sslatteng 	} else {
33*14634Sslatteng 		lf = rf = 0;
34*14634Sslatteng 		for (csp=psp=0; (c=p1[psp++])!='\0';) {
35*14634Sslatteng 			rf = trans(c, p1);
36*14634Sslatteng 			if (lf == 0)
37*14634Sslatteng 				lf = rf;	/* save first */
38*14634Sslatteng 			if (csp>CSSIZE)
39*14634Sslatteng 				error(FATAL,"converted token %.25s... too long",p1);
40*14634Sslatteng 		}
41*14634Sslatteng 		cs[csp] = '\0';
42*14634Sslatteng 		p = cs;
43*14634Sslatteng 		lfont[yyval] = lf;
44*14634Sslatteng 		rfont[yyval] = rf;
45*14634Sslatteng 	}
46*14634Sslatteng 	if(dbg)printf(".\t%dtext: S%d <- %s; b=%d,h=%d,lf=%c,rf=%c\n",
47*14634Sslatteng 		t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval]);
48*14634Sslatteng 	printf(".ds %d \"%s\n", yyval, p);
49*14634Sslatteng }
50*14634Sslatteng 
trans(c,p1)51*14634Sslatteng trans(c,p1) int c; char *p1; {
52*14634Sslatteng 	int f;
53*14634Sslatteng 	f = ROM;
54*14634Sslatteng 	switch( c) {
55*14634Sslatteng 	case '0': case '1': case '2': case '3': case '4':
56*14634Sslatteng 	case '5': case '6': case '7': case '8': case '9':
57*14634Sslatteng 	case ':': case ';': case '!': case '%':
58*14634Sslatteng 	case '(': case '[': case ')': case ']':
59*14634Sslatteng 	case ',':
60*14634Sslatteng 		if (rf == ITAL)
61*14634Sslatteng 			shim();
62*14634Sslatteng 		roman(c); break;
63*14634Sslatteng 	case '.':
64*14634Sslatteng 		if (rf == ROM)
65*14634Sslatteng 			roman(c);
66*14634Sslatteng 		else
67*14634Sslatteng 			cs[csp++] = c;
68*14634Sslatteng 		f = rf;
69*14634Sslatteng 		break;
70*14634Sslatteng 	case '|':
71*14634Sslatteng 		shim(); roman(c); shim(); break;
72*14634Sslatteng 	case '=':
73*14634Sslatteng 		if (rf == ITAL)
74*14634Sslatteng 			shim();
75*14634Sslatteng 		name4('e','q');
76*14634Sslatteng 		break;
77*14634Sslatteng 	case '+':
78*14634Sslatteng 		if (rf == ITAL)
79*14634Sslatteng 			shim();
80*14634Sslatteng 		name4('p', 'l');
81*14634Sslatteng 		break;
82*14634Sslatteng 	case '>': case '<':
83*14634Sslatteng 		if (rf == ITAL)
84*14634Sslatteng 			shim();
85*14634Sslatteng 		if (p1[psp]=='=') {	/* look ahead for == <= >= */
86*14634Sslatteng 			name4(c,'=');
87*14634Sslatteng 			psp++;
88*14634Sslatteng 		} else {
89*14634Sslatteng 			cs[csp++] = c;
90*14634Sslatteng 		}
91*14634Sslatteng 		break;
92*14634Sslatteng 	case '-':
93*14634Sslatteng 		if (rf == ITAL)
94*14634Sslatteng 			shim();
95*14634Sslatteng 		if (p1[psp]=='>') {
96*14634Sslatteng 			name4('-','>'); psp++;
97*14634Sslatteng 		} else {
98*14634Sslatteng 			name4('m','i');
99*14634Sslatteng 		}
100*14634Sslatteng 		break;
101*14634Sslatteng 	case '/':
102*14634Sslatteng 		if (rf == ITAL)
103*14634Sslatteng 			shim();
104*14634Sslatteng 		name4('s','l');
105*14634Sslatteng 		break;
106*14634Sslatteng 	case '~': case ' ':
107*14634Sslatteng 		shim(); shim(); break;
108*14634Sslatteng 	case '^':
109*14634Sslatteng 		shim(); break;
110*14634Sslatteng 	case '\\':	/* troff - pass 2 or 3 more chars */
111*14634Sslatteng 		if (rf == ITAL)
112*14634Sslatteng 			shim();
113*14634Sslatteng 		cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
114*14634Sslatteng 		if (c=='(') cs[csp++] = p1[psp++];
115*14634Sslatteng 		if (c=='*' && cs[csp-1] == '(') {
116*14634Sslatteng 			cs[csp++] = p1[psp++];
117*14634Sslatteng 			cs[csp++] = p1[psp++];
118*14634Sslatteng 		}
119*14634Sslatteng 		break;
120*14634Sslatteng 	case '\'':
121*14634Sslatteng 		cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM;
122*14634Sslatteng 		name4('f','m');
123*14634Sslatteng 		cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
124*14634Sslatteng 		f = rf==ITAL ? ITAL : ROM;
125*14634Sslatteng 		break;
126*14634Sslatteng 
127*14634Sslatteng 	case 'f':
128*14634Sslatteng 		if (ft == ITAL) {
129*14634Sslatteng 			if (psp == 1 || !isalnum(p1[psp-2])) {
130*14634Sslatteng 				cs[csp++] = '\\';
131*14634Sslatteng 				cs[csp++] = '^';
132*14634Sslatteng 			}
133*14634Sslatteng 			cs[csp++] = 'f';
134*14634Sslatteng 			if (!isalpha(p1[psp])) {	/* add \| after f except in text */
135*14634Sslatteng 				cs[csp++] = '\\';
136*14634Sslatteng 				cs[csp++] = '|';
137*14634Sslatteng 			}
138*14634Sslatteng 			f = ITAL;
139*14634Sslatteng 		}
140*14634Sslatteng 		else
141*14634Sslatteng 			cs[csp++] = 'f';
142*14634Sslatteng 		break;
143*14634Sslatteng 	case 'j':
144*14634Sslatteng 		if (ft == ITAL) {
145*14634Sslatteng 			cs[csp++] = '\\'; cs[csp++] = '^';
146*14634Sslatteng 			cs[csp++] = 'j';
147*14634Sslatteng 			f = ITAL;
148*14634Sslatteng 		}
149*14634Sslatteng 		else
150*14634Sslatteng 			cs[csp++] = 'j';
151*14634Sslatteng 		break;
152*14634Sslatteng 	default:
153*14634Sslatteng 		cs[csp++] = c;
154*14634Sslatteng 		f = ft==ITAL ? ITAL : ROM;
155*14634Sslatteng 		break;
156*14634Sslatteng 	}
157*14634Sslatteng 	return(f);
158*14634Sslatteng }
159*14634Sslatteng 
shim()160*14634Sslatteng shim() {
161*14634Sslatteng 	cs[csp++] = '\\'; cs[csp++] = '|';
162*14634Sslatteng }
163*14634Sslatteng 
roman(c)164*14634Sslatteng roman(c) int c; {
165*14634Sslatteng 	cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = (ft==ITAL) ? ROM : ft;
166*14634Sslatteng 	cs[csp++] = c;
167*14634Sslatteng 	cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
168*14634Sslatteng }
169*14634Sslatteng 
name4(c1,c2)170*14634Sslatteng name4(c1,c2) int c1,c2; {
171*14634Sslatteng 	cs[csp++] = '\\';
172*14634Sslatteng 	cs[csp++] = '(';
173*14634Sslatteng 	cs[csp++] = c1;
174*14634Sslatteng 	cs[csp++] = c2;
175*14634Sslatteng }
176