home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / eqn / io.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.1 KB  |  196 lines

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