Annotation of 42BSD/usr.bin/eqn/io.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.