date and time created 83/02/11 18:28:13 by shannon
authorBill Shannon <shannon@ucbvax.Berkeley.EDU>
Sat, 12 Feb 1983 10:28:13 +0000 (02:28 -0800)
committerBill Shannon <shannon@ucbvax.Berkeley.EDU>
Sat, 12 Feb 1983 10:28:13 +0000 (02:28 -0800)
SCCS-vsn: old/eqn/common_source/io.c 4.1

usr/src/old/eqn/common_source/io.c [new file with mode: 0644]

diff --git a/usr/src/old/eqn/common_source/io.c b/usr/src/old/eqn/common_source/io.c
new file mode 100644 (file)
index 0000000..b3d0da7
--- /dev/null
@@ -0,0 +1,197 @@
+/*     io.c    4.1     83/02/11        */
+
+# include "e.h"
+#define        MAXLINE 1200    /* maximum input line */
+
+char   in[MAXLINE];    /* input buffer */
+int    eqnexit();
+int noeqn;
+
+main(argc,argv) int argc; char *argv[];{
+
+       eqnexit(eqn(argc, argv));
+}
+
+eqnexit(n) {
+#ifdef gcos
+       if (n)
+               fprintf(stderr, "run terminated due to eqn error\n");
+       exit(0);
+#endif
+       exit(n);
+}
+
+eqn(argc,argv) int argc; char *argv[];{
+       int i, type;
+
+       setfile(argc,argv);
+       init_tbl();     /* install keywords in tables */
+       while ((type=getline(in)) != EOF) {
+               eqline = linect;
+               if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
+                       for (i=11; i<100; used[i++]=0);
+                       printf("%s",in);
+                       printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
+                       markline = 0;
+                       init();
+                       yyparse();
+                       if (eqnreg>0) {
+                               printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
+                               /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */
+                               /*      eqnreg, svargv[ifile], eqline, linect); */
+                               printf(".nr MK %d\n", markline);        /* for -ms macros */
+                               printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
+                               printf(".rn %d 10\n", eqnreg);
+                               if(!noeqn)printf("\\*(10\n");
+                       }
+                       printf(".ps \\n(99\n.ft \\n(98\n");
+                       printf(".EN");
+                       if (lastchar == EOF) {
+                               putchar('\n');
+                               break;
+                       }
+                       if (putchar(lastchar) != '\n')
+                               while (putchar(gtc()) != '\n');
+               }
+               else if (type == lefteq)
+                       inline();
+               else
+                       printf("%s",in);
+       }
+       return(0);
+}
+
+getline(s) register char *s; {
+       register c;
+       while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
+               if (s >= in+MAXLINE) {
+                       error( !FATAL, "input line too long: %.20s\n", in);
+                       in[MAXLINE] = '\0';
+                       break;
+               }
+       if (c==lefteq)
+               s--;
+       *s++ = '\0';
+       return(c);
+}
+
+inline() {
+       int ds;
+
+       printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
+       ds = oalloc();
+       printf(".rm %d \n", ds);
+       do{
+               if (*in)
+                       printf(".as %d \"%s\n", ds, in);
+               init();
+               yyparse();
+               if (eqnreg > 0) {
+                       printf(".as %d \\*(%d\n", ds, eqnreg);
+                       ofree(eqnreg);
+               }
+               printf(".ps \\n(99\n.ft \\n(98\n");
+       } while (getline(in) == lefteq);
+       if (*in)
+               printf(".as %d \"%s", ds, in);
+       printf(".ps \\n(99\n.ft \\n(98\n");
+       printf("\\*(%d\n", ds);
+       ofree(ds);
+}
+
+putout(p1) int p1; {
+       extern int gsize, gfont;
+       int before, after;
+       if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
+       eqnht = eht[p1];
+       printf(".ds %d \\x'0'", p1);
+       /* suppposed to leave room for a subscript or superscript */
+       before = eht[p1] - ebase[p1] - VERT((ps*6*12)/10);
+       if (before > 0)
+               printf("\\x'0-%du'", before);
+       printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
+               gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
+       after = ebase[p1] - VERT((ps*6*2)/10);
+       if (after > 0)
+               printf("\\x'%du'", after);
+       putchar('\n');
+       eqnreg = p1;
+}
+
+max(i,j) int i,j; {
+       return (i>j ? i : j);
+}
+
+oalloc() {
+       int i;
+       for (i=11; i<100; i++)
+               if (used[i]++ == 0) return(i);
+       error( FATAL, "no eqn strings left", i);
+       return(0);
+}
+
+ofree(n) int n; {
+       used[n] = 0;
+}
+
+setps(p) int p; {
+       printf(".ps %d\n", EFFPS(p));
+}
+
+nrwid(n1, p, n2) int n1, p, n2; {
+       printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
+}
+
+setfile(argc, argv) int argc; char *argv[]; {
+       static char *nullstr = "-";
+
+       svargc = --argc;
+       svargv = argv;
+       while (svargc > 0 && svargv[1][0] == '-') {
+               switch (svargv[1][1]) {
+
+               case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
+               case 's': gsize = atoi(&svargv[1][2]); break;
+               case 'p': deltaps = atoi(&svargv[1][2]); break;
+               case 'f': gfont = svargv[1][2]; break;
+               case 'e': noeqn++; break;
+               default: dbg = 1;
+               }
+               svargc--;
+               svargv++;
+       }
+       ifile = 1;
+       linect = 1;
+       if (svargc <= 0) {
+               curfile = stdin;
+               svargv[1] = nullstr;
+       }
+       else if ((curfile = fopen(svargv[1], "r")) == NULL)
+               error( FATAL,"can't open file %s", svargv[1]);
+}
+
+yyerror() {;}
+
+init() {
+       ct = 0;
+       ps = gsize;
+       ft = gfont;
+       setps(ps);
+       printf(".ft %c\n", ft);
+}
+
+error(fatal, s1, s2) int fatal; char *s1, *s2; {
+       if (fatal>0)
+               printf("eqn fatal error: ");
+       printf(s1,s2);
+       printf("\nfile %s, between lines %d and %d\n",
+                svargv[ifile], eqline, linect);
+       fprintf(stderr, "eqn: ");
+       if (fatal>0)
+               fprintf(stderr, "fatal error: ");
+       fprintf(stderr, s1, s2);
+       fprintf(stderr, "\nfile %s, between lines %d and %d\n",
+                svargv[ifile], eqline, linect);
+       if (fatal > 0)
+               eqnexit(1);
+}