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