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