Annotation of researchv8dc/cmd/plot/driver.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: #define void int
                      4: #define MAXL 16
                      5: double atof();
                      6: char   *index();
                      7: char *getl();
                      8: void   idle();
                      9: void   arc();
                     10: void   box();
                     11: void   circle();
                     12: void disc();
                     13: void   erase();
                     14: void   closepl();
                     15: void   color();
                     16: void   cfill();
                     17: void   pen();
                     18: void   frame();
                     19: void   grade();
                     20: void   ppause();
                     21: void   line();
                     22: void   move();
                     23: void   openpl();
                     24: void   point();
                     25: void   parabola();
                     26: void   range();
                     27: void   rmove();
                     28: void   text();
                     29: void   sbox();
                     30: void   vec();
                     31: void   rvec();
                     32: void   fill();
                     33: void   poly();
                     34: void   spline();
                     35: void   fspline();
                     36: void   lspline();
                     37: void   dspline();
                     38: void   cspline();
                     39: void   save();
                     40: void   restore();
                     41: void define();
                     42: void call();
                     43: void pinclude();
                     44: struct pcall {
                     45:        void    (*plot)();
                     46:        int     kount;
                     47:        char    *cc;
                     48:        int     numc;
                     49: } plots[] = {
                     50:        arc,    7,      "a",    1,
                     51:        box,    4,      "bo",   2,
                     52:        circle,         3,      "ci",   2,
                     53:        disc,   3,      "di",   2,
                     54:        erase,  -1,     "e",    1,
                     55:        closepl,        -1,     "cl",   2,
                     56:        frame,  4,      "fr",   2,
                     57:        grade,  1,      "g",    1,
                     58:        ppause,         -1,     "pau",  3,
                     59:        color,  0,      "co",   2,
                     60:        cfill,  0,      "cf",   2,
                     61:        pen,    0,      "pe",   2,
                     62:        line,   4,      "li",   2,
                     63:        move,   2,      "m",    1,
                     64:        idle,   -2,     "id",   2,
                     65:        openpl,         0,      "o",    1,
                     66:        point,  2,      "poi",  3,
                     67:        parabola,       6,      "par",  3,
                     68:        range,  4,      "ra",   2,
                     69:        rmove,  2,      "rm",   2,
                     70:        text,   0,      "t",    1,
                     71:        sbox,   4,      "sb",   2,
                     72:        vec,    2,      "v",    1,
                     73:        rvec,   2,      "rv",   2,
                     74:        fill,   256,    "fi",   2,
                     75:        poly,   256,    "pol",  3,
                     76:        spline,         256,    "sp",   2,
                     77:        fspline,        256,    "fs",   2,
                     78:        lspline,        256,    "ls",   2,
                     79:        dspline,        256,    "ds",   2,
                     80:        cspline,        256,    "cs",   2,
                     81:        save,   -1,     "sa",   2,
                     82:        restore,        -1,     "re",   2,
                     83:        define, 0,      "de",   2,
                     84:        call,   0,      "ca",   2,
                     85:        pinclude,       0,      "in",   2,
                     86:        0,      0,      0,      0
                     87: };
                     88: struct pcall *pplots;
                     89: struct fcall {
                     90:        char *name;
                     91:        char *stash;
                     92: } flibr[MAXL];
                     93: struct fcall *fptr = flibr;
                     94: short  FN = 1;
                     95: double SC = 1.0;
                     96: char *fstack[64], **fstp;
                     97: 
                     98: int num[256],*nn;
                     99: double *ff[256], **fp;
                    100: char aa[256];
                    101: FILE *fd;
                    102: main(arc, arv)
                    103: int    arc;
                    104: char   **arv;
                    105: {
                    106:        char    *ap;
                    107:        fd = stdin;
                    108:        for (; arc > 1; arc--, arv++) {
                    109:                if (arv[1][0] == '-') {
                    110:                        ap = arv[1];
                    111:                        ap++;
                    112:                        if (*ap == 'T')
                    113:                                continue;
                    114:                        if (*ap == 'D') {
                    115:                                ptype(++ap);
                    116:                                continue;
                    117:                        }
                    118:                        switch (*ap) {
                    119:                        case 'e':
                    120:                                erase();
                    121:                                continue;
                    122:                        case 'C':
                    123:                                closepl();
                    124:                                continue;
                    125:                        case 'w':
                    126:                                ppause();
                    127:                                continue;
                    128:                        case 'c':
                    129:                                color(++ap);
                    130:                                continue;
                    131:                        case 'f':
                    132:                                cfill(++ap);
                    133:                                continue;
                    134:                        case 'p':
                    135:                                pen(++ap);
                    136:                                continue;
                    137:                        case 'o':
                    138:                                openpl(++ap);
                    139:                                continue;
                    140:                        case 'g':
                    141:                                grade(atof(++ap));
                    142:                                continue;
                    143:                        default:
                    144:                                fprintf(stderr, "%s not allowed as argument\n",
                    145:                                    ap);
                    146:                                exit(1);
                    147:                        }
                    148:                        continue;
                    149:                }
                    150:                if ((fd = fopen(arv[1], "r")) == NULL) {
                    151:                        perror();
                    152:                        fprintf(stderr, "Cannot find file %s\n", arv[1]);
                    153:                        continue;
                    154:                }
                    155:                process();
                    156:                fclose(fd);
                    157:        }
                    158:        if (fd == stdin)
                    159:                process();
                    160:        exit(0);
                    161: }
                    162: process()
                    163: {
                    164:        short   i, j, k, n, acn,curl;
                    165:        double  x, y, X[256], *xp;
                    166:        char    c, *ap, *aq, truef;
                    167:        fstp = fstack;
                    168:        fp = ff;
                    169:        nn = num;
                    170:        while((ap=getl(aa))){
                    171:                while(isspace(*ap))ap++;
                    172:                if(*ap == ':')continue;
                    173:                while(*ap == '.' && !(isdigit(*(ap+1))))
                    174:                        ap++;
                    175:                if (isupper(*ap))
                    176:                        *ap = tolower(*ap);
                    177:                if (!islower(*ap)){
                    178:                        if (pplots->kount > 1)
                    179:                                goto aresume;
                    180:                        continue;
                    181:                }
                    182:                if(fp != ff){
                    183:                        if(acn%2 != 0){
                    184:                                closepl();
                    185:                                fprintf(stderr,"phase error\n");
                    186:                                exit(1);
                    187:                        }
                    188:                        *nn++ = acn/2;
                    189:                        *nn = 0;
                    190:                        (*pplots->plot)(num,ff);
                    191:                        fp = ff;
                    192:                        nn = num;
                    193:                }
                    194:                for (pplots = plots; pplots->plot != 0; pplots++)
                    195:                        if (strncmp(ap, pplots->cc, pplots->numc) == 0){
                    196:                                break;
                    197:                        }
                    198:                if (pplots->plot == 0) {
                    199:                        closepl();
                    200:                        fprintf(stderr,"no command for %s\n", ap);
                    201:                        exit();
                    202:                }
                    203:                if (pplots->kount < 0) {
                    204:                        (*pplots->plot)();
                    205:                        continue;
                    206:                }
                    207:                if (*ap != '\n')
                    208:                        while(islower(*ap))
                    209:                                ap++;
                    210:                if (*ap != '\n')
                    211:                        while (isspace(*ap) || *ap == ',')
                    212:                                ap++;           
                    213:                if (*ap == '\n') {
                    214:                        if (!(pplots->kount))
                    215:                                (*pplots->plot)(" ");
                    216:                        continue;
                    217:                }
                    218:                if (!(pplots->kount)) {
                    219:                        for(aq=ap; *aq !=  '\n';aq++)
                    220:                                if(*aq == '\\')aq++;
                    221:                        if (*ap == '"'){
                    222:                                ap++;
                    223:                                if(*(aq-1) == '"')
                    224:                                        aq--;
                    225:                        }
                    226:                        *aq = NULL;
                    227:                        (*pplots->plot)(ap);
                    228:                        continue;
                    229:                }
                    230:                acn = 0;
                    231:                xp = X;
                    232:                if(pplots->kount == 256){
                    233:                        curl = 0;
                    234:                        *fp++ = X;
                    235:                }
                    236: aresume:
                    237:                while (*ap != '\n') {
                    238:                        while (isspace(*ap) || *ap == ',') 
                    239:                                ap++;
                    240:                        if (*ap == '\n')
                    241:                                break;
                    242:                        if(*ap == '{'){
                    243:                                ap++;
                    244:                                if(curl==0 || ( curl==1 && acn == 0)){
                    245:                                        curl++;
                    246:                                        continue;
                    247:                                }
                    248:                                *fp++ = xp;
                    249:                                continue;
                    250:                        }
                    251:                        if(*ap == '}'){
                    252:                                ap++;
                    253:                                curl++;
                    254:                                if(acn==0){
                    255:                                        *nn = 0;
                    256:                                        (*pplots->plot)(num,ff);
                    257:                                        fp = ff;
                    258:                                        nn = num;
                    259:                                        continue;
                    260:                                }
                    261:                                if(acn%2 != 0){
                    262:                                        closepl();
                    263:                                        fprintf(stderr,"phase error\n");
                    264:                                        exit(1);
                    265:                                }
                    266:                                *nn++ = acn/2;
                    267:                                acn = 0;
                    268:                                continue;
                    269:                        }
                    270:                        aq = ap;
                    271:                        while (!(isspace(*ap)) && *ap != ',' && *ap != '\n')
                    272:                                ap++;
                    273:                        if (isdigit(*aq)||(*aq == '-'||*aq == '+'||*aq == '.')){
                    274:                                *xp++ = atof(aq)*SC;
                    275:                                if (++acn >= pplots->kount) {
                    276:                                        switch (acn) {
                    277:                                        case 1:
                    278:                                                (*pplots->plot)(X[0]);
                    279:                                                break;
                    280:                                        case 2:
                    281:                                                (*pplots->plot)(X[0], X[1]);
                    282:                                                break;
                    283:                                        case 3:
                    284:                                                (*pplots->plot)(X[0],X[1],X[2]);
                    285:                                                break;
                    286:                                        case 4:
                    287:                                                (*pplots->plot)(X[0],X[1],X[2],X[3]);
                    288:                                                break;
                    289:                                        case 6:
                    290:                                                (*pplots->plot)(X[0],X[1],X[2],
                    291:                                                        X[3], X[4], X[5]);
                    292:                                                break;
                    293:                                        case 7:
                    294:                                                (*pplots->plot)(X[0],X[1],X[2],
                    295:                                                        X[3], X[4], X[5], X[6]);
                    296:                                                break;
                    297:                                        case 256:
                    298:                                                (*pplots->plot)(truef, X);
                    299:                                                break;
                    300:                                        }
                    301:                                        acn = 0;
                    302:                                        xp = X;
                    303:                                }
                    304:                        }
                    305:                }
                    306:        }
                    307: }
                    308: char   *malloc();
                    309: char   *realloc();
                    310: char *names = 0;
                    311: char *enames = 0;
                    312: char *bstash = 0;
                    313: char *estash = 0;
                    314: unsigned size = 1024;
                    315: char *nstash = 0;
                    316: define(a)
                    317: char   *a;
                    318: {
                    319:        char    *ap, *aq;
                    320:        short   i, j;
                    321:        int curly = 0;
                    322:        ap = a;
                    323:        while(isalpha(*ap))ap++;
                    324:        if(ap == a){
                    325:                fprintf(stderr,"no name with define\n");
                    326:                exit(1);
                    327:        }
                    328:        i = ap - a;
                    329:        if(names+i+1 > enames){
                    330:                names = malloc((unsigned)512);
                    331:                enames = names + 512;
                    332:        }
                    333:        fptr->name = names;
                    334:        strncpy(names, a,i);
                    335:        names += i;
                    336:        *names++ = '\0';
                    337:        if(!bstash){
                    338:                bstash = nstash = malloc(size);
                    339:                estash = bstash + size;
                    340:        }
                    341:        fptr->stash = nstash;
                    342:        while(*ap != '{')
                    343:                if(*ap == '\n'){
                    344:                        if((ap=fgets(aa,256,fd))==NULL){
                    345:                                fprintf(stderr,"unexpected end of file\n");
                    346:                                exit(1);
                    347:                        }
                    348:                }
                    349:                else ap++;
                    350:        while((j=getc(fd))!= EOF){
                    351:                if(j == '{')curly++;
                    352:                else if(j == '}'){
                    353:                        if(curly == 0)break;
                    354:                        else curly--;
                    355:                }
                    356:                *nstash++ = j;
                    357:                if(nstash == estash){
                    358:                        free(bstash);
                    359:                        size += 1024;
                    360:                        bstash = realloc(bstash,size);
                    361:                        estash = bstash+size;
                    362:                }
                    363:        }
                    364:        *nstash++ = '\0';
                    365:        if(fptr++ >= &flibr[MAXL]){
                    366:                fprintf(stderr,"Too many objects\n");
                    367:                exit(1);
                    368:        }
                    369: }
                    370: call(a)
                    371: char *a;
                    372: {
                    373:        char *ap;
                    374:        struct fcall *f;
                    375:        char sav;
                    376:        ap = a;
                    377:        while(isalpha(*ap))ap++;
                    378:        sav = *ap;
                    379:        *ap = '\0';
                    380:        for(f=flibr;f<fptr;f++){
                    381:                if (!(strcmp(a, f->name)))
                    382:                        break;
                    383:        }
                    384:        if(f == fptr){
                    385:                fprintf(stderr, "object %s not defined\n",a);
                    386:                exit(1);
                    387:        }
                    388:        *ap = sav;
                    389:        while (isspace(*ap) || *ap == ',') 
                    390:                ap++;
                    391:        if (*ap != '\0')
                    392:                SC = atof(ap);
                    393:        else SC = 1.;
                    394:        *(++fstp) = f->stash;
                    395:        FN = 0;
                    396: }
                    397: pinclude(a)
                    398: char   *a;
                    399: {
                    400:        FILE * fd1;
                    401:        char    aa[256], *ap;
                    402:        double  x[256], *xp;
                    403:        int     n;
                    404:        if ((fd1 = fopen(a + 1, "r")) == NULL) {
                    405:                perror();
                    406:                fprintf(stderr, "Cannot find %s\n", a + 1);
                    407:                return(0);
                    408:        }
                    409:        xp = x;
                    410:        while (fgets(aa, 256, fd1) != NULL) {
                    411:                ap = aa;
                    412:                while (*ap != NULL && *ap != '\n') {
                    413:                        while (isspace(*ap) || *ap == ',') 
                    414:                                ap++;
                    415:                        if (*ap == NULL)
                    416:                                break;
                    417:                        *xp++ = atof(ap);
                    418:                        while (!(isspace(*ap)) && *ap != ',' && *ap != NULL) 
                    419:                                ap++;
                    420:                }
                    421:        }
                    422:        fclose(fd1);
                    423: }
                    424: char *getl(a)
                    425: char a[];
                    426: {
                    427:        char *ap;
                    428: newl:
                    429:        if(FN){
                    430:                if (fgets(a, 256, fd) == NULL)
                    431:                        return(0);
                    432:                if(*a == '\n')goto newl;
                    433:                return(a);
                    434:        } else   {
                    435:                if(**fstp == '\0'){
                    436:                        fstp--;
                    437:                        if(fstp == fstack){
                    438:                                SC = 1.;
                    439:                                FN = 1;
                    440:                        }
                    441:                        goto newl;
                    442:                }
                    443:                ap = *fstp;
                    444:                *fstp = index(*fstp,'\n') +1;
                    445:                return(ap);
                    446:        }
                    447: }
                    448: spline(n1, f1)
                    449: int n1[];
                    450: double *f1[];
                    451: {
                    452:        splin(0,n1,f1);
                    453: }
                    454: fspline(n1,f1)
                    455: int n1[];
                    456: double *f1[];
                    457: {
                    458:        splin(1,n1,f1);
                    459: }
                    460: lspline(n1,f1)
                    461: int n1[];
                    462: double *f1[];
                    463: {
                    464:        splin(2,n1,f1);
                    465: }
                    466: dspline(n1,f1)
                    467: int n1[];
                    468: double *f1[];
                    469: {
                    470:        splin(3,n1,f1);
                    471: }
                    472: cspline(n1,f1)
                    473: int n1[];
                    474: double *f1[];
                    475: {
                    476:        splin(4,n1,f1);
                    477: }

unix.superglobalmegacorp.com

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