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