xref: /original-bsd/old/eqn/common_source/io.c (revision 16bc4816)
1 /*-
2  * Copyright (c) 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.proprietary.c%
6  */
7 
8 #ifndef lint
9 char copyright[] =
10 "@(#) Copyright (c) 1991 The Regents of the University of California.\n\
11  All rights reserved.\n";
12 #endif /* not lint */
13 
14 #ifndef lint
15 static char sccsid[] = "@(#)io.c	4.6 (Berkeley) 04/17/91";
16 #endif /* not lint */
17 
18 # include "e.h"
19 #define	MAXLINE	1200	/* maximum input line */
20 
21 char	in[MAXLINE];	/* input buffer */
22 int	eqnexit();
23 int noeqn;
24 
25 main(argc,argv) int argc; char *argv[];{
26 
27 	eqnexit(eqn(argc, argv));
28 }
29 
30 eqnexit(n) {
31 #ifdef gcos
32 	if (n)
33 		fprintf(stderr, "run terminated due to eqn error\n");
34 	exit(0);
35 #endif
36 	exit(n);
37 }
38 
39 eqn(argc,argv) int argc; char *argv[];{
40 	int i, type;
41 
42 	setfile(argc,argv);
43 	init_tbl();	/* install keywords in tables */
44 	while ((type=getline(in)) != EOF) {
45 		eqline = linect;
46 		if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
47 			for (i=11; i<100; used[i++]=0);
48 			printf("%s",in);
49 			printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
50 			markline = 0;
51 			init();
52 			yyparse();
53 			if (eqnreg>0) {
54 				printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
55 				/* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n",	*/
56 				/*	eqnreg, svargv[ifile], eqline, linect);	*/
57 				printf(".nr MK %d\n", markline);	/* for -ms macros */
58 				printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
59 				printf(".rn %d 10\n", eqnreg);
60 				if(!noeqn)printf("\\*(10\n");
61 			}
62 			printf(".ps \\n(99\n.ft \\n(98\n");
63 			printf(".EN");
64 			if (lastchar == EOF) {
65 				putchar('\n');
66 				break;
67 			}
68 			if (putchar(lastchar) != '\n')
69 				while (putchar(gtc()) != '\n');
70 		}
71 		else if (type == lefteq)
72 			in_line();
73 		else
74 			printf("%s",in);
75 	}
76 	return(0);
77 }
78 
79 getline(s) register char *s; {
80 	register c;
81 	while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
82 		if (s >= in+MAXLINE) {
83 			error( !FATAL, "input line too long: %.20s\n", in);
84 			in[MAXLINE] = '\0';
85 			break;
86 		}
87 	if (c==lefteq)
88 		s--;
89 	*s++ = '\0';
90 	return(c);
91 }
92 
93 in_line() {
94 	int ds;
95 
96 	printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
97 	ds = oalloc();
98 	printf(".rm %d \n", ds);
99 	do{
100 		if (*in)
101 			printf(".as %d \"%s\n", ds, in);
102 		init();
103 		yyparse();
104 		if (eqnreg > 0) {
105 			printf(".as %d \\*(%d\n", ds, eqnreg);
106 			ofree(eqnreg);
107 		}
108 		printf(".ps \\n(99\n.ft \\n(98\n");
109 	} while (getline(in) == lefteq);
110 	if (*in)
111 		printf(".as %d \"%s", ds, in);
112 	printf(".ps \\n(99\n.ft \\n(98\n");
113 	printf("\\*(%d\n", ds);
114 	ofree(ds);
115 }
116 
117 putout(p1) int p1; {
118 	extern int gsize, gfont;
119 	int before, after;
120 	if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
121 	eqnht = eht[p1];
122 	printf(".ds %d \\x'0'", p1);
123 	/* suppposed to leave room for a subscript or superscript */
124 #ifndef NEQN
125 	before = eht[p1] - ebase[p1] - VERT((ps*6*12)/10);
126 #else NEQN
127 	before = eht[p1] - ebase[p1] - VERT(3);	/* 3 = 1.5 lines */
128 #endif NEQN
129 	if (before > 0)
130 		printf("\\x'0-%du'", before);
131 	printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
132 		gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
133 #ifndef NEQN
134 	after = ebase[p1] - VERT((ps*6*2)/10);
135 #else NEQN
136 	after = ebase[p1] - VERT(1);
137 #endif NEQN
138 	if (after > 0)
139 		printf("\\x'%du'", after);
140 	putchar('\n');
141 	eqnreg = p1;
142 }
143 
144 max(i,j) int i,j; {
145 	return (i>j ? i : j);
146 }
147 
148 oalloc() {
149 	int i;
150 	for (i=11; i<100; i++)
151 		if (used[i]++ == 0) return(i);
152 	error( FATAL, "no eqn strings left", i);
153 	return(0);
154 }
155 
156 ofree(n) int n; {
157 	used[n] = 0;
158 }
159 
160 setps(p) int p; {
161 	printf(".ps %d\n", EFFPS(p));
162 }
163 
164 nrwid(n1, p, n2) int n1, p, n2; {
165 	printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
166 }
167 
168 setfile(argc, argv) int argc; char *argv[]; {
169 	static char *nullstr = "-";
170 
171 	svargc = --argc;
172 	svargv = argv;
173 	while (svargc > 0 && svargv[1][0] == '-') {
174 		switch (svargv[1][1]) {
175 
176 		case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
177 		case 's': gsize = atoi(&svargv[1][2]); break;
178 		case 'p': deltaps = atoi(&svargv[1][2]); break;
179 		case 'f': gfont = svargv[1][2]; break;
180 		case 'e': noeqn++; break;
181 		case 0:	goto endargs;
182 		default: dbg = 1;
183 		}
184 		svargc--;
185 		svargv++;
186 	}
187   endargs:
188 	ifile = 1;
189 	linect = 1;
190 	if (svargc <= 0) {
191 		curfile = stdin;
192 		svargv[1] = nullstr;
193 	}
194 	else
195 		openinfile();	/* opens up the first input file */
196 }
197 
198 yyerror() {;}
199 
200 init() {
201 	ct = 0;
202 	ps = gsize;
203 	ft = gfont;
204 	setps(ps);
205 	printf(".ft %c\n", ft);
206 }
207 
208 error(fatal, s1, s2) int fatal; char *s1, *s2; {
209 	if (fatal>0)
210 		printf("eqn fatal error: ");
211 	printf(s1,s2);
212 	printf("\nfile %s, between lines %d and %d\n",
213 		 svargv[ifile], eqline, linect);
214 	fprintf(stderr, "eqn: ");
215 	if (fatal>0)
216 		fprintf(stderr, "fatal error: ");
217 	fprintf(stderr, s1, s2);
218 	fprintf(stderr, "\nfile %s, between lines %d and %d\n",
219 		 svargv[ifile], eqline, linect);
220 	if (fatal > 0)
221 		eqnexit(1);
222 }
223