1*11019Sshannon /* text.c 4.1 83/02/11 */ 2*11019Sshannon 3*11019Sshannon # include "e.h" 4*11019Sshannon # include "e.def" 5*11019Sshannon 6*11019Sshannon int csp; 7*11019Sshannon int psp; 8*11019Sshannon #define CSSIZE 400 9*11019Sshannon char cs[420]; 10*11019Sshannon 11*11019Sshannon int lf, rf; /* temporary spots for left and right fonts */ 12*11019Sshannon 13*11019Sshannon text(t,p1) int t; char *p1; { 14*11019Sshannon int c; 15*11019Sshannon char *p; 16*11019Sshannon tbl *tp, *lookup(); 17*11019Sshannon extern tbl *restbl; 18*11019Sshannon 19*11019Sshannon yyval = oalloc(); 20*11019Sshannon ebase[yyval] = 0; 21*11019Sshannon eht[yyval] = VERT(6 * ((ps>6)?ps:6)); /* ht in machine units */ 22*11019Sshannon lfont[yyval] = rfont[yyval] = ROM; 23*11019Sshannon if (t == QTEXT) 24*11019Sshannon p = p1; 25*11019Sshannon else if ( t == SPACE ) 26*11019Sshannon p = "\\ "; 27*11019Sshannon else if ( t == THIN ) 28*11019Sshannon p = "\\|"; 29*11019Sshannon else if ( t == TAB ) 30*11019Sshannon p = "\\t"; 31*11019Sshannon else if ((tp = lookup(&restbl, p1, NULL)) != NULL) 32*11019Sshannon p = tp->defn; 33*11019Sshannon else { 34*11019Sshannon lf = rf = 0; 35*11019Sshannon for (csp=psp=0; (c=p1[psp++])!='\0';) { 36*11019Sshannon rf = trans(c, p1); 37*11019Sshannon if (lf == 0) 38*11019Sshannon lf = rf; /* save first */ 39*11019Sshannon if (csp>CSSIZE) 40*11019Sshannon error(FATAL,"converted token %.25s... too long",p1); 41*11019Sshannon } 42*11019Sshannon cs[csp] = '\0'; 43*11019Sshannon p = cs; 44*11019Sshannon lfont[yyval] = lf; 45*11019Sshannon rfont[yyval] = rf; 46*11019Sshannon } 47*11019Sshannon if(dbg)printf(".\t%dtext: S%d <- %s; b=%d,h=%d,lf=%c,rf=%c\n", 48*11019Sshannon t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval]); 49*11019Sshannon printf(".ds %d \"%s\n", yyval, p); 50*11019Sshannon } 51*11019Sshannon 52*11019Sshannon trans(c,p1) int c; char *p1; { 53*11019Sshannon int f; 54*11019Sshannon f = ROM; 55*11019Sshannon switch( c) { 56*11019Sshannon case '0': case '1': case '2': case '3': case '4': 57*11019Sshannon case '5': case '6': case '7': case '8': case '9': 58*11019Sshannon case ':': case ';': case '!': case '%': 59*11019Sshannon case '(': case '[': case ')': case ']': 60*11019Sshannon case ',': 61*11019Sshannon if (rf == ITAL) 62*11019Sshannon shim(); 63*11019Sshannon roman(c); break; 64*11019Sshannon case '.': 65*11019Sshannon if (rf == ROM) 66*11019Sshannon roman(c); 67*11019Sshannon else 68*11019Sshannon cs[csp++] = c; 69*11019Sshannon f = rf; 70*11019Sshannon break; 71*11019Sshannon case '|': 72*11019Sshannon if (rf == ITAL) 73*11019Sshannon shim(); 74*11019Sshannon shim(); roman(c); shim(); break; 75*11019Sshannon case '=': 76*11019Sshannon if (rf == ITAL) 77*11019Sshannon shim(); 78*11019Sshannon name4('e','q'); 79*11019Sshannon break; 80*11019Sshannon case '+': 81*11019Sshannon if (rf == ITAL) 82*11019Sshannon shim(); 83*11019Sshannon name4('p', 'l'); 84*11019Sshannon break; 85*11019Sshannon case '>': case '<': 86*11019Sshannon if (rf == ITAL) 87*11019Sshannon shim(); 88*11019Sshannon if (p1[psp]=='=') { /* look ahead for == <= >= */ 89*11019Sshannon name4(c,'='); 90*11019Sshannon psp++; 91*11019Sshannon } else { 92*11019Sshannon cs[csp++] = c; 93*11019Sshannon } 94*11019Sshannon break; 95*11019Sshannon case '-': 96*11019Sshannon if (rf == ITAL) 97*11019Sshannon shim(); 98*11019Sshannon if (p1[psp]=='>') { 99*11019Sshannon name4('-','>'); psp++; 100*11019Sshannon } else { 101*11019Sshannon name4('m','i'); 102*11019Sshannon } 103*11019Sshannon break; 104*11019Sshannon case '/': 105*11019Sshannon if (rf == ITAL) 106*11019Sshannon shim(); 107*11019Sshannon name4('s','l'); 108*11019Sshannon break; 109*11019Sshannon case '~': case ' ': 110*11019Sshannon shim(); shim(); break; 111*11019Sshannon case '^': 112*11019Sshannon shim(); break; 113*11019Sshannon case '\\': /* troff - pass 2 or 3 more chars */ 114*11019Sshannon if (rf == ITAL) 115*11019Sshannon shim(); 116*11019Sshannon cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++]; 117*11019Sshannon if (c=='(') cs[csp++] = p1[psp++]; 118*11019Sshannon if (c=='*' && cs[csp-1] == '(') { 119*11019Sshannon cs[csp++] = p1[psp++]; 120*11019Sshannon cs[csp++] = p1[psp++]; 121*11019Sshannon } 122*11019Sshannon break; 123*11019Sshannon case '\'': 124*11019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM; 125*11019Sshannon name4('f','m'); 126*11019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P'; 127*11019Sshannon f = rf==ITAL ? ITAL : ROM; 128*11019Sshannon break; 129*11019Sshannon 130*11019Sshannon case 'f': 131*11019Sshannon if (ft == ITAL) { 132*11019Sshannon cs[csp++] = '\\'; cs[csp++] = '^'; 133*11019Sshannon cs[csp++] = 'f'; 134*11019Sshannon cs[csp++] = '\\'; cs[csp++] = '|'; /* trying | instead of ^ */ 135*11019Sshannon f = ITAL; 136*11019Sshannon } 137*11019Sshannon else 138*11019Sshannon cs[csp++] = 'f'; 139*11019Sshannon break; 140*11019Sshannon case 'j': 141*11019Sshannon if (ft == ITAL) { 142*11019Sshannon cs[csp++] = '\\'; cs[csp++] = '^'; 143*11019Sshannon cs[csp++] = 'j'; 144*11019Sshannon f = ITAL; 145*11019Sshannon } 146*11019Sshannon else 147*11019Sshannon cs[csp++] = 'j'; 148*11019Sshannon break; 149*11019Sshannon default: 150*11019Sshannon cs[csp++] = c; 151*11019Sshannon f = ft==ITAL ? ITAL : ROM; 152*11019Sshannon break; 153*11019Sshannon } 154*11019Sshannon return(f); 155*11019Sshannon } 156*11019Sshannon 157*11019Sshannon shim() { 158*11019Sshannon cs[csp++] = '\\'; cs[csp++] = '|'; 159*11019Sshannon } 160*11019Sshannon 161*11019Sshannon roman(c) int c; { 162*11019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = ROM; 163*11019Sshannon cs[csp++] = c; 164*11019Sshannon cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P'; 165*11019Sshannon } 166*11019Sshannon 167*11019Sshannon name4(c1,c2) int c1,c2; { 168*11019Sshannon cs[csp++] = '\\'; 169*11019Sshannon cs[csp++] = '('; 170*11019Sshannon cs[csp++] = c1; 171*11019Sshannon cs[csp++] = c2; 172*11019Sshannon } 173