118172Sjaap #ifndef lint
2*30727Sjaap static char sccsid[] = "@(#)text.c	2.2 (CWI) 87/04/01";
323927Sjaap #endif lint
423927Sjaap #include "e.h"
5*30727Sjaap #include "y.tab.h"
623927Sjaap #include <ctype.h>
718172Sjaap 
818172Sjaap #define	CSSIZE	400
923927Sjaap char	cs[CSSIZE+20];	/* text string converted into this */
1023927Sjaap char	*csp;		/* next spot in cs[] */
1123927Sjaap char	*psp;		/* next character in input token */
1218172Sjaap 
1323927Sjaap int	lf, rf;		/* temporary spots for left and right fonts */
1423927Sjaap int	lastft;		/* last \f added */
1523927Sjaap int	nextft;		/* next \f to be added */
1618172Sjaap 
text(t,p1)1723927Sjaap text(t, p1)	/* convert text string p1 of type t */
1823927Sjaap 	int t;
1923927Sjaap 	char *p1;
2023927Sjaap {
2118172Sjaap 	int c;
2218172Sjaap 	char *p;
2323927Sjaap 	tbl *tp;
2418172Sjaap 
2523927Sjaap 	yyval = salloc();
2618172Sjaap 	ebase[yyval] = 0;
2723927Sjaap 	eht[yyval] = EM(1.0, ps);	/* ht in ems of orig size */
2823927Sjaap 	eps[yyval] = ps;
2918172Sjaap 	lfont[yyval] = rfont[yyval] = ROM;
3023927Sjaap 	if (t == QTEXT) {
3123927Sjaap 		for (p = p1; *p; p++)	/* scan for embedded \f's */
3223927Sjaap 			if (*p == '\\' && *(p+1) == 'f')
3323927Sjaap 				break;
3423927Sjaap 		if (*p)		/* if found \f, leave it alone and hope */
3523927Sjaap 			p = p1;
3623927Sjaap 		else {
3723927Sjaap 			sprintf(cs, "\\f%s%s\\fP", ftp->name, p1);
3823927Sjaap 			p = cs;
3923927Sjaap 		}
4023927Sjaap 	} else if (t == SPACE)
4118172Sjaap 		p = "\\ ";
4223927Sjaap 	else if (t == THIN)
4318172Sjaap 		p = "\\|";
4423927Sjaap 	else if (t == TAB)
4518172Sjaap 		p = "\\t";
4623927Sjaap 	else if ((tp = lookup(restbl, p1, NULL)) != NULL) {
4718172Sjaap 		p = tp->defn;
4818172Sjaap 	} else {
4918172Sjaap 		lf = rf = 0;
5023927Sjaap 		/* sprintf(cs, "\\f%s", ftp->name); */
5123927Sjaap 		lastft = 0;
5223927Sjaap 		csp = cs;
5323927Sjaap 		for (psp = p1; (c = *psp++) != '\0'; ) {
5423927Sjaap 			nextft = ft;
5518172Sjaap 			rf = trans(c, p1);
5618172Sjaap 			if (lf == 0)
5718172Sjaap 				lf = rf;	/* save first */
5823927Sjaap 			if (csp-cs > CSSIZE)
5918172Sjaap 				error(FATAL,"converted token %.25s... too long",p1);
6018172Sjaap 		}
6123927Sjaap 		sadd("\\fP");
6223927Sjaap 		*csp = '\0';
6318172Sjaap 		p = cs;
6418172Sjaap 		lfont[yyval] = lf;
6518172Sjaap 		rfont[yyval] = rf;
6618172Sjaap 	}
6723927Sjaap 	dprintf(".\t%dtext: S%d <- %s; b=%g,h=%g,lf=%c,rf=%c,ps=%d\n",
6823927Sjaap 		t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval], ps);
6918172Sjaap 	printf(".ds %d \"%s\n", yyval, p);
7018172Sjaap }
7118172Sjaap 
trans(c,p1)7223927Sjaap trans(c, p1)
7323927Sjaap 	int c;
7423927Sjaap 	char *p1;
7523927Sjaap {
7618172Sjaap 	int f;
7723927Sjaap 
7818172Sjaap 	f = ROM;
7923927Sjaap 	switch (c) {
8018172Sjaap 	case '0': case '1': case '2': case '3': case '4':
8118172Sjaap 	case '5': case '6': case '7': case '8': case '9':
8223927Sjaap 	case ':': case ';': case '!': case '%': case '?':
8323927Sjaap 	case '(': case '[': case ']':
8418172Sjaap 		if (rf == ITAL)
8518172Sjaap 			shim();
8623927Sjaap 		roman(c);
8723927Sjaap 		break;
8823927Sjaap 	case ')':
8923927Sjaap 		if (rf == ITAL)
9023927Sjaap 			halfshim();
9123927Sjaap 		roman(c);
9223927Sjaap 		break;
9323927Sjaap 	case ',':
9423927Sjaap 		roman(c);
9523927Sjaap 		halfshim();
9623927Sjaap 		f = rf;
9723927Sjaap 		break;
9818172Sjaap 	case '.':
9918172Sjaap 		if (rf == ROM)
10018172Sjaap 			roman(c);
10118172Sjaap 		else
10223927Sjaap 			cadd(c);
10318172Sjaap 		f = rf;
10418172Sjaap 		break;
10518172Sjaap 	case '|':
10618172Sjaap 		if (rf == ITAL && ttype != DEV202)
10718172Sjaap 			shim();
10823927Sjaap 		shim(); roman(c); shim();
10923927Sjaap 		break;
11018172Sjaap 	case '=':
11118172Sjaap 		if (rf == ITAL)
11218172Sjaap 			shim();
11318172Sjaap 		name4('e','q');
11418172Sjaap 		break;
11518172Sjaap 	case '+':
11618172Sjaap 		if (rf == ITAL)
11718172Sjaap 			shim();
11823927Sjaap 		name4('p','l');
11918172Sjaap 		break;
12018172Sjaap 	case '>': case '<':
12118172Sjaap 		if (rf == ITAL)
12218172Sjaap 			shim();
12323927Sjaap 		if (*psp == '=') {	/* look ahead for == <= >= */
12418172Sjaap 			name4(c,'=');
12518172Sjaap 			psp++;
12618172Sjaap 		} else {
12723927Sjaap 			cadd(c);
12818172Sjaap 		}
12918172Sjaap 		break;
13018172Sjaap 	case '-':
13118172Sjaap 		if (rf == ITAL)
13218172Sjaap 			shim();
13323927Sjaap 		if (*psp == '>') {
13423927Sjaap 			name4('-','>');
13523927Sjaap 			halfshim();
13623927Sjaap 			psp++;
13718172Sjaap 		} else {
13818172Sjaap 			name4('m','i');
13918172Sjaap 		}
14018172Sjaap 		break;
14118172Sjaap 	case '/':
142*30727Sjaap 		halfshim();
143*30727Sjaap 		cadd('/');
144*30727Sjaap 		halfshim();
14518172Sjaap 		break;
14618172Sjaap 	case '~': case ' ':
14723927Sjaap 		shim(); shim();
14823927Sjaap 		break;
14918172Sjaap 	case '^':
15023927Sjaap 		shim();
15123927Sjaap 		break;
15223927Sjaap 	case '\\':	/* troff - pass only \(xx without comment */
15318172Sjaap 		if (rf == ITAL)
15418172Sjaap 			shim();
15523927Sjaap 		cadd('\\');
15623927Sjaap 		cadd(c = *psp++);
15723927Sjaap 		if (c == '(' && *psp && *(psp+1)) {
15823927Sjaap 			cadd(*psp++);
15923927Sjaap 			cadd(*psp++);
16023927Sjaap 		} else
16123927Sjaap 			fprintf(stderr, "eqn warning: unquoted troff command \\%c, line %d, file %s\n",
16223927Sjaap 				c, curfile->lineno, curfile->fname);
16318172Sjaap 		break;
16418172Sjaap 	case '\'':
16518172Sjaap 		name4('f','m');
16618172Sjaap 		break;
16718172Sjaap 
16818172Sjaap 	case 'f':
16918172Sjaap 		if (ft == ITAL) {
17023927Sjaap 			if (psp == p1+1 || !isalnum(*(psp-2)))
17123927Sjaap 				halfshim();
17223927Sjaap 			cadd('f');
17323927Sjaap 			if (!isalpha(*psp) && *psp != '\0')	/* add \| except in text */
17423927Sjaap 				shim();
17518172Sjaap 			f = ITAL;
17618172Sjaap 		}
17718172Sjaap 		else
17823927Sjaap 			cadd('f');
17918172Sjaap 		break;
18018172Sjaap 	case 'j':
18118172Sjaap 		if (ft == ITAL) {
18223927Sjaap 			sadd("\\^j");
18318172Sjaap 			f = ITAL;
18418172Sjaap 		}
18518172Sjaap 		else
18623927Sjaap 			cadd('j');
18718172Sjaap 		break;
18818172Sjaap 	default:
18923927Sjaap 		cadd(c);
19018172Sjaap 		f = ft==ITAL ? ITAL : ROM;
19118172Sjaap 		break;
19218172Sjaap 	}
19318172Sjaap 	return(f);
19418172Sjaap }
19518172Sjaap 
shim()19623927Sjaap shim()	/* add a \| space */
19723927Sjaap {
19823927Sjaap 	sadd("\\|");
19918172Sjaap }
20018172Sjaap 
halfshim()20123927Sjaap halfshim()	/* add a \^ space */
20223927Sjaap {
20323927Sjaap 	sadd("\\^");
20418172Sjaap }
20518172Sjaap 
roman(c)20623927Sjaap roman(c)	/* add char c in "roman" font */
20723927Sjaap 	int c;
20823927Sjaap {
20923927Sjaap 	nextft = ROM;
21023927Sjaap 	cadd(c);
21118172Sjaap }
21223927Sjaap 
name4(c1,c2)21323927Sjaap name4(c1,c2)
21423927Sjaap 	int c1, c2;
21523927Sjaap {
21623927Sjaap 	sadd("\\(");
21723927Sjaap 	cadd(c1);
21823927Sjaap 	cadd(c2);
21923927Sjaap }
22023927Sjaap 
sadd(s)22123927Sjaap sadd(s)		/* add string s to cs */
22223927Sjaap 	char *s;
22323927Sjaap {
22423927Sjaap 	while (*s)
22523927Sjaap 		cadd(*s++);
22623927Sjaap }
22723927Sjaap 
cadd(c)22823927Sjaap cadd(c)		/* add char c to end of cs */
22923927Sjaap 	int c;
23023927Sjaap {
23123927Sjaap 	char *p;
23223927Sjaap 
23323927Sjaap 	if (lastft != nextft) {
23423927Sjaap 		if (lastft != 0) {
23523927Sjaap 			*csp++ = '\\';
23623927Sjaap 			*csp++ = 'f';
23723927Sjaap 			*csp++ = 'P';
23823927Sjaap 		}
23923927Sjaap 		*csp++ = '\\';
24023927Sjaap 		*csp++ = 'f';
24123927Sjaap 		if (ftp == ftstack) {	/* bottom level */
24223927Sjaap 			if (ftp->ft == ITAL)	/* usual case */
24323927Sjaap 				*csp++ = nextft;
24423927Sjaap 			else		/* gfont set, use it */
24523927Sjaap 				for (p = ftp->name; *csp = *p++; )
24623927Sjaap 					csp++;
24723927Sjaap 		} else {	/* inside some kind of font ... */
24823927Sjaap 			for (p = ftp->name; *csp = *p++; )
24923927Sjaap 				csp++;
25023927Sjaap 		}
25123927Sjaap 		lastft = nextft;
25223927Sjaap 	}
25323927Sjaap 	*csp++ = c;
25423927Sjaap }
255