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