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