|
|
1.1 ! root 1: #include "e.h" ! 2: #include "y.tab.h" ! 3: #include <ctype.h> ! 4: ! 5: #define CSSIZE 1000 ! 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: int pclass; /* class of previous character */ ! 15: int nclass; /* class of next character */ ! 16: ! 17: int class[LAST][LAST] ={ /* guesswork, tuned to times roman postscript */ ! 18: ! 19: /*OT OL IL DG LP RP SL PL IF IJ VB */ ! 20: /*OT*/ { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 0 }, /* OTHER */ ! 21: /*OL*/ { 1, 0, 1, 1, 1, 1, 1, 2, 2, 2, 0 }, /* OLET */ ! 22: /*IL*/ { 1, 1, 0, 1, 1, 1, 1, 3, 2, 1, 0 }, /* ILET */ ! 23: /*DG*/ { 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 0 }, /* DIG */ ! 24: /*LP*/ { 1, 1, 1, 1, 1, 2, 1, 2, 3, 3, 0 }, /* LPAR */ ! 25: /*RP*/ { 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 0 }, /* RPAR */ ! 26: /*SL*/ { 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 0 }, /* SLASH */ ! 27: /*PL*/ { 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 0 }, /* PLUS */ ! 28: /*IF*/ { 3, 3, 1, 2, 2, 3, 2, 3, 0, 1, 1 }, /* ILETF */ ! 29: /*IJ*/ { 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0 }, /* ILETJ */ ! 30: /*VB*/ { 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 1 }, /* VBAR */ ! 31: ! 32: }; ! 33: ! 34: extern void shim(int, int); ! 35: extern void roman(int); ! 36: extern void sadd(char *); ! 37: extern void cadd(int); ! 38: extern int trans(int, char *); ! 39: ! 40: void text(int t, char *p1) /* convert text string p1 of type t */ ! 41: { ! 42: int c; ! 43: char *p; ! 44: tbl *tp; ! 45: ! 46: yyval = salloc(); ! 47: ebase[yyval] = 0; ! 48: eht[yyval] = EM(1.0, ps); /* ht in ems of orig size */ ! 49: lfont[yyval] = rfont[yyval] = ROM; ! 50: lclass[yyval] = rclass[yyval] = OTHER; ! 51: if (t == QTEXT) { ! 52: for (p = p1; *p; p++) /* scan for embedded \f's */ ! 53: if (*p == '\\' && *(p+1) == 'f') ! 54: break; ! 55: if (*p) /* if found \f, leave it alone and hope */ ! 56: p = p1; ! 57: else { ! 58: sprintf(cs, "\\f%s%s\\fP", ftp->name, p1); ! 59: p = cs; ! 60: } ! 61: } else if (t == SPACE) ! 62: p = "\\ "; ! 63: else if (t == THIN) ! 64: p = "\\|"; ! 65: else if (t == TAB) ! 66: p = "\\t"; ! 67: else if ((tp = lookup(restbl, p1)) != NULL) { ! 68: p = tp->cval; ! 69: } else { ! 70: lf = rf = 0; ! 71: lastft = 0; ! 72: nclass = NONE; /* get started with no class == no pad */ ! 73: csp = cs; ! 74: for (psp = p1; (c = *psp++) != '\0'; ) { ! 75: nextft = ft; ! 76: pclass = nclass; ! 77: rf = trans(c, p1); ! 78: if (lf == 0) { ! 79: lf = rf; /* left stuff is first found */ ! 80: lclass[yyval] = nclass; ! 81: } ! 82: if (csp-cs > CSSIZE) ! 83: ERROR "converted token %.25s... too long", p1 FATAL ; ! 84: } ! 85: sadd("\\fP"); ! 86: *csp = '\0'; ! 87: p = cs; ! 88: lfont[yyval] = lf; ! 89: rfont[yyval] = rf; ! 90: rclass[yyval] = nclass; ! 91: } ! 92: dprintf(".\t%dtext: S%d <- %s; b=%g,h=%g,lf=%c,rf=%c,ps=%d\n", ! 93: t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval], ps); ! 94: printf(".ds %d \"%s\n", yyval, p); ! 95: } ! 96: ! 97: trans(int c, char *p1) ! 98: { ! 99: int f; ! 100: ! 101: if (isalpha(c) && ft == ITAL && c != 'f' && c != 'j') { /* italic letter */ ! 102: shim(pclass, nclass = ILET); ! 103: cadd(c); ! 104: return ITAL; ! 105: } ! 106: if (isalpha(c) && ft != ITAL) { /* other letter */ ! 107: shim(pclass, nclass = OLET); ! 108: cadd(c); ! 109: return ROM; ! 110: } ! 111: if (isdigit(c)) { ! 112: shim(pclass, nclass = DIG); ! 113: roman(c); ! 114: return ROM; /* this is the right side font of this object */ ! 115: } ! 116: f = ROM; ! 117: nclass = OTHER; ! 118: switch (c) { ! 119: case ':': case ';': case '!': case '%': case '?': ! 120: shim(pclass, nclass); ! 121: roman(c); ! 122: return f; ! 123: case '(': case '[': ! 124: shim(pclass, nclass = LPAR); ! 125: roman(c); ! 126: return f; ! 127: case ')': case ']': ! 128: shim(pclass, nclass = RPAR); ! 129: roman(c); ! 130: return f; ! 131: case ',': ! 132: shim(pclass, nclass = OTHER); ! 133: roman(c); ! 134: return f; ! 135: case '.': ! 136: if (rf == ROM) ! 137: roman(c); ! 138: else ! 139: cadd(c); ! 140: return f; ! 141: case '|': /* postscript needs help with default width! */ ! 142: shim(pclass, nclass = VBAR); ! 143: sadd("\\v'.17m'\\z|\\v'-.17m'\\|"); /* and height */ ! 144: return f; ! 145: case '=': ! 146: shim(pclass, nclass = PLUS); ! 147: sadd("\\(eq"); ! 148: return f; ! 149: case '+': ! 150: shim(pclass, nclass = PLUS); ! 151: sadd("\\(pl"); ! 152: return f; ! 153: case '>': ! 154: case '<': /* >, >=, >>, <, <-, <=, << */ ! 155: shim(pclass, nclass = PLUS); ! 156: if (*psp == '=') { ! 157: sadd(c == '<' ? "\\(<=" : "\\(>="); ! 158: psp++; ! 159: } else if (c == '<' && *psp == '-') { /* <- only */ ! 160: sadd("\\(<-"); ! 161: psp++; ! 162: } else if (*psp == c) { /* << or >> */ ! 163: cadd(c); ! 164: cadd(c); ! 165: *psp++; ! 166: } else { ! 167: cadd(c); ! 168: } ! 169: return f; ! 170: case '-': ! 171: shim(pclass, nclass = PLUS); /* probably too big for ->'s */ ! 172: if (*psp == '>') { ! 173: sadd("\\(->"); ! 174: psp++; ! 175: } else { ! 176: sadd("\\(mi"); ! 177: } ! 178: return f; ! 179: case '/': ! 180: shim(pclass, nclass = SLASH); ! 181: cadd('/'); ! 182: return f; ! 183: case '~': ! 184: case ' ': ! 185: sadd("\\|\\|"); ! 186: return f; ! 187: case '^': ! 188: sadd("\\|"); ! 189: return f; ! 190: case '\\': /* troff - pass only \(xx without comment */ ! 191: shim(pclass, nclass); ! 192: cadd('\\'); ! 193: cadd(c = *psp++); ! 194: if (c == '(' && *psp && *(psp+1)) { ! 195: cadd(*psp++); ! 196: cadd(*psp++); ! 197: } else ! 198: fprintf(stderr, "eqn warning: unquoted troff command \\%c, line %d, file %s\n", ! 199: c, curfile->lineno, curfile->fname); ! 200: return f; ! 201: case '\'': ! 202: shim(pclass, nclass); ! 203: sadd("\\(fm"); ! 204: return f; ! 205: ! 206: case 'f': ! 207: if (ft == ITAL) { ! 208: shim(pclass, nclass = ILETF); ! 209: cadd('f'); ! 210: f = ITAL; ! 211: } else ! 212: cadd('f'); ! 213: return f; ! 214: case 'j': ! 215: if (ft == ITAL) { ! 216: shim(pclass, nclass = ILETJ); ! 217: cadd('j'); ! 218: f = ITAL; ! 219: } else ! 220: cadd('j'); ! 221: return f; ! 222: default: ! 223: shim(pclass, nclass); ! 224: cadd(c); ! 225: return ft==ITAL ? ITAL : ROM; ! 226: } ! 227: } ! 228: ! 229: char *pad(int n) /* return the padding as a string */ ! 230: { ! 231: static char buf[20]; ! 232: ! 233: buf[0] = 0; ! 234: if (n < 0) { ! 235: sprintf(buf, "\\h'-%du*\\w'\\^'u'", -n); ! 236: return buf; ! 237: } ! 238: for ( ; n > 1; n -= 2) ! 239: strcat(buf, "\\|"); ! 240: if (n > 0) ! 241: strcat(buf, "\\^"); ! 242: return buf; ! 243: } ! 244: ! 245: void shim(int lc, int rc) /* add padding space suitable to left and right classes */ ! 246: { ! 247: sadd(pad(class[lc][rc])); ! 248: } ! 249: ! 250: void roman(int c) /* add char c in "roman" font */ ! 251: { ! 252: nextft = ROM; ! 253: cadd(c); ! 254: } ! 255: ! 256: void sadd(char *s) /* add string s to cs */ ! 257: { ! 258: while (*s) ! 259: cadd(*s++); ! 260: } ! 261: ! 262: void cadd(int c) /* add char c to end of cs */ ! 263: { ! 264: char *p; ! 265: ! 266: if (lastft != nextft) { ! 267: if (lastft != 0) { ! 268: *csp++ = '\\'; ! 269: *csp++ = 'f'; ! 270: *csp++ = 'P'; ! 271: } ! 272: *csp++ = '\\'; ! 273: *csp++ = 'f'; ! 274: if (ftp == ftstack) { /* bottom level */ ! 275: if (ftp->ft == ITAL) /* usual case */ ! 276: *csp++ = nextft; ! 277: else /* gfont set, use it */ ! 278: for (p = ftp->name; *csp = *p++; ) ! 279: csp++; ! 280: } else { /* inside some kind of font ... */ ! 281: for (p = ftp->name; *csp = *p++; ) ! 282: csp++; ! 283: } ! 284: lastft = nextft; ! 285: } ! 286: *csp++ = c; ! 287: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.