Annotation of researchv9/cmd/eqn/main.c, revision 1.1

1.1     ! root        1: # include "e.h"
        !             2: #define        MAXLINE 3600    /* maximum input line */
        !             3: 
        !             4: char   in[MAXLINE];    /* input buffer */
        !             5: int    noeqn;
        !             6: char   *cmdname;
        !             7: 
        !             8: main(argc,argv)
        !             9:        int argc;
        !            10:        char *argv[];
        !            11: {
        !            12:        exit(eqn(argc, argv));
        !            13: }
        !            14: 
        !            15: eqn(argc,argv)
        !            16:        int argc;
        !            17:        char *argv[];
        !            18: {
        !            19:        int i, type;
        !            20:        char *p, *getenv(), buf[20];
        !            21: 
        !            22:        cmdname = argv[0];
        !            23:        if (p = getenv("TYPESETTER"))
        !            24:                typesetter = p;
        !            25:        while (argc > 1 && argv[1][0] == '-') {
        !            26:                switch (argv[1][1]) {
        !            27: 
        !            28:                case 'd':
        !            29:                        if (argv[1][2] == '\0')
        !            30:                                dbg++;
        !            31:                        else {
        !            32:                                lefteq = argv[1][2];
        !            33:                                righteq = argv[1][3];
        !            34:                        }
        !            35:                        break;
        !            36:                case 's': szstack[0] = gsize = atoi(&argv[1][2]); break;
        !            37:                case 'p': deltaps = atoi(&argv[1][2]); dps_set = 1; break;
        !            38:                case 'm': minsize = atoi(&argv[1][2]); break;
        !            39:                case 'f': strcpy(ftstack[0].name,&argv[1][2]); break;
        !            40:                case 'e': noeqn++; break;
        !            41:                case 'T': typesetter = &argv[1][2]; break;
        !            42:                default:
        !            43:                        fprintf(stderr, "%s: unknown option %s\n", cmdname, argv[1]);
        !            44:                        break;
        !            45:                }
        !            46:                argc--;
        !            47:                argv++;
        !            48:        }
        !            49:        settype(typesetter);
        !            50:        sprintf(buf, "\"%s\"", typesetter);
        !            51:        lookup(deftbl, strsave(typesetter), strsave(buf));
        !            52:        init_tbl();     /* install other keywords in tables */
        !            53:        curfile = infile;
        !            54:        pushsrc(File, curfile);
        !            55:        if (argc <= 1) {
        !            56:                curfile->fin = stdin;
        !            57:                curfile->fname = strsave("-");
        !            58:                getdata();
        !            59:        } else
        !            60:                while (argc-- > 1) {
        !            61:                        if (strcmp(*++argv, "-") == 0)
        !            62:                                curfile->fin = stdin;
        !            63:                        else if ((curfile->fin = fopen(*argv, "r")) == NULL)
        !            64:                                fatal("can't open file %s", *argv);
        !            65:                        curfile->fname = strsave(*argv);
        !            66:                        getdata();
        !            67:                        if (curfile->fin != stdin)
        !            68:                                fclose(curfile->fin);
        !            69:                }
        !            70:        return 0;
        !            71: }
        !            72: 
        !            73: settype(s)     /* initialize data for particular typesetter */
        !            74:        char *s;        /* the minsize could profitably come from the */
        !            75: {                      /* troff description file /usr/lib/font/dev.../DESC.out */
        !            76:        if (strcmp(s, "202") == 0)
        !            77:                { minsize = 5; ttype = DEV202; }
        !            78:        else if (strcmp(s, "aps") == 0)
        !            79:                { minsize = 5; ttype = DEVAPS; }
        !            80:        else if (strcmp(s, "cat") == 0)
        !            81:                { minsize = 6; ttype = DEVCAT; }
        !            82:        else
        !            83:                { minsize = 6; ttype = DEVCAT; }
        !            84: }
        !            85: 
        !            86: getdata()
        !            87: {
        !            88:        register FILE *fin;
        !            89:        int i, type, ln;
        !            90:        char fname[100];
        !            91:        extern int errno;
        !            92: 
        !            93:        errno = 0;
        !            94:        fin = curfile->fin;
        !            95:        curfile->lineno = 0;
        !            96:        printf(".lf 1 %s\n", curfile->fname);
        !            97:        while ((type = getline(in)) != EOF) {
        !            98:                if (in[0] == '.' && in[1] == 'E' && in[2] == 'Q') {
        !            99:                        for (i = 11; i < 100; i++)
        !           100:                                used[i] = 0;
        !           101:                        printf("%s", in);
        !           102:                        if (markline) { /* turn off from last time */
        !           103:                                printf(".nr MK 0\n");
        !           104:                                markline = 0;
        !           105:                        }
        !           106:                        display = 1;
        !           107:                        init();
        !           108:                        yyparse();
        !           109:                        if (eqnreg > 0) {
        !           110:                                if (markline)
        !           111:                                        printf(".nr MK %d\n", markline); /* for -ms macros */
        !           112:                                printf(".if %gm>\\n(.v .ne %gm\n", eqnht, eqnht);
        !           113:                                printf(".rn %d 10\n", eqnreg);
        !           114:                                if (!noeqn)
        !           115:                                        printf("\\&\\*(10\n");
        !           116:                        }
        !           117:                        printf(".EN");
        !           118:                        while (putchar(input()) != '\n')
        !           119:                                ;
        !           120:                        printf(".lf %d\n", curfile->lineno+1);
        !           121:                }
        !           122:                else if (type == lefteq)
        !           123:                        inline();
        !           124:                else if (in[0] == '.' && in[1] == 'l' && in[2] == 'f') {
        !           125:                        if (sscanf(in+3, "%d %s", &ln, fname) == 2) {
        !           126:                                free(curfile->fname);
        !           127:                                printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = strsave(fname));
        !           128:                        } else
        !           129:                                printf(".lf %d\n", curfile->lineno = ln);
        !           130:                } else
        !           131:                        printf("%s", in);
        !           132:        }
        !           133:        return(0);
        !           134: }
        !           135: 
        !           136: getline(s)
        !           137:        register char *s;
        !           138: {
        !           139:        register c;
        !           140: 
        !           141:        while ((c=input()) != '\n' && c != EOF && c != lefteq) {
        !           142:                if (s >= in+MAXLINE) {
        !           143:                        error("input line too long: %.20s\n", in);
        !           144:                        in[MAXLINE] = '\0';
        !           145:                        break;
        !           146:                }
        !           147:                *s++ = c;
        !           148:        }
        !           149:        if (c != lefteq)
        !           150:                *s++ = c;
        !           151:        *s = '\0';
        !           152:        return(c);
        !           153: }
        !           154: 
        !           155: inline()
        !           156: {
        !           157:        int ds, n, sz1 = 0;
        !           158: 
        !           159:        n = curfile->lineno;
        !           160:        if (szstack[0] != 0)
        !           161:                printf(".nr %d \\n(.s\n", sz1 = salloc());
        !           162:        ds = salloc();
        !           163:        printf(".rm %d \n", ds);
        !           164:        display = 0;
        !           165:        do {
        !           166:                if (*in)
        !           167:                        printf(".as %d \"%s\n", ds, in);
        !           168:                init();
        !           169:                yyparse();
        !           170:                if (eqnreg > 0) {
        !           171:                        printf(".as %d \\*(%d\n", ds, eqnreg);
        !           172:                        sfree(eqnreg);
        !           173:                        printf(".lf %d\n", curfile->lineno+1);
        !           174:                }
        !           175:        } while (getline(in) == lefteq);
        !           176:        if (*in)
        !           177:                printf(".as %d \"%s", ds, in);
        !           178:        if (sz1)
        !           179:                printf("\\s\\n(%d", sz1);
        !           180:        printf("\\*(%d\n", ds);
        !           181:        printf(".lf %d\n", curfile->lineno+1);
        !           182:        if (curfile->lineno > n+3)
        !           183:                fprintf(stderr, "eqn warning: multi-line %c...%c, lines %d-%d, file %s\n",
        !           184:                        lefteq, righteq, n, curfile->lineno, curfile->fname); 
        !           185:        sfree(ds);
        !           186:        if (sz1) sfree(sz1);
        !           187: }
        !           188: 
        !           189: putout(p1)
        !           190:        int p1;
        !           191: {
        !           192:        float before, after;
        !           193:        extern float BeforeSub, AfterSub;
        !           194: 
        !           195:        dprintf(".\tanswer <- S%d, h=%g,b=%g\n",p1, eht[p1], ebase[p1]);
        !           196:        eqnht = eht[p1];
        !           197:        before = eht[p1] - ebase[p1] - BeforeSub;       /* leave room for sub or superscript */
        !           198:        after = ebase[p1] - AfterSub;
        !           199:        if (spaceval || before > 0.01 || after > 0.01) {
        !           200:                printf(".ds %d ", p1);  /* used to be \\x'0' here:  why? */
        !           201:                if (spaceval != NULL)
        !           202:                        printf("\\x'0-%s'", spaceval);
        !           203:                else if (before > 0.01)
        !           204:                        printf("\\x'0-%gm'", before);
        !           205:                printf("\\*(%d", p1);
        !           206:                if (spaceval == NULL && after > 0.01)
        !           207:                        printf("\\x'%gm'", after);
        !           208:                putchar('\n');
        !           209:        }
        !           210:        if (szstack[0] != 0)
        !           211:                printf(".ds %d %s\\*(%d\\s\\n(99\n", p1, DPS(gsize,gsize), p1);
        !           212:        eqnreg = p1;
        !           213:        if (spaceval != NULL) {
        !           214:                free(spaceval);
        !           215:                spaceval = NULL;
        !           216:        }
        !           217: }
        !           218: 
        !           219: init()
        !           220: {
        !           221:        synerr = 0;
        !           222:        ct = 0;
        !           223:        ps = gsize;
        !           224:        ftp = ftstack;
        !           225:        ft = ftp->ft;
        !           226:        nszstack = 0;
        !           227:        if (szstack[0] != 0)    /* absolute gsize in effect */
        !           228:                printf(".nr 99 \\n(.s\n");
        !           229: }
        !           230: 
        !           231: salloc()
        !           232: {
        !           233:        int i;
        !           234: 
        !           235:        for (i = 11; i < 100; i++)
        !           236:                if (used[i] == 0) {
        !           237:                        used[i]++;
        !           238:                        return(i);
        !           239:                }
        !           240:        error(FATAL, "no eqn strings left (%d)", i);
        !           241:        return(0);
        !           242: }
        !           243: 
        !           244: sfree(n)
        !           245:        int n;
        !           246: {
        !           247:        used[n] = 0;
        !           248: }
        !           249: 
        !           250: nrwid(n1, p, n2)
        !           251:        int n1, p, n2;
        !           252: {
        !           253:        printf(".nr %d 0\\w'%s\\*(%d'\n", n1, DPS(gsize,p), n2);        /* 0 defends against - width */
        !           254: }
        !           255: 
        !           256: char *ABSPS(dn)        /* absolute size dn in printable form \sd or \s(dd (dd >= 40) */
        !           257:        int dn;
        !           258: {
        !           259:        static char buf[100], *lb = buf;
        !           260:        char *p;
        !           261: 
        !           262:        if (lb > buf + sizeof(buf) - 10)
        !           263:                lb = buf;
        !           264:        p = lb;
        !           265:        *lb++ = '\\';
        !           266:        *lb++ = 's';
        !           267:        if (dn >= 10) {         /* \s(dd only works in new troff */
        !           268:                if (dn >= 40)
        !           269:                        *lb++ = '(';
        !           270:                *lb++ = dn/10 + '0';
        !           271:                *lb++ = dn%10 + '0';
        !           272:        } else {
        !           273:                *lb++ = dn + '0';
        !           274:        }
        !           275:        *lb++ = '\0';   
        !           276:        return p;
        !           277: }
        !           278: 
        !           279: char *DPS(f, t)        /* delta ps (t-f) in printable form \s+d or \s-d or \s+-(dd */
        !           280:        int f, t;
        !           281: {
        !           282:        static char buf[100], *lb = buf;
        !           283:        char *p;
        !           284:        int dn;
        !           285: 
        !           286:        if (lb > buf + sizeof(buf) - 10)
        !           287:                lb = buf;
        !           288:        p = lb;
        !           289:        *lb++ = '\\';
        !           290:        *lb++ = 's';
        !           291:        dn = EFFPS(t) - EFFPS(f);
        !           292:        if (szstack[nszstack] != 0)     /* absolute */
        !           293:                dn = EFFPS(t);          /* should do proper \s(dd */
        !           294:        else if (dn >= 0)
        !           295:                *lb++ = '+';
        !           296:        else {
        !           297:                *lb++ = '-';
        !           298:                dn = -dn;
        !           299:        }
        !           300:        if (dn >= 10) {         /* \s+(dd only works in new troff */
        !           301:                *lb++ = '(';
        !           302:                *lb++ = dn/10 + '0';
        !           303:                *lb++ = dn%10 + '0';
        !           304:        } else {
        !           305:                *lb++ = dn + '0';
        !           306:        }
        !           307:        *lb++ = '\0';   
        !           308:        return p;
        !           309: }
        !           310: 
        !           311: EFFPS(n)       /* effective value of n */
        !           312:        int n;
        !           313: {
        !           314:        if (n >= minsize)
        !           315:                return n;
        !           316:        else
        !           317:                return minsize;
        !           318: }
        !           319: 
        !           320: double EM(m, ps)       /* convert m to ems in gsize */
        !           321:        double m;
        !           322:        int ps;
        !           323: {
        !           324:        m *= (float) EFFPS(ps) / gsize;
        !           325:        if (m <= 0.001 && m >= -0.001)
        !           326:                return 0;
        !           327:        else
        !           328:                return m;
        !           329: }
        !           330: 
        !           331: double REL(m, ps)      /* convert m to ems in ps */
        !           332:        double m;
        !           333:        int ps;
        !           334: {
        !           335:        m *= (float) gsize / EFFPS(ps);
        !           336:        if (m <= 0.001 && m >= -0.001)
        !           337:                return 0;
        !           338:        else
        !           339:                return m;
        !           340: }

unix.superglobalmegacorp.com

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