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