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