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
text(t,p1)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
trans(c,p1)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
shim()160 shim() {
161 cs[csp++] = '\\'; cs[csp++] = '|';
162 }
163
roman(c)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
name4(c1,c2)170 name4(c1,c2) int c1,c2; {
171 cs[csp++] = '\\';
172 cs[csp++] = '(';
173 cs[csp++] = c1;
174 cs[csp++] = c2;
175 }
176