Annotation of researchv10no/cmd/movie/fdevelop.c, revision 1.1.1.1

1.1       root        1: /* fdevelop: convert script to intermediate language in two passes
                      2:        Input defined in script.def, output in int.def
                      3:        Pass 1 reads named file or stdin, writes intermediate file
                      4:        Pass 2 reads intermediate, writes output
                      5:        Intermediate file is like output, with these differences:
                      6:                Header lines (d v, d c, etc.) absent
                      7:                Erase commands: refer to line numbers in int file and
                      8:                        do not have geometric command following
                      9:                Geometry commands: numbers not yet scaled, slots not
                     10:                        assigned
                     11:    fdevelop is a filter, transforming stdin or one named file to stdout
                     12:        the shell script develop uses this program to develop foo.s
                     13:          into foo.i, if needed
                     14:  */
                     15: 
                     16: #include "fdevelop.h"
                     17: 
                     18: #define SCALE  9999
                     19: 
                     20: extern dox(), doy();
                     21: extern float   stof();
                     22: 
                     23: /* SLOTS */
                     24: int    slotmax = 10000;
                     25: 
                     26: /* STATUS OF EACH LINE IN INTERMEDIATE FILE*/
                     27: int    linemax = 50000;
                     28: char   *linevec;       /* malloc'ed to [linemax] before pass 1 */
                     29: #define MAXVIEWS       10
                     30:                          /* if >10 views, change one-byte getc in pass2 */
                     31: #define        ERASED          11
                     32: #define        NOTGEOM         12
                     33: 
                     34: /* VIEWS */
                     35: extern                 recordx(), recordy();
                     36: extern int     scalex(), scaley();
                     37: int    viewcnt = 0;
                     38: struct Viewelmt {
                     39:        char    name[MAXSTR];   /* character string name */
                     40:        float   maxx;           /* range of values, both coords */
                     41:        float   minx;
                     42:        float   maxy;
                     43:        float   miny;
                     44:        float   factorx;        /* factors used by scalex and scaley */
                     45:        float   factory;
                     46:        int     initx;          /* max and min set yet? */
                     47:        int     inity;
                     48: }      viewarr[MAXVIEWS];
                     49: 
                     50: /* CLICKS */
                     51: #define        MAXCLICKS       30
                     52: int    clickcnt = 0;
                     53: char   clickname [MAXCLICKS] [MAXSTR];
                     54: 
                     55: /* OPTIONS FOR GEOMETRIC OBJECTS */
                     56: extern getoptions();
                     57: #define OPTMAX 10
                     58: char   optstring[OPTMAX];
                     59: #define TEXT   0
                     60: #define LINE   1
                     61: #define BOX    2
                     62: #define CIRCLE 3
                     63: char   *defaulttab[] = { /* match with above defines */
                     64:        "cm7",  /* TEXT:   center, medium, white        */
                     65:        "s-7",  /* LINE:   solid, -, white              */
                     66:        "n7",   /* BOX:    nofill, white                */
                     67:        "n7"    /* CIRCLE: nofill, white                */
                     68: };
                     69: struct Geoelmt {
                     70:        int     cmd;
                     71:        int     pos;
                     72:        char    *name;
                     73:        char    val;
                     74: } geooptarr[] = {
                     75:        TEXT,   0,      "center",       'c',
                     76:        TEXT,   0,      "ljust",        'l',
                     77:        TEXT,   0,      "rjust",        'r',
                     78:        TEXT,   0,      "above",        'a',
                     79:        TEXT,   0,      "below",        'b',
                     80:        TEXT,   1,      "medium",       'm',
                     81:        TEXT,   1,      "small",        's',
                     82:        TEXT,   1,      "big",          'b',
                     83:        TEXT,   1,      "bigbig",       'B',
                     84:        TEXT,   2,      "c0",           '0',
                     85:        TEXT,   2,      "c1",           '1',
                     86:        TEXT,   2,      "c2",           '2',
                     87:        TEXT,   2,      "c3",           '3',
                     88:        TEXT,   2,      "c4",           '4',
                     89:        TEXT,   2,      "c5",           '5',
                     90:        TEXT,   2,      "c6",           '6',
                     91:        TEXT,   2,      "c7",           '7',
                     92:        TEXT,   2,      "black",        '0',
                     93:        TEXT,   2,      "red",          '1',
                     94:        TEXT,   2,      "green",        '2',
                     95:        TEXT,   2,      "yellow",       '3',
                     96:        TEXT,   2,      "blue",         '4',
                     97:        TEXT,   2,      "magenta",      '5',
                     98:        TEXT,   2,      "cyan",         '6',
                     99:        TEXT,   2,      "white",        '7',
                    100:        LINE,   0,      "solid",        's',
                    101:        LINE,   0,      "fat",          'f',
                    102:        LINE,   0,      "fatfat",       'F',
                    103:        LINE,   0,      "dotted",       'o',
                    104:        LINE,   0,      "dashed",       'a',
                    105:        LINE,   1,      "-",            '-',
                    106:        LINE,   1,      "->",           '>',
                    107:        LINE,   1,      "<-",           '<',
                    108:        LINE,   1,      "<->",          'x',
                    109:        LINE,   2,      "c0",           '0',
                    110:        LINE,   2,      "c1",           '1',
                    111:        LINE,   2,      "c2",           '2',
                    112:        LINE,   2,      "c3",           '3',
                    113:        LINE,   2,      "c4",           '4',
                    114:        LINE,   2,      "c5",           '5',
                    115:        LINE,   2,      "c6",           '6',
                    116:        LINE,   2,      "c7",           '7',
                    117:        LINE,   2,      "black",        '0',
                    118:        LINE,   2,      "red",          '1',
                    119:        LINE,   2,      "green",        '2',
                    120:        LINE,   2,      "yellow",       '3',
                    121:        LINE,   2,      "blue",         '4',
                    122:        LINE,   2,      "magenta",      '5',
                    123:        LINE,   2,      "cyan",         '6',
                    124:        LINE,   2,      "white",        '7',
                    125:        BOX,    0,      "nofill",       'n',
                    126:        BOX,    0,      "fill",         'f',
                    127:        BOX,    1,      "c0",           '0',
                    128:        BOX,    1,      "c1",           '1',
                    129:        BOX,    1,      "c2",           '2',
                    130:        BOX,    1,      "c3",           '3',
                    131:        BOX,    1,      "c4",           '4',
                    132:        BOX,    1,      "c5",           '5',
                    133:        BOX,    1,      "c6",           '6',
                    134:        BOX,    1,      "c7",           '7',
                    135:        BOX,    1,      "black",        '0',
                    136:        BOX,    1,      "red",          '1',
                    137:        BOX,    1,      "green",        '2',
                    138:        BOX,    1,      "yellow",       '3',
                    139:        BOX,    1,      "blue",         '4',
                    140:        BOX,    1,      "magenta",      '5',
                    141:        BOX,    1,      "cyan",         '6',
                    142:        BOX,    1,      "white",        '7',
                    143:        CIRCLE, 0,      "nofill",       'n',
                    144:        CIRCLE, 0,      "fill",         'f',
                    145:        CIRCLE, 1,      "c0",           '0',
                    146:        CIRCLE, 1,      "c1",           '1',
                    147:        CIRCLE, 1,      "c2",           '2',
                    148:        CIRCLE, 1,      "c3",           '3',
                    149:        CIRCLE, 1,      "c4",           '4',
                    150:        CIRCLE, 1,      "c5",           '5',
                    151:        CIRCLE, 1,      "c6",           '6',
                    152:        CIRCLE, 1,      "c7",           '7',
                    153:        CIRCLE, 1,      "black",        '0',
                    154:        CIRCLE, 1,      "red",          '1',
                    155:        CIRCLE, 1,      "green",        '2',
                    156:        CIRCLE, 1,      "yellow",       '3',
                    157:        CIRCLE, 1,      "blue",         '4',
                    158:        CIRCLE, 1,      "magenta",      '5',
                    159:        CIRCLE, 1,      "cyan",         '6',
                    160:        CIRCLE, 1,      "white",        '7'
                    161: };
                    162: int    geooptcnt = (sizeof(geooptarr) / sizeof(struct Geoelmt));
                    163: 
                    164: /* VARIABLES FOR LEXICAL ANALYSIS */
                    165: char   buf[MAXBUF];
                    166: int    lexsaweof = 0;
                    167: 
                    168: /* UTILITY VARIABLES */
                    169: char   *NULLSTR = "";
                    170: char   *cmdname;
                    171: int    lineno, outlineno;
                    172: char   *tempfname;
                    173: FILE   *infp, *tempfp;
                    174: 
                    175: extern double atof();
                    176: #define STOF(s)        ((float) atof(s))
                    177: 
                    178: main(argc, argv)
                    179:        char *argv[];
                    180: {
                    181:        register int    i;
                    182: 
                    183:        cmdname = argv[0];
                    184:        while (argc > 1 && argv[1][0] == '-') {
                    185:                switch (argv[1][1]) {
                    186:                case 'l':
                    187:                        linemax = atoi(&argv[1][2]);
                    188:                        break;
                    189:                case 's':
                    190:                        slotmax = atoi(&argv[1][2]);
                    191:                        break;
                    192:                }
                    193:                argc--;
                    194:                argv++;
                    195:        }
                    196:        if (argc == 1)
                    197:                infp = stdin;
                    198:        else {
                    199:                if ((infp = fopen(argv[1], "r")) == NULL)
                    200:                        error(FATAL, "can't open input file");
                    201:        }
                    202:        linevec = emalloc(linemax);
                    203:        for (i = 0; i < linemax; i++)
                    204:                linevec[i] = 0;
                    205:        tempfname = "/tmp/dev.XXXXXX";
                    206:        mktemp(tempfname);
                    207:        /* DEBUG tempfname = "djunk"; */
                    208:        if ((tempfp = fopen(tempfname, "w")) == NULL)
                    209:                error(FATAL, "can't open temp file");
                    210:        pass1();
                    211:        fclose(tempfp);
                    212:        if ((tempfp = fopen(tempfname, "r")) == NULL)
                    213:                error(FATAL, "can't open temp file");
                    214:        pass2();
                    215:        unlink(tempfname); /* DEBUG */
                    216: }
                    217: 
                    218: pass1()
                    219: {
                    220:        int     currentview;            /* view number */
                    221:        int     erased[MAXVIEWS];       /* last line erased */
                    222:        int     badlabel;               /* 1 if label, 0 if geom */
                    223:        char    savelabel[MAXSTR];      /* label */
                    224:        int     geomalready = 0;        /* seen any geometry yet? */
                    225:        struct Symbol   *sp;
                    226:        int     i;
                    227: 
                    228: #define        DOGEOM          badlabel = 0;\
                    229:                        geomalready = 1;\
                    230:                        linevec[outlineno] = currentview;
                    231: 
                    232: #define DOERASE(L)     linevec[(L)] = ERASED;\
                    233:                        linevec[outlineno] = NOTGEOM;\
                    234:                        fprintf(tempfp, "e\t%d\n", (L));\
                    235:                        outlineno++;
                    236: 
                    237:        /* init */
                    238:        currentview = 0;
                    239:        for (i = 0; i < MAXVIEWS; i++)
                    240:                erased[i] = 0;
                    241:        opensymtab();
                    242: 
                    243:        /* read and process file */
                    244:        lineno = 0;
                    245:        outlineno = 1;
                    246:        while (moreinput(infp)) {
                    247:                if (++lineno > linemax)
                    248:                        error(FATAL, "too many input lines");
                    249:                /* fprintf(stderr, "STARTING TO PROCESS INPUT LINE %d\n",
                    250:                        lineno); */
                    251:                linevec[outlineno] = NOTGEOM;
                    252:                lex(infp);
                    253:                if (buf[0] == '#') {
                    254:                        gobble2(infp);
                    255:                        continue;
                    256:                }
                    257:                badlabel = 0;
                    258:                if (buf[strlen(buf)-1] == ':') {
                    259:                        buf[strlen(buf)-1] = '\0';
                    260:                        badlabel = 1;
                    261:                        strcpy(savelabel, buf);
                    262:                        sp = lookup(buf, currentview);
                    263:                        if (sp != NULL) {
                    264:                                if (linevec[sp->outnum] == currentview) {
                    265:                                        DOERASE(sp->outnum)
                    266:                                }
                    267:                                sp->outnum = outlineno;
                    268:                        } else {
                    269:                                insert(buf, currentview, outlineno);
                    270:                        }
                    271:                        lex(infp);
                    272:                }
                    273:                if (eq(buf, "text")) {
                    274:                        DOGEOM
                    275:                        getoptions(TEXT);
                    276:                        fprintf(tempfp, "g\t0\tt\t%d\t%s",
                    277:                                currentview, optstring);
                    278:                        dox(currentview);
                    279:                        lex(infp);
                    280:                        doy(currentview);
                    281:                        lexstr(infp);
                    282:                        fprintf(tempfp, "\t%s\n", buf);
                    283:                        outlineno++;
                    284:                } else if (eq(buf, "circle")) {
                    285:                        float savex, rad;
                    286:                        DOGEOM
                    287:                        getoptions(CIRCLE);
                    288:                        fprintf(tempfp, "g\t0\tc\t%d\t%s",
                    289:                                currentview, optstring);
                    290:                        dox(currentview);
                    291:                        savex = STOF(buf);
                    292:                        lex(infp);
                    293:                        doy(currentview);
                    294:                        lex(infp);
                    295:                        if (!strisnum(buf)) {
                    296:                                error(WARN, "radius not a number");
                    297:                                strcpy(buf, "0");
                    298:                        }
                    299:                        rad = STOF(buf);
                    300:                        if (rad < 0.0)
                    301:                                error(WARN, "radius is negative");
                    302:                        recordx(currentview, savex-rad);
                    303:                        recordx(currentview, savex+rad);
                    304:                        fprintf(tempfp, "\t%s\n", buf); 
                    305:                        outlineno++;
                    306:                        gobble(infp);
                    307:                } else if (eq(buf, "line") || eq(buf, "box")) {
                    308:                        char cmdchar;
                    309:                        DOGEOM
                    310:                        if (eq(buf, "line")) {
                    311:                                getoptions(LINE);
                    312:                                cmdchar = 'l';
                    313:                        } else {
                    314:                                getoptions(BOX);
                    315:                                cmdchar = 'b';
                    316:                        }
                    317:                        fprintf(tempfp, "g\t0\t%c\t%d\t%s",
                    318:                                cmdchar, currentview, optstring);
                    319:                        dox(currentview);
                    320:                        lex(infp);
                    321:                        doy(currentview);
                    322:                        lex(infp);
                    323:                        dox(currentview);
                    324:                        lex(infp);
                    325:                        doy(currentview);
                    326:                        fprintf(tempfp, "\n");
                    327:                        outlineno++;
                    328:                        gobble(infp);
                    329:                } else if (eq(buf, "view")) {
                    330:                        lex(infp);
                    331:                        if (eq(buf,NULLSTR)) {
                    332:                                error(WARN, "no name in view statement");
                    333:                                strcpy(buf, "def.view");
                    334:                        }
                    335:                        if (viewcnt == 0 && geomalready)
                    336:                                error(WARN, "first view after geom");
                    337:                        for (i = 0; i < viewcnt; i++)
                    338:                                if (eq(buf, viewarr[i].name))
                    339:                                        break;
                    340:                        if (i >= viewcnt) {
                    341:                                viewcnt++;
                    342:                                if (i >= MAXVIEWS)
                    343:                                        error(FATAL, "too many views");
                    344:                                strcpy(viewarr[i].name, buf);
                    345:                                viewarr[i].initx = viewarr[i].inity = 0;
                    346:                        }
                    347:                        currentview = i;
                    348:                        gobble(infp);
                    349:                } else if (eq(buf, "click")) {
                    350:                        lex(infp);
                    351:                        if (eq(buf,NULLSTR))
                    352:                                strcpy(buf, "def.click");
                    353:                        for (i = 0; i < clickcnt; i++)
                    354:                                if (eq(buf, clickname[i]))
                    355:                                        break;
                    356:                        if (i >= clickcnt) {
                    357:                                clickcnt++;
                    358:                                if (i >= MAXCLICKS)
                    359:                                        error(FATAL, "too many click names");
                    360:                                strcpy(clickname[i], buf);
                    361:                        }
                    362:                        fprintf(tempfp, "c\t%d\n", i);
                    363:                        outlineno++;
                    364:                        gobble(infp);
                    365:                } else if (eq(buf, "erase")) {
                    366:                        lex(infp);
                    367:                        if (eq(buf,NULLSTR))
                    368:                                error(WARN, "no label in erase statement");
                    369:                        sp = lookup(buf, currentview);
                    370:                        if (sp != NULL) {
                    371:                                if (linevec[sp->outnum] == currentview) {
                    372:                                        DOERASE(sp->outnum)
                    373:                                }
                    374:                                delete(buf, currentview);
                    375:                        } else {
                    376:                                error(WARN, "undefined label");
                    377:                        }
                    378:                        gobble(infp);
                    379:                } else if (eq(buf, "clear")) {
                    380:                        int i, endline;
                    381:                        fprintf(tempfp, "b\ts\t%d\n", currentview);
                    382:                        endline = outlineno++;
                    383:                        for (i = erased[currentview]+1; i <= endline; i++) {
                    384:                                if (linevec[i] == currentview) {
                    385:                                        DOERASE(i)
                    386:                                }
                    387:                        }
                    388:                        erased[currentview] = outlineno;
                    389:                        fprintf(tempfp, "b\te\t%d\n", currentview);
                    390:                        linevec[outlineno] = NOTGEOM;
                    391:                        outlineno++;
                    392:                        gobble(infp);
                    393:                } else {
                    394:                        if (!eq(buf, NULLSTR))
                    395:                                error(WARN, "unrecognized command");
                    396:                        gobble(infp);
                    397:                }
                    398:                if (badlabel) {
                    399:                        error(WARN, "label on nongeometric object");
                    400:                        delete(savelabel, currentview);
                    401:                }
                    402:        }
                    403:        /* tidy up */
                    404:        lineno = 0;
                    405:        closesymtab();
                    406:        if (viewcnt == 0) {
                    407:                viewcnt = 1;
                    408:                strcpy(viewarr[0].name, "def.view");
                    409:        }
                    410: }
                    411: 
                    412: 
                    413: pass2()
                    414: {
                    415:        typedef struct Slot {
                    416:                union {
                    417:                        int     i;
                    418:                        char    *p;
                    419:                } v;
                    420:        } Slot;
                    421:        char    cmd;            /* first char on a line */
                    422:        int     tlineno;        /* line number in temp file */
                    423:        int     slothead;       /* ptr to free list within slots */
                    424:        Slot    *slotarr;       /* init by malloc to slotmax elmts */
                    425:        int     i;
                    426:        int     c;
                    427:        int     v;
                    428:        struct Viewelmt *vp;
                    429: 
                    430:        /* Init */
                    431:        opensymtab();
                    432:        slotarr = (Slot *) emalloc(slotmax * sizeof(Slot));
                    433:        for (i = 1; i <= slotmax-2; i++)
                    434:                slotarr[i].v.i = i+1;
                    435:        slothead = 1;
                    436:        /* Write header for output file */
                    437:        for (i = 0; i < viewcnt; i++) {
                    438:                vp = &viewarr[i];
                    439:                printf("d\tv\t%d\t%s\t%g\t%g\t%g\t%g\n", i,
                    440:                        vp->name, vp->minx, vp->miny, vp->maxx, vp->maxy);
                    441:        }
                    442:        for (i = 0; i < clickcnt; i++)
                    443:                printf("d\tc\t%d\t%s\n", i, clickname[i]);
                    444:        printf("d\tp\te\n");
                    445:        /* Calculate view factors used to scale */
                    446:        for (v = 0; v < viewcnt; v++) {
                    447:                vp = &viewarr[v];
                    448:                if (vp->minx == vp->maxx) {
                    449:                        vp->minx = 0.0;
                    450:                        vp->maxx = 2*vp->maxx;
                    451:                        if (vp->maxx == 0.0) {
                    452:                                vp->minx = -1.0;
                    453:                                vp->maxx =  1.0;
                    454:                        }
                    455:                }
                    456:                vp->factorx = SCALE / (vp->maxx-vp->minx);
                    457:                if (vp->miny == vp->maxy) {
                    458:                        vp->miny = 0.0;
                    459:                        vp->maxy = 2*vp->maxy;
                    460:                        if (vp->maxy == 0.0) {
                    461:                                vp->miny = -1.0;
                    462:                                vp->maxy =  1.0;
                    463:                        }
                    464:                }
                    465:                vp->factory = SCALE / (vp->maxy-vp->miny);
                    466:        }
                    467:        /* Read and process intermediate file */
                    468:        tlineno = 0;
                    469:        while ((c = getc(tempfp)) != EOF) {
                    470:                tlineno++;
                    471:                cmd = c;
                    472:                getc(tempfp);   /* gobble tab */
                    473:                putchar(cmd);
                    474:                putchar('\t');
                    475:                if (cmd == 'g') {
                    476:                        int snum, vnum;
                    477:                        char gcmd;
                    478:                        char opts[OPTMAX];
                    479:                        float x1, y1, x2, y2;
                    480:                        int   i1, j1, i2, j2;
                    481:                        char bufa[MAXBUF+100];
                    482:                        /* fscanf(tempfp, "%d %c %d", &snum, &gcmd, &vnum); */
                    483:                          getc(tempfp); /* don't need snum -- always zero */
                    484:                          getc(tempfp); /* gobble tab */
                    485:                          gcmd = getc(tempfp);
                    486:                          getc(tempfp); /* gobble tab */
                    487:                          vnum = getc(tempfp) - '0';
                    488:                        fscanf(tempfp, "%s %f %f", opts, &x1, &y1);
                    489:                        if (linevec[tlineno] != ERASED)
                    490:                                snum = 0;
                    491:                        else {
                    492:                                snum = slothead;
                    493:                                slothead = slotarr[snum].v.i;
                    494:                                if (slothead == 0)
                    495:                                        error(FATAL, "ran out of slots");
                    496:                        }
                    497:                        insert(NULLSTR, tlineno, snum);
                    498:                        i1 = scalex(vnum, x1);
                    499:                        j1 = scaley(vnum, y1);
                    500:                        if (gcmd == 'b' || gcmd == 'l') {
                    501:                                fscanf(tempfp, "%f %f", &x2, &y2);
                    502:                                if (getc(tempfp) != '\n')
                    503:                                        error(FATAL, "develop bug: missing newline");
                    504:                                i2 = scalex(vnum, x2);
                    505:                                j2 = scaley(vnum, y2);
                    506:                                if (gcmd == 'b') {
                    507:                                        int t; /* normalize: min, max */
                    508:                                        if (i1 > i2) { t=i1; i1=i2; i2=t; }
                    509:                                        if (j1 > j2) { t=j1; j1=j2; j2=t; }
                    510:                                }
                    511:                                sprintf(bufa, "%d\t%c\t%d\t%s\t%d\t%d\t%d\t%d",
                    512:                                        snum, gcmd, vnum, opts, i1, j1, i2, j2);
                    513:                        } else if (gcmd == 'c') {
                    514:                                fscanf(tempfp, "%f", &x2);
                    515:                                if (getc(tempfp) != '\n')
                    516:                                        error(FATAL, "develop bug: missing newline");
                    517:                                i2 = scalex(vnum, x1+x2) - i1;
                    518:                                if (i2 < 0)
                    519:                                        i2 = -i2;
                    520:                                if (i2 == 0)
                    521:                                        i2 = 1;
                    522:                                sprintf(bufa, "%d\t%c\t%d\t%s\t%d\t%d\t%d",
                    523:                                        snum, gcmd, vnum, opts, i1, j1, i2);
                    524:                        } else if (gcmd == 't') {
                    525:                                getc(tempfp); /* gobble tab */
                    526:                                lexrest(tempfp);
                    527:                                sprintf(bufa, "%d\t%c\t%d\t%s\t%d\t%d\t%s",
                    528:                                        snum, gcmd, vnum, opts, i1, j1, buf);
                    529:                        } else error(FATAL, "develop bug: invalid g cmd");
                    530:                        slotarr[snum].v.p = emalloc(strlen(bufa)+1);
                    531:                        strcpy(slotarr[snum].v.p, bufa);
                    532:                        puts(bufa);
                    533:                } else if (cmd == 'e') {
                    534:                        int linenum, slotnum;
                    535:                        Symbol *sp;
                    536:                        fscanf(tempfp, "%d", &linenum);
                    537:                        if (getc(tempfp) != '\n')
                    538:                                error(FATAL, "develop bug: missing newline");
                    539:                        sp = lookup(NULLSTR, linenum);
                    540:                        if (sp == NULL)
                    541:                                error(FATAL, "develop bug: bad erase lookup");
                    542:                        slotnum = sp->outnum;
                    543:                        puts(slotarr[slotnum].v.p);
                    544:                        efree(slotarr[slotnum].v.p);
                    545:                        slotarr[slotnum].v.i = slothead;
                    546:                        slothead = slotnum;
                    547:                        delete(NULLSTR, linenum);
                    548:                } else {
                    549:                        lexrest(tempfp);
                    550:                        puts(buf);
                    551:                }
                    552:        }
                    553:        /* tidy up */
                    554:                /* closesymtab(); delete stuff in slots? */
                    555: }
                    556: 
                    557: recordx(vnum, t)
                    558:        int vnum;
                    559:        float t;
                    560: {
                    561:        struct Viewelmt *vp;
                    562: 
                    563:        vp = &viewarr[vnum];
                    564:        if (vp->initx != 1) {
                    565:                vp->initx = 1;
                    566:                vp->minx = t;   
                    567:                vp->maxx = t;
                    568:        } else {
                    569:                if (t < vp->minx)
                    570:                        vp->minx = t;   
                    571:                if (t > vp->maxx)
                    572:                        vp->maxx = t;
                    573:        }
                    574: }
                    575: 
                    576: recordy(vnum, t)
                    577:        int vnum;
                    578:        float t;
                    579: {
                    580:        struct Viewelmt *vp;
                    581: 
                    582:        vp = &viewarr[vnum];
                    583:        if (vp->inity != 1) {
                    584:                vp->inity = 1;
                    585:                vp->miny = t;   
                    586:                vp->maxy = t;
                    587:        } else {
                    588:                if (t < vp->miny)
                    589:                        vp->miny = t;   
                    590:                if (t > vp->maxy)
                    591:                        vp->maxy = t;
                    592:        }
                    593: }
                    594: 
                    595: int scalex(vnum, t)
                    596:        int vnum;
                    597:        float t;
                    598: {
                    599:        struct Viewelmt *vp;
                    600: 
                    601:        vp = &viewarr[vnum];
                    602:        return (int) ((t - vp->minx) * vp->factorx);
                    603: }
                    604: 
                    605: int scaley(vnum, t)
                    606:        int vnum;
                    607:        float t;
                    608: {
                    609:        struct Viewelmt *vp;
                    610: 
                    611:        vp = &viewarr[vnum];
                    612:        return (int) ((t - vp->miny) * vp->factory);
                    613: }
                    614: 
                    615: getoptions(cmdtype)    /* put options into optstring */
                    616:        int cmdtype;
                    617: {
                    618:        int i;
                    619:        struct Geoelmt *gp;
                    620: 
                    621:        strcpy(optstring, defaulttab[cmdtype]);
                    622:        for (lex(infp); !eq(buf,NULLSTR) && !strisnum(buf); lex(infp)) {
                    623:                for (i = 0; i < geooptcnt; i++) {
                    624:                        gp = &geooptarr[i];
                    625:                        if (cmdtype == gp->cmd && eq(buf, gp->name))
                    626:                                break;
                    627:                }
                    628:                if (i < geooptcnt)
                    629:                        optstring[gp->pos] = gp -> val;
                    630:                else
                    631:                        error(WARN, "unrecognized option");
                    632:        }
                    633: }
                    634: 
                    635: dox(view)      /* handle x in input file */
                    636:        int view;
                    637: {
                    638:        if (!strisnum(buf)) {
                    639:                error(WARN, "x value not a number");
                    640:                strcpy(buf, "0");
                    641:        }
                    642:        recordx(view, STOF(buf));
                    643:        fprintf(tempfp, "\t%s", buf);   
                    644: }
                    645: 
                    646: doy(view)      /* handle y in input file */
                    647:        int view;
                    648: {
                    649:        if (!strisnum(buf)) {
                    650:                error(WARN, "y value not a number");
                    651:                strcpy(buf, "0");
                    652:        }
                    653:        recordy(view, STOF(buf));
                    654:        fprintf(tempfp, "\t%s", buf);   
                    655: }

unix.superglobalmegacorp.com

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