1*48252Sbostic /*-
2*48252Sbostic * Copyright (c) 1991 The Regents of the University of California.
3*48252Sbostic * All rights reserved.
4*48252Sbostic *
5*48252Sbostic * %sccs.include.proprietary.c%
6*48252Sbostic */
7*48252Sbostic
814486Ssam #ifndef lint
9*48252Sbostic char copyright[] =
10*48252Sbostic "@(#) Copyright (c) 1991 The Regents of the University of California.\n\
11*48252Sbostic All rights reserved.\n";
12*48252Sbostic #endif /* not lint */
1311007Sshannon
14*48252Sbostic #ifndef lint
15*48252Sbostic static char sccsid[] = "@(#)io.c 4.6 (Berkeley) 04/17/91";
16*48252Sbostic #endif /* not lint */
17*48252Sbostic
1811007Sshannon # include "e.h"
1911007Sshannon #define MAXLINE 1200 /* maximum input line */
2011007Sshannon
2111007Sshannon char in[MAXLINE]; /* input buffer */
2211007Sshannon int eqnexit();
2311007Sshannon int noeqn;
2411007Sshannon
main(argc,argv)2511007Sshannon main(argc,argv) int argc; char *argv[];{
2611007Sshannon
2711007Sshannon eqnexit(eqn(argc, argv));
2811007Sshannon }
2911007Sshannon
eqnexit(n)3011007Sshannon eqnexit(n) {
3111007Sshannon #ifdef gcos
3211007Sshannon if (n)
3311007Sshannon fprintf(stderr, "run terminated due to eqn error\n");
3411007Sshannon exit(0);
3511007Sshannon #endif
3611007Sshannon exit(n);
3711007Sshannon }
3811007Sshannon
eqn(argc,argv)3911007Sshannon eqn(argc,argv) int argc; char *argv[];{
4011007Sshannon int i, type;
4111007Sshannon
4211007Sshannon setfile(argc,argv);
4311007Sshannon init_tbl(); /* install keywords in tables */
4411007Sshannon while ((type=getline(in)) != EOF) {
4511007Sshannon eqline = linect;
4611007Sshannon if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
4711007Sshannon for (i=11; i<100; used[i++]=0);
4811007Sshannon printf("%s",in);
4911007Sshannon printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
5011007Sshannon markline = 0;
5111007Sshannon init();
5211007Sshannon yyparse();
5311007Sshannon if (eqnreg>0) {
5411007Sshannon printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
5511007Sshannon /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */
5611007Sshannon /* eqnreg, svargv[ifile], eqline, linect); */
5711007Sshannon printf(".nr MK %d\n", markline); /* for -ms macros */
5811007Sshannon printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
5911007Sshannon printf(".rn %d 10\n", eqnreg);
6011007Sshannon if(!noeqn)printf("\\*(10\n");
6111007Sshannon }
6211007Sshannon printf(".ps \\n(99\n.ft \\n(98\n");
6311007Sshannon printf(".EN");
6411007Sshannon if (lastchar == EOF) {
6511007Sshannon putchar('\n');
6611007Sshannon break;
6711007Sshannon }
6811007Sshannon if (putchar(lastchar) != '\n')
6911007Sshannon while (putchar(gtc()) != '\n');
7011007Sshannon }
7111007Sshannon else if (type == lefteq)
7235271Sbostic in_line();
7311007Sshannon else
7411007Sshannon printf("%s",in);
7511007Sshannon }
7611007Sshannon return(0);
7711007Sshannon }
7811007Sshannon
getline(s)7911007Sshannon getline(s) register char *s; {
8011007Sshannon register c;
8111007Sshannon while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
8211007Sshannon if (s >= in+MAXLINE) {
8311007Sshannon error( !FATAL, "input line too long: %.20s\n", in);
8411007Sshannon in[MAXLINE] = '\0';
8511007Sshannon break;
8611007Sshannon }
8711007Sshannon if (c==lefteq)
8811007Sshannon s--;
8911007Sshannon *s++ = '\0';
9011007Sshannon return(c);
9111007Sshannon }
9211007Sshannon
in_line()9335271Sbostic in_line() {
9411007Sshannon int ds;
9511007Sshannon
9611007Sshannon printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
9711007Sshannon ds = oalloc();
9811007Sshannon printf(".rm %d \n", ds);
9911007Sshannon do{
10011007Sshannon if (*in)
10111007Sshannon printf(".as %d \"%s\n", ds, in);
10211007Sshannon init();
10311007Sshannon yyparse();
10411007Sshannon if (eqnreg > 0) {
10511007Sshannon printf(".as %d \\*(%d\n", ds, eqnreg);
10611007Sshannon ofree(eqnreg);
10711007Sshannon }
10811007Sshannon printf(".ps \\n(99\n.ft \\n(98\n");
10911007Sshannon } while (getline(in) == lefteq);
11011007Sshannon if (*in)
11111007Sshannon printf(".as %d \"%s", ds, in);
11211007Sshannon printf(".ps \\n(99\n.ft \\n(98\n");
11311007Sshannon printf("\\*(%d\n", ds);
11411007Sshannon ofree(ds);
11511007Sshannon }
11611007Sshannon
putout(p1)11711007Sshannon putout(p1) int p1; {
11811007Sshannon extern int gsize, gfont;
11911007Sshannon int before, after;
12011007Sshannon if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
12111007Sshannon eqnht = eht[p1];
12211007Sshannon printf(".ds %d \\x'0'", p1);
12311007Sshannon /* suppposed to leave room for a subscript or superscript */
12411023Sshannon #ifndef NEQN
12511007Sshannon before = eht[p1] - ebase[p1] - VERT((ps*6*12)/10);
12611023Sshannon #else NEQN
12711023Sshannon before = eht[p1] - ebase[p1] - VERT(3); /* 3 = 1.5 lines */
12811023Sshannon #endif NEQN
12911007Sshannon if (before > 0)
13011007Sshannon printf("\\x'0-%du'", before);
13111007Sshannon printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
13211007Sshannon gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
13311023Sshannon #ifndef NEQN
13411007Sshannon after = ebase[p1] - VERT((ps*6*2)/10);
13511023Sshannon #else NEQN
13611023Sshannon after = ebase[p1] - VERT(1);
13711023Sshannon #endif NEQN
13811007Sshannon if (after > 0)
13911007Sshannon printf("\\x'%du'", after);
14011007Sshannon putchar('\n');
14111007Sshannon eqnreg = p1;
14211007Sshannon }
14311007Sshannon
max(i,j)14411007Sshannon max(i,j) int i,j; {
14511007Sshannon return (i>j ? i : j);
14611007Sshannon }
14711007Sshannon
oalloc()14811007Sshannon oalloc() {
14911007Sshannon int i;
15011007Sshannon for (i=11; i<100; i++)
15111007Sshannon if (used[i]++ == 0) return(i);
15211007Sshannon error( FATAL, "no eqn strings left", i);
15311007Sshannon return(0);
15411007Sshannon }
15511007Sshannon
ofree(n)15611007Sshannon ofree(n) int n; {
15711007Sshannon used[n] = 0;
15811007Sshannon }
15911007Sshannon
setps(p)16011007Sshannon setps(p) int p; {
16111007Sshannon printf(".ps %d\n", EFFPS(p));
16211007Sshannon }
16311007Sshannon
nrwid(n1,p,n2)16411007Sshannon nrwid(n1, p, n2) int n1, p, n2; {
16511007Sshannon printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
16611007Sshannon }
16711007Sshannon
setfile(argc,argv)16811007Sshannon setfile(argc, argv) int argc; char *argv[]; {
16911007Sshannon static char *nullstr = "-";
17011007Sshannon
17111007Sshannon svargc = --argc;
17211007Sshannon svargv = argv;
17311007Sshannon while (svargc > 0 && svargv[1][0] == '-') {
17411007Sshannon switch (svargv[1][1]) {
17511007Sshannon
17611007Sshannon case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
17711007Sshannon case 's': gsize = atoi(&svargv[1][2]); break;
17811007Sshannon case 'p': deltaps = atoi(&svargv[1][2]); break;
17911007Sshannon case 'f': gfont = svargv[1][2]; break;
18011007Sshannon case 'e': noeqn++; break;
18114899Srrh case 0: goto endargs;
18211007Sshannon default: dbg = 1;
18311007Sshannon }
18411007Sshannon svargc--;
18511007Sshannon svargv++;
18611007Sshannon }
18714899Srrh endargs:
18811007Sshannon ifile = 1;
18911007Sshannon linect = 1;
19011007Sshannon if (svargc <= 0) {
19111007Sshannon curfile = stdin;
19211007Sshannon svargv[1] = nullstr;
19311007Sshannon }
19414899Srrh else
19514899Srrh openinfile(); /* opens up the first input file */
19611007Sshannon }
19711007Sshannon
yyerror()19811007Sshannon yyerror() {;}
19911007Sshannon
init()20011007Sshannon init() {
20111007Sshannon ct = 0;
20211007Sshannon ps = gsize;
20311007Sshannon ft = gfont;
20411007Sshannon setps(ps);
20511007Sshannon printf(".ft %c\n", ft);
20611007Sshannon }
20711007Sshannon
error(fatal,s1,s2)20811007Sshannon error(fatal, s1, s2) int fatal; char *s1, *s2; {
20911007Sshannon if (fatal>0)
21011007Sshannon printf("eqn fatal error: ");
21111007Sshannon printf(s1,s2);
21211007Sshannon printf("\nfile %s, between lines %d and %d\n",
21311007Sshannon svargv[ifile], eqline, linect);
21411007Sshannon fprintf(stderr, "eqn: ");
21511007Sshannon if (fatal>0)
21611007Sshannon fprintf(stderr, "fatal error: ");
21711007Sshannon fprintf(stderr, s1, s2);
21811007Sshannon fprintf(stderr, "\nfile %s, between lines %d and %d\n",
21911007Sshannon svargv[ifile], eqline, linect);
22011007Sshannon if (fatal > 0)
22111007Sshannon eqnexit(1);
22211007Sshannon }
223