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