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