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