1*48252Sbostic /*-
2*48252Sbostic * Copyright (c) 1991 The Regents of the University of California.
3*48252Sbostic * All rights reserved.
4*48252Sbostic *
5*48252Sbostic * %sccs.include.proprietary.c%
6*48252Sbostic */
7*48252Sbostic
814486Ssam #ifndef lint
9*48252Sbostic static char sccsid[] = "@(#)text.c 4.4 (Berkeley) 04/17/91";
10*48252Sbostic #endif /* not lint */
1111019Sshannon
1211019Sshannon # include "e.h"
1311019Sshannon # include "e.def"
1411019Sshannon
1511019Sshannon int csp;
1611019Sshannon int psp;
1711019Sshannon #define CSSIZE 400
1811019Sshannon char cs[420];
1911019Sshannon
2011019Sshannon int lf, rf; /* temporary spots for left and right fonts */
2111019Sshannon
text(t,p1)2211019Sshannon text(t,p1) int t; char *p1; {
2311019Sshannon int c;
2411019Sshannon char *p;
2511019Sshannon tbl *tp, *lookup();
2611019Sshannon extern tbl *restbl;
2711019Sshannon
2811019Sshannon yyval = oalloc();
2911019Sshannon ebase[yyval] = 0;
3011023Sshannon #ifndef NEQN
3111019Sshannon eht[yyval] = VERT(6 * ((ps>6)?ps:6)); /* ht in machine units */
3211023Sshannon #else NEQN
3311023Sshannon eht[yyval] = VERT(2); /* 2 half-spaces */
3411023Sshannon #endif NEQN
3511019Sshannon lfont[yyval] = rfont[yyval] = ROM;
3611019Sshannon if (t == QTEXT)
3711019Sshannon p = p1;
3811019Sshannon else if ( t == SPACE )
3911019Sshannon p = "\\ ";
4011019Sshannon else if ( t == THIN )
4111019Sshannon p = "\\|";
4211019Sshannon else if ( t == TAB )
4311019Sshannon p = "\\t";
4411019Sshannon else if ((tp = lookup(&restbl, p1, NULL)) != NULL)
4511019Sshannon p = tp->defn;
4611019Sshannon else {
4711019Sshannon lf = rf = 0;
4811019Sshannon for (csp=psp=0; (c=p1[psp++])!='\0';) {
4911019Sshannon rf = trans(c, p1);
5011019Sshannon if (lf == 0)
5111019Sshannon lf = rf; /* save first */
5211019Sshannon if (csp>CSSIZE)
5311019Sshannon error(FATAL,"converted token %.25s... too long",p1);
5411019Sshannon }
5511019Sshannon cs[csp] = '\0';
5611019Sshannon p = cs;
5711019Sshannon lfont[yyval] = lf;
5811019Sshannon rfont[yyval] = rf;
5911019Sshannon }
6011019Sshannon if(dbg)printf(".\t%dtext: S%d <- %s; b=%d,h=%d,lf=%c,rf=%c\n",
6111019Sshannon t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval]);
6211019Sshannon printf(".ds %d \"%s\n", yyval, p);
6311019Sshannon }
6411019Sshannon
trans(c,p1)6511019Sshannon trans(c,p1) int c; char *p1; {
6611019Sshannon int f;
6711019Sshannon f = ROM;
6811019Sshannon switch( c) {
6911019Sshannon case '0': case '1': case '2': case '3': case '4':
7011019Sshannon case '5': case '6': case '7': case '8': case '9':
7111019Sshannon case ':': case ';': case '!': case '%':
7211019Sshannon case '(': case '[': case ')': case ']':
7311019Sshannon case ',':
7411019Sshannon if (rf == ITAL)
7511019Sshannon shim();
7611019Sshannon roman(c); break;
7711019Sshannon case '.':
7811019Sshannon if (rf == ROM)
7911019Sshannon roman(c);
8011019Sshannon else
8111019Sshannon cs[csp++] = c;
8211019Sshannon f = rf;
8311019Sshannon break;
8411019Sshannon case '|':
8511019Sshannon if (rf == ITAL)
8611019Sshannon shim();
8711019Sshannon shim(); roman(c); shim(); break;
8811019Sshannon case '=':
8911019Sshannon if (rf == ITAL)
9011019Sshannon shim();
9111019Sshannon name4('e','q');
9211019Sshannon break;
9311019Sshannon case '+':
9411019Sshannon if (rf == ITAL)
9511019Sshannon shim();
9611019Sshannon name4('p', 'l');
9711019Sshannon break;
9811019Sshannon case '>': case '<':
9911019Sshannon if (rf == ITAL)
10011019Sshannon shim();
10111019Sshannon if (p1[psp]=='=') { /* look ahead for == <= >= */
10211019Sshannon name4(c,'=');
10311019Sshannon psp++;
10411019Sshannon } else {
10511019Sshannon cs[csp++] = c;
10611019Sshannon }
10711019Sshannon break;
10811019Sshannon case '-':
10911019Sshannon if (rf == ITAL)
11011019Sshannon shim();
11111019Sshannon if (p1[psp]=='>') {
11211019Sshannon name4('-','>'); psp++;
11311019Sshannon } else {
11411019Sshannon name4('m','i');
11511019Sshannon }
11611019Sshannon break;
11711019Sshannon case '/':
11811019Sshannon if (rf == ITAL)
11911019Sshannon shim();
12011019Sshannon name4('s','l');
12111019Sshannon break;
12211019Sshannon case '~': case ' ':
12311019Sshannon shim(); shim(); break;
12411019Sshannon case '^':
12511019Sshannon shim(); break;
12611019Sshannon case '\\': /* troff - pass 2 or 3 more chars */
12711019Sshannon if (rf == ITAL)
12811019Sshannon shim();
12911019Sshannon cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
13011019Sshannon if (c=='(') cs[csp++] = p1[psp++];
13111019Sshannon if (c=='*' && cs[csp-1] == '(') {
13211019Sshannon cs[csp++] = p1[psp++];
13311019Sshannon cs[csp++] = p1[psp++];
13411019Sshannon }
13511019Sshannon break;
13611019Sshannon case '\'':
13711019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM;
13811019Sshannon name4('f','m');
13911019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
14011019Sshannon f = rf==ITAL ? ITAL : ROM;
14111019Sshannon break;
14211019Sshannon
14311019Sshannon case 'f':
14411019Sshannon if (ft == ITAL) {
14511019Sshannon cs[csp++] = '\\'; cs[csp++] = '^';
14611019Sshannon cs[csp++] = 'f';
14711019Sshannon cs[csp++] = '\\'; cs[csp++] = '|'; /* trying | instead of ^ */
14811019Sshannon f = ITAL;
14911019Sshannon }
15011019Sshannon else
15111019Sshannon cs[csp++] = 'f';
15211019Sshannon break;
15311019Sshannon case 'j':
15411019Sshannon if (ft == ITAL) {
15511019Sshannon cs[csp++] = '\\'; cs[csp++] = '^';
15611019Sshannon cs[csp++] = 'j';
15711019Sshannon f = ITAL;
15811019Sshannon }
15911019Sshannon else
16011019Sshannon cs[csp++] = 'j';
16111019Sshannon break;
16211019Sshannon default:
16311019Sshannon cs[csp++] = c;
16411019Sshannon f = ft==ITAL ? ITAL : ROM;
16511019Sshannon break;
16611019Sshannon }
16711019Sshannon return(f);
16811019Sshannon }
16911019Sshannon
shim()17011019Sshannon shim() {
17111019Sshannon cs[csp++] = '\\'; cs[csp++] = '|';
17211019Sshannon }
17311019Sshannon
roman(c)17411019Sshannon roman(c) int c; {
17511019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = ROM;
17611019Sshannon cs[csp++] = c;
17711019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
17811019Sshannon }
17911019Sshannon
name4(c1,c2)18011019Sshannon name4(c1,c2) int c1,c2; {
18111019Sshannon cs[csp++] = '\\';
18211019Sshannon cs[csp++] = '(';
18311019Sshannon cs[csp++] = c1;
18411019Sshannon cs[csp++] = c2;
18511019Sshannon }
186