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