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