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