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