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