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