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