|
|
1.1 ! root 1: # include "e.h" ! 2: #define MAXLINE 3600 /* maximum input line */ ! 3: ! 4: char in[MAXLINE]; /* input buffer */ ! 5: int noeqn; ! 6: char *cmdname; ! 7: ! 8: main(argc,argv) ! 9: int argc; ! 10: char *argv[]; ! 11: { ! 12: exit(eqn(argc, argv)); ! 13: } ! 14: ! 15: eqn(argc,argv) ! 16: int argc; ! 17: char *argv[]; ! 18: { ! 19: int i, type; ! 20: char *p, *getenv(), buf[20]; ! 21: ! 22: cmdname = argv[0]; ! 23: if (p = getenv("TYPESETTER")) ! 24: typesetter = p; ! 25: while (argc > 1 && argv[1][0] == '-') { ! 26: switch (argv[1][1]) { ! 27: ! 28: case 'd': ! 29: if (argv[1][2] == '\0') ! 30: dbg++; ! 31: else { ! 32: lefteq = argv[1][2]; ! 33: righteq = argv[1][3]; ! 34: } ! 35: break; ! 36: case 's': szstack[0] = gsize = atoi(&argv[1][2]); break; ! 37: case 'p': deltaps = atoi(&argv[1][2]); dps_set = 1; break; ! 38: case 'm': minsize = atoi(&argv[1][2]); break; ! 39: case 'f': strcpy(ftstack[0].name,&argv[1][2]); break; ! 40: case 'e': noeqn++; break; ! 41: case 'T': typesetter = &argv[1][2]; break; ! 42: default: ! 43: fprintf(stderr, "%s: unknown option %s\n", cmdname, argv[1]); ! 44: break; ! 45: } ! 46: argc--; ! 47: argv++; ! 48: } ! 49: settype(typesetter); ! 50: sprintf(buf, "\"%s\"", typesetter); ! 51: lookup(deftbl, strsave(typesetter), strsave(buf)); ! 52: init_tbl(); /* install other keywords in tables */ ! 53: curfile = infile; ! 54: pushsrc(File, curfile); ! 55: if (argc <= 1) { ! 56: curfile->fin = stdin; ! 57: curfile->fname = strsave("-"); ! 58: getdata(); ! 59: } else ! 60: while (argc-- > 1) { ! 61: if (strcmp(*++argv, "-") == 0) ! 62: curfile->fin = stdin; ! 63: else if ((curfile->fin = fopen(*argv, "r")) == NULL) ! 64: fatal("can't open file %s", *argv); ! 65: curfile->fname = strsave(*argv); ! 66: getdata(); ! 67: if (curfile->fin != stdin) ! 68: fclose(curfile->fin); ! 69: } ! 70: return 0; ! 71: } ! 72: ! 73: settype(s) /* initialize data for particular typesetter */ ! 74: char *s; /* the minsize could profitably come from the */ ! 75: { /* troff description file /usr/lib/font/dev.../DESC.out */ ! 76: if (strcmp(s, "202") == 0) ! 77: { minsize = 5; ttype = DEV202; } ! 78: else if (strcmp(s, "aps") == 0) ! 79: { minsize = 5; ttype = DEVAPS; } ! 80: else if (strcmp(s, "cat") == 0) ! 81: { minsize = 6; ttype = DEVCAT; } ! 82: else ! 83: { minsize = 6; ttype = DEVCAT; } ! 84: } ! 85: ! 86: getdata() ! 87: { ! 88: register FILE *fin; ! 89: int i, type, ln; ! 90: char fname[100]; ! 91: extern int errno; ! 92: ! 93: errno = 0; ! 94: fin = curfile->fin; ! 95: curfile->lineno = 0; ! 96: printf(".lf 1 %s\n", curfile->fname); ! 97: while ((type = getline(in)) != EOF) { ! 98: if (in[0] == '.' && in[1] == 'E' && in[2] == 'Q') { ! 99: for (i = 11; i < 100; i++) ! 100: used[i] = 0; ! 101: printf("%s", in); ! 102: if (markline) { /* turn off from last time */ ! 103: printf(".nr MK 0\n"); ! 104: markline = 0; ! 105: } ! 106: display = 1; ! 107: init(); ! 108: yyparse(); ! 109: if (eqnreg > 0) { ! 110: if (markline) ! 111: printf(".nr MK %d\n", markline); /* for -ms macros */ ! 112: printf(".if %gm>\\n(.v .ne %gm\n", eqnht, eqnht); ! 113: printf(".rn %d 10\n", eqnreg); ! 114: if (!noeqn) ! 115: printf("\\&\\*(10\n"); ! 116: } ! 117: printf(".EN"); ! 118: while (putchar(input()) != '\n') ! 119: ; ! 120: printf(".lf %d\n", curfile->lineno+1); ! 121: } ! 122: else if (type == lefteq) ! 123: inline(); ! 124: else if (in[0] == '.' && in[1] == 'l' && in[2] == 'f') { ! 125: if (sscanf(in+3, "%d %s", &ln, fname) == 2) { ! 126: free(curfile->fname); ! 127: printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = strsave(fname)); ! 128: } else ! 129: printf(".lf %d\n", curfile->lineno = ln); ! 130: } else ! 131: printf("%s", in); ! 132: } ! 133: return(0); ! 134: } ! 135: ! 136: getline(s) ! 137: register char *s; ! 138: { ! 139: register c; ! 140: ! 141: while ((c=input()) != '\n' && c != EOF && c != lefteq) { ! 142: if (s >= in+MAXLINE) { ! 143: error("input line too long: %.20s\n", in); ! 144: in[MAXLINE] = '\0'; ! 145: break; ! 146: } ! 147: *s++ = c; ! 148: } ! 149: if (c != lefteq) ! 150: *s++ = c; ! 151: *s = '\0'; ! 152: return(c); ! 153: } ! 154: ! 155: inline() ! 156: { ! 157: int ds, n, sz1 = 0; ! 158: ! 159: n = curfile->lineno; ! 160: if (szstack[0] != 0) ! 161: printf(".nr %d \\n(.s\n", sz1 = salloc()); ! 162: ds = salloc(); ! 163: printf(".rm %d \n", ds); ! 164: display = 0; ! 165: do { ! 166: if (*in) ! 167: printf(".as %d \"%s\n", ds, in); ! 168: init(); ! 169: yyparse(); ! 170: if (eqnreg > 0) { ! 171: printf(".as %d \\*(%d\n", ds, eqnreg); ! 172: sfree(eqnreg); ! 173: printf(".lf %d\n", curfile->lineno+1); ! 174: } ! 175: } while (getline(in) == lefteq); ! 176: if (*in) ! 177: printf(".as %d \"%s", ds, in); ! 178: if (sz1) ! 179: printf("\\s\\n(%d", sz1); ! 180: printf("\\*(%d\n", ds); ! 181: printf(".lf %d\n", curfile->lineno+1); ! 182: if (curfile->lineno > n+3) ! 183: fprintf(stderr, "eqn warning: multi-line %c...%c, lines %d-%d, file %s\n", ! 184: lefteq, righteq, n, curfile->lineno, curfile->fname); ! 185: sfree(ds); ! 186: if (sz1) sfree(sz1); ! 187: } ! 188: ! 189: putout(p1) ! 190: int p1; ! 191: { ! 192: float before, after; ! 193: extern float BeforeSub, AfterSub; ! 194: ! 195: dprintf(".\tanswer <- S%d, h=%g,b=%g\n",p1, eht[p1], ebase[p1]); ! 196: eqnht = eht[p1]; ! 197: before = eht[p1] - ebase[p1] - BeforeSub; /* leave room for sub or superscript */ ! 198: after = ebase[p1] - AfterSub; ! 199: if (spaceval || before > 0.01 || after > 0.01) { ! 200: printf(".ds %d ", p1); /* used to be \\x'0' here: why? */ ! 201: if (spaceval != NULL) ! 202: printf("\\x'0-%s'", spaceval); ! 203: else if (before > 0.01) ! 204: printf("\\x'0-%gm'", before); ! 205: printf("\\*(%d", p1); ! 206: if (spaceval == NULL && after > 0.01) ! 207: printf("\\x'%gm'", after); ! 208: putchar('\n'); ! 209: } ! 210: if (szstack[0] != 0) ! 211: printf(".ds %d %s\\*(%d\\s\\n(99\n", p1, DPS(gsize,gsize), p1); ! 212: eqnreg = p1; ! 213: if (spaceval != NULL) { ! 214: free(spaceval); ! 215: spaceval = NULL; ! 216: } ! 217: } ! 218: ! 219: init() ! 220: { ! 221: synerr = 0; ! 222: ct = 0; ! 223: ps = gsize; ! 224: ftp = ftstack; ! 225: ft = ftp->ft; ! 226: nszstack = 0; ! 227: if (szstack[0] != 0) /* absolute gsize in effect */ ! 228: printf(".nr 99 \\n(.s\n"); ! 229: } ! 230: ! 231: salloc() ! 232: { ! 233: int i; ! 234: ! 235: for (i = 11; i < 100; i++) ! 236: if (used[i] == 0) { ! 237: used[i]++; ! 238: return(i); ! 239: } ! 240: error(FATAL, "no eqn strings left (%d)", i); ! 241: return(0); ! 242: } ! 243: ! 244: sfree(n) ! 245: int n; ! 246: { ! 247: used[n] = 0; ! 248: } ! 249: ! 250: nrwid(n1, p, n2) ! 251: int n1, p, n2; ! 252: { ! 253: printf(".nr %d 0\\w'%s\\*(%d'\n", n1, DPS(gsize,p), n2); /* 0 defends against - width */ ! 254: } ! 255: ! 256: char *ABSPS(dn) /* absolute size dn in printable form \sd or \s(dd (dd >= 40) */ ! 257: int dn; ! 258: { ! 259: static char buf[100], *lb = buf; ! 260: char *p; ! 261: ! 262: if (lb > buf + sizeof(buf) - 10) ! 263: lb = buf; ! 264: p = lb; ! 265: *lb++ = '\\'; ! 266: *lb++ = 's'; ! 267: if (dn >= 10) { /* \s(dd only works in new troff */ ! 268: if (dn >= 40) ! 269: *lb++ = '('; ! 270: *lb++ = dn/10 + '0'; ! 271: *lb++ = dn%10 + '0'; ! 272: } else { ! 273: *lb++ = dn + '0'; ! 274: } ! 275: *lb++ = '\0'; ! 276: return p; ! 277: } ! 278: ! 279: char *DPS(f, t) /* delta ps (t-f) in printable form \s+d or \s-d or \s+-(dd */ ! 280: int f, t; ! 281: { ! 282: static char buf[100], *lb = buf; ! 283: char *p; ! 284: int dn; ! 285: ! 286: if (lb > buf + sizeof(buf) - 10) ! 287: lb = buf; ! 288: p = lb; ! 289: *lb++ = '\\'; ! 290: *lb++ = 's'; ! 291: dn = EFFPS(t) - EFFPS(f); ! 292: if (szstack[nszstack] != 0) /* absolute */ ! 293: dn = EFFPS(t); /* should do proper \s(dd */ ! 294: else if (dn >= 0) ! 295: *lb++ = '+'; ! 296: else { ! 297: *lb++ = '-'; ! 298: dn = -dn; ! 299: } ! 300: if (dn >= 10) { /* \s+(dd only works in new troff */ ! 301: *lb++ = '('; ! 302: *lb++ = dn/10 + '0'; ! 303: *lb++ = dn%10 + '0'; ! 304: } else { ! 305: *lb++ = dn + '0'; ! 306: } ! 307: *lb++ = '\0'; ! 308: return p; ! 309: } ! 310: ! 311: EFFPS(n) /* effective value of n */ ! 312: int n; ! 313: { ! 314: if (n >= minsize) ! 315: return n; ! 316: else ! 317: return minsize; ! 318: } ! 319: ! 320: double EM(m, ps) /* convert m to ems in gsize */ ! 321: double m; ! 322: int ps; ! 323: { ! 324: m *= (float) EFFPS(ps) / gsize; ! 325: if (m <= 0.001 && m >= -0.001) ! 326: return 0; ! 327: else ! 328: return m; ! 329: } ! 330: ! 331: double REL(m, ps) /* convert m to ems in ps */ ! 332: double m; ! 333: int ps; ! 334: { ! 335: m *= (float) gsize / EFFPS(ps); ! 336: if (m <= 0.001 && m >= -0.001) ! 337: return 0; ! 338: else ! 339: return m; ! 340: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.