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