|
|
1.1 root 1: #include "e.h"
2: #include "y.tab.h"
3: #include <ctype.h>
4:
5: #define CSSIZE 400
6: char cs[CSSIZE+20]; /* text string converted into this */
7: char *csp; /* next spot in cs[] */
8: char *psp; /* next character in input token */
9:
10: int lf, rf; /* temporary spots for left and right fonts */
11: int lastft; /* last \f added */
12: int nextft; /* next \f to be added */
13:
14: text(t, p1) /* convert text string p1 of type t */
15: int t;
16: char *p1;
17: {
18: int c;
19: char *p;
20: tbl *tp;
21:
22: yyval = salloc();
23: ebase[yyval] = 0;
24: eht[yyval] = EM(1.0, ps); /* ht in ems of orig size */
25: eps[yyval] = ps;
26: lfont[yyval] = rfont[yyval] = ROM;
27: if (t == QTEXT) {
28: for (p = p1; *p; p++) /* scan for embedded \f's */
29: if (*p == '\\' && *(p+1) == 'f')
30: break;
31: if (*p) /* if found \f, leave it alone and hope */
32: p = p1;
33: else {
34: sprintf(cs, "\\f%s%s\\fP", ftp->name, p1);
35: p = cs;
36: }
37: } else if (t == SPACE)
38: p = "\\ ";
39: else if (t == THIN)
40: p = "\\|";
41: else if (t == TAB)
42: p = "\\t";
43: else if ((tp = lookup(restbl, p1, NULL)) != NULL) {
44: p = tp->defn;
45: } else {
46: lf = rf = 0;
47: /* sprintf(cs, "\\f%s", ftp->name); */
48: lastft = 0;
49: csp = cs;
50: for (psp = p1; (c = *psp++) != '\0'; ) {
51: nextft = ft;
52: rf = trans(c, p1);
53: if (lf == 0)
54: lf = rf; /* save first */
55: if (csp-cs > CSSIZE)
56: error(FATAL,"converted token %.25s... too long",p1);
57: }
58: sadd("\\fP");
59: *csp = '\0';
60: p = cs;
61: lfont[yyval] = lf;
62: rfont[yyval] = rf;
63: }
64: dprintf(".\t%dtext: S%d <- %s; b=%g,h=%g,lf=%c,rf=%c,ps=%d\n",
65: t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval], ps);
66: printf(".ds %d \"%s\n", yyval, p);
67: }
68:
69: trans(c, p1)
70: int c;
71: char *p1;
72: {
73: int f;
74:
75: f = ROM;
76: switch (c) {
77: case '0': case '1': case '2': case '3': case '4':
78: case '5': case '6': case '7': case '8': case '9':
79: case ':': case ';': case '!': case '%': case '?':
80: case '(': case '[': case ']':
81: if (rf == ITAL)
82: shim();
83: roman(c);
84: break;
85: case ')':
86: if (rf == ITAL)
87: halfshim();
88: roman(c);
89: break;
90: case ',':
91: roman(c);
92: halfshim();
93: f = rf;
94: break;
95: case '.':
96: if (rf == ROM)
97: roman(c);
98: else
99: cadd(c);
100: f = rf;
101: break;
102: case '|':
103: if (rf == ITAL && ttype != DEV202)
104: shim();
105: shim(); roman(c); shim();
106: break;
107: case '=':
108: if (rf == ITAL)
109: shim();
110: name4('e','q');
111: break;
112: case '+':
113: if (rf == ITAL)
114: shim();
115: name4('p','l');
116: break;
117: case '>': case '<':
118: if (rf == ITAL)
119: shim();
120: if (*psp == '=') { /* look ahead for == <= >= */
121: name4(c,'=');
122: psp++;
123: } else {
124: cadd(c);
125: }
126: break;
127: case '-':
128: if (rf == ITAL)
129: shim();
130: if (*psp == '>') {
131: name4('-','>');
132: halfshim();
133: psp++;
134: } else {
135: name4('m','i');
136: }
137: break;
138: case '/':
139: halfshim();
140: cadd('/');
141: halfshim();
142: break;
143: case '~': case ' ':
144: shim(); shim();
145: break;
146: case '^':
147: shim();
148: break;
149: case '\\': /* troff - pass only \(xx without comment */
150: if (rf == ITAL)
151: shim();
152: cadd('\\');
153: cadd(c = *psp++);
154: if (c == '(' && *psp && *(psp+1)) {
155: cadd(*psp++);
156: cadd(*psp++);
157: } else
158: fprintf(stderr, "eqn warning: unquoted troff command \\%c, line %d, file %s\n",
159: c, curfile->lineno, curfile->fname);
160: break;
161: case '\'':
162: name4('f','m');
163: break;
164:
165: case 'f':
166: if (ft == ITAL) {
167: if (psp == p1+1 || !isalnum(*(psp-2)))
168: halfshim();
169: cadd('f');
170: if (!isalpha(*psp) && *psp != '\0') /* add \| except in text */
171: shim();
172: f = ITAL;
173: }
174: else
175: cadd('f');
176: break;
177: case 'j':
178: if (ft == ITAL) {
179: sadd("\\^j");
180: f = ITAL;
181: }
182: else
183: cadd('j');
184: break;
185: default:
186: cadd(c);
187: f = ft==ITAL ? ITAL : ROM;
188: break;
189: }
190: return(f);
191: }
192:
193: shim() /* add a \| space */
194: {
195: sadd("\\|");
196: }
197:
198: halfshim() /* add a \^ space */
199: {
200: sadd("\\^");
201: }
202:
203: roman(c) /* add char c in "roman" font */
204: int c;
205: {
206: nextft = ROM;
207: cadd(c);
208: }
209:
210: name4(c1,c2)
211: int c1, c2;
212: {
213: sadd("\\(");
214: cadd(c1);
215: cadd(c2);
216: }
217:
218: sadd(s) /* add string s to cs */
219: char *s;
220: {
221: while (*s)
222: cadd(*s++);
223: }
224:
225: cadd(c) /* add char c to end of cs */
226: int c;
227: {
228: char *p;
229:
230: if (lastft != nextft) {
231: if (lastft != 0) {
232: *csp++ = '\\';
233: *csp++ = 'f';
234: *csp++ = 'P';
235: }
236: *csp++ = '\\';
237: *csp++ = 'f';
238: if (ftp == ftstack) { /* bottom level */
239: if (ftp->ft == ITAL) /* usual case */
240: *csp++ = nextft;
241: else /* gfont set, use it */
242: for (p = ftp->name; *csp = *p++; )
243: csp++;
244: } else { /* inside some kind of font ... */
245: for (p = ftp->name; *csp = *p++; )
246: csp++;
247: }
248: lastft = nextft;
249: }
250: *csp++ = c;
251: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.