|
|
1.1 ! root 1: #include "e.h" ! 2: #include "y.tab.h" ! 3: #include <ctype.h> ! 4: ! 5: #define CSSIZE 400 ! 6: char cs[CSSIZE+20]; /* text string converted into this */ ! 7: char *csp; /* next spot in cs[] */ ! 8: char *psp; /* next character in input token */ ! 9: ! 10: int lf, rf; /* temporary spots for left and right fonts */ ! 11: int lastft; /* last \f added */ ! 12: int nextft; /* next \f to be added */ ! 13: ! 14: text(t, p1) /* convert text string p1 of type t */ ! 15: int t; ! 16: char *p1; ! 17: { ! 18: int c; ! 19: char *p; ! 20: tbl *tp; ! 21: ! 22: yyval = salloc(); ! 23: ebase[yyval] = 0; ! 24: eht[yyval] = EM(1.0, ps); /* ht in ems of orig size */ ! 25: eps[yyval] = ps; ! 26: lfont[yyval] = rfont[yyval] = ROM; ! 27: if (t == QTEXT) { ! 28: for (p = p1; *p; p++) /* scan for embedded \f's */ ! 29: if (*p == '\\' && *(p+1) == 'f') ! 30: break; ! 31: if (*p) /* if found \f, leave it alone and hope */ ! 32: p = p1; ! 33: else { ! 34: sprintf(cs, "\\f%s%s\\fP", ftp->name, p1); ! 35: p = cs; ! 36: } ! 37: } else if (t == SPACE) ! 38: p = "\\ "; ! 39: else if (t == THIN) ! 40: p = "\\|"; ! 41: else if (t == TAB) ! 42: p = "\\t"; ! 43: else if ((tp = lookup(restbl, p1, NULL)) != NULL) { ! 44: p = tp->defn; ! 45: } else { ! 46: lf = rf = 0; ! 47: /* sprintf(cs, "\\f%s", ftp->name); */ ! 48: lastft = 0; ! 49: csp = cs; ! 50: for (psp = p1; (c = *psp++) != '\0'; ) { ! 51: nextft = ft; ! 52: rf = trans(c, p1); ! 53: if (lf == 0) ! 54: lf = rf; /* save first */ ! 55: if (csp-cs > CSSIZE) ! 56: error(FATAL,"converted token %.25s... too long",p1); ! 57: } ! 58: sadd("\\fP"); ! 59: *csp = '\0'; ! 60: p = cs; ! 61: lfont[yyval] = lf; ! 62: rfont[yyval] = rf; ! 63: } ! 64: dprintf(".\t%dtext: S%d <- %s; b=%g,h=%g,lf=%c,rf=%c,ps=%d\n", ! 65: t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval], ps); ! 66: printf(".ds %d \"%s\n", yyval, p); ! 67: } ! 68: ! 69: trans(c, p1) ! 70: int c; ! 71: char *p1; ! 72: { ! 73: int f; ! 74: ! 75: f = ROM; ! 76: switch (c) { ! 77: case '0': case '1': case '2': case '3': case '4': ! 78: case '5': case '6': case '7': case '8': case '9': ! 79: case ':': case ';': case '!': case '%': case '?': ! 80: case '(': case '[': case ']': ! 81: if (rf == ITAL) ! 82: shim(); ! 83: roman(c); ! 84: break; ! 85: case ')': ! 86: if (rf == ITAL) ! 87: halfshim(); ! 88: roman(c); ! 89: break; ! 90: case ',': ! 91: roman(c); ! 92: halfshim(); ! 93: f = rf; ! 94: break; ! 95: case '.': ! 96: if (rf == ROM) ! 97: roman(c); ! 98: else ! 99: cadd(c); ! 100: f = rf; ! 101: break; ! 102: case '|': ! 103: if (rf == ITAL && ttype != DEV202) ! 104: shim(); ! 105: shim(); roman(c); shim(); ! 106: break; ! 107: case '=': ! 108: if (rf == ITAL) ! 109: shim(); ! 110: name4('e','q'); ! 111: break; ! 112: case '+': ! 113: if (rf == ITAL) ! 114: shim(); ! 115: name4('p','l'); ! 116: break; ! 117: case '>': case '<': ! 118: if (rf == ITAL) ! 119: shim(); ! 120: if (*psp == '=') { /* look ahead for == <= >= */ ! 121: name4(c,'='); ! 122: psp++; ! 123: } else { ! 124: cadd(c); ! 125: } ! 126: break; ! 127: case '-': ! 128: if (rf == ITAL) ! 129: shim(); ! 130: if (*psp == '>') { ! 131: name4('-','>'); ! 132: halfshim(); ! 133: psp++; ! 134: } else { ! 135: name4('m','i'); ! 136: } ! 137: break; ! 138: case '/': ! 139: halfshim(); ! 140: cadd('/'); ! 141: halfshim(); ! 142: break; ! 143: case '~': case ' ': ! 144: shim(); shim(); ! 145: break; ! 146: case '^': ! 147: shim(); ! 148: break; ! 149: case '\\': /* troff - pass only \(xx without comment */ ! 150: if (rf == ITAL) ! 151: shim(); ! 152: cadd('\\'); ! 153: cadd(c = *psp++); ! 154: if (c == '(' && *psp && *(psp+1)) { ! 155: cadd(*psp++); ! 156: cadd(*psp++); ! 157: } else ! 158: fprintf(stderr, "eqn warning: unquoted troff command \\%c, line %d, file %s\n", ! 159: c, curfile->lineno, curfile->fname); ! 160: break; ! 161: case '\'': ! 162: name4('f','m'); ! 163: break; ! 164: ! 165: case 'f': ! 166: if (ft == ITAL) { ! 167: if (psp == p1+1 || !isalnum(*(psp-2))) ! 168: halfshim(); ! 169: cadd('f'); ! 170: if (!isalpha(*psp) && *psp != '\0') /* add \| except in text */ ! 171: shim(); ! 172: f = ITAL; ! 173: } ! 174: else ! 175: cadd('f'); ! 176: break; ! 177: case 'j': ! 178: if (ft == ITAL) { ! 179: sadd("\\^j"); ! 180: f = ITAL; ! 181: } ! 182: else ! 183: cadd('j'); ! 184: break; ! 185: default: ! 186: cadd(c); ! 187: f = ft==ITAL ? ITAL : ROM; ! 188: break; ! 189: } ! 190: return(f); ! 191: } ! 192: ! 193: shim() /* add a \| space */ ! 194: { ! 195: sadd("\\|"); ! 196: } ! 197: ! 198: halfshim() /* add a \^ space */ ! 199: { ! 200: sadd("\\^"); ! 201: } ! 202: ! 203: roman(c) /* add char c in "roman" font */ ! 204: int c; ! 205: { ! 206: nextft = ROM; ! 207: cadd(c); ! 208: } ! 209: ! 210: name4(c1,c2) ! 211: int c1, c2; ! 212: { ! 213: sadd("\\("); ! 214: cadd(c1); ! 215: cadd(c2); ! 216: } ! 217: ! 218: sadd(s) /* add string s to cs */ ! 219: char *s; ! 220: { ! 221: while (*s) ! 222: cadd(*s++); ! 223: } ! 224: ! 225: cadd(c) /* add char c to end of cs */ ! 226: int c; ! 227: { ! 228: char *p; ! 229: ! 230: if (lastft != nextft) { ! 231: if (lastft != 0) { ! 232: *csp++ = '\\'; ! 233: *csp++ = 'f'; ! 234: *csp++ = 'P'; ! 235: } ! 236: *csp++ = '\\'; ! 237: *csp++ = 'f'; ! 238: if (ftp == ftstack) { /* bottom level */ ! 239: if (ftp->ft == ITAL) /* usual case */ ! 240: *csp++ = nextft; ! 241: else /* gfont set, use it */ ! 242: for (p = ftp->name; *csp = *p++; ) ! 243: csp++; ! 244: } else { /* inside some kind of font ... */ ! 245: for (p = ftp->name; *csp = *p++; ) ! 246: csp++; ! 247: } ! 248: lastft = nextft; ! 249: } ! 250: *csp++ = c; ! 251: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.