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