Annotation of researchv10no/cmd/graph/graph.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: #include <math.h>
                      4: #include <iplot.h>
                      5: #define        INF     1.e+37
                      6: #define        F       .25
                      7: 
                      8: struct xy {
                      9:        int     xlbf;   /*flag:explicit lower bound*/
                     10:        int     xubf;   /*flag:explicit upper bound*/
                     11:        int     xqf;    /*flag:explicit quantum*/
                     12:        double (*xf)(); /*transform function, e.g. log*/
                     13:        float   xa,xb;  /*scaling coefficients*/
                     14:        float   xlb,xub;        /*lower and upper bound*/
                     15:        float   xquant; /*quantum*/
                     16:        float   xoff;           /*screen offset fraction*/
                     17:        float   xsize;          /*screen fraction*/
                     18:        int     xbot,xtop;      /*screen coords of border*/     
                     19:        float   xmult;  /*scaling constant*/
                     20: } xd,yd;
                     21: struct val {
                     22:        float xv;
                     23:        float yv;
                     24:        int lblptr;
                     25: } *xx;
                     26: 
                     27: char *labs;
                     28: int labsiz;
                     29: 
                     30: int tick = 50;
                     31: int top = 4000;
                     32: int bot = 200;
                     33: float absbot;
                     34: int    n;
                     35: int    erasf = 1;
                     36: int    gridf = 2;
                     37: int    symbf = 0;
                     38: int    absf = 0;
                     39: int    transf;
                     40: int    equf;
                     41: int    brkf;
                     42: int    ovlay = 1;
                     43: float  dx;
                     44: char   *plotsymb;
                     45: 
                     46: double atof();
                     47: #define BSIZ 80
                     48: char   labbuf[BSIZ];
                     49: char   titlebuf[BSIZ];
                     50: 
                     51: char *modes[] = {
                     52:        "disconnected",
                     53:        "solid",
                     54:        "dotted",
                     55:        "dotdashed",
                     56:        "shortdashed",
                     57:        "longdashed"
                     58: };
                     59: int mode = 1;
                     60: char *realloc();
                     61: char *malloc();
                     62: 
                     63: double ident(x)
                     64: double x;
                     65: {
                     66:        return(x);
                     67: }
                     68: 
                     69: main(argc,argv)
                     70: char *argv[];
                     71: {
                     72: 
                     73:        openpl();
                     74:        range(0,0,4096,4096);
                     75:        init(&xd);
                     76:        init(&yd);
                     77:        xd.xsize = yd.xsize = 1.;
                     78:        xx = (struct val *)malloc((unsigned)sizeof(struct val));
                     79:        labs = malloc(1);
                     80:        labs[labsiz++] = 0;
                     81:        setopt(argc,argv);
                     82:        if(erasf)
                     83:                erase();
                     84:        readin();
                     85:        transpose();
                     86:        getlim(&xd,(struct val *)&xx->xv);
                     87:        getlim(&yd,(struct val *)&xx->yv);
                     88:        if(equf) {
                     89:                equilibrate(&xd,&yd);
                     90:                equilibrate(&yd,&xd);
                     91:        }
                     92:        scale(&xd,(struct val *)&xx->xv);
                     93:        scale(&yd,(struct val *)&xx->yv);
                     94:        axes();
                     95:        title();
                     96:        plot();
                     97:        closepl();
                     98:        return(0);
                     99: }
                    100: 
                    101: init(p)
                    102: struct xy *p;
                    103: {
                    104:        p->xf = ident;
                    105:        p->xmult = 1;
                    106: }
                    107: 
                    108: setopt(argc,argv)
                    109: char *argv[];
                    110: {
                    111:        char *p1, *p2;
                    112:        float temp;
                    113: 
                    114:        xd.xlb = yd.xlb = INF;
                    115:        xd.xub = yd.xub = -INF;
                    116:        while(--argc > 0) {
                    117:                argv++;
                    118: again:         switch(argv[0][0]) {
                    119:                case '-':
                    120:                        argv[0]++;
                    121:                        goto again;
                    122:                case 'l': /* label for plot */
                    123:                        p1 = titlebuf;
                    124:                        if (argc>=2) {
                    125:                                argv++;
                    126:                                argc--;
                    127:                                p2 = argv[0];
                    128:                                while (*p1++ = *p2++);
                    129:                        }
                    130:                        break;
                    131: 
                    132:                case 'd':       /*disconnected,obsolete option*/
                    133:                case 'm': /*line mode*/
                    134:                        mode = 0;
                    135:                        if(!numb(&temp,&argc,&argv))
                    136:                                break;
                    137:                        if(temp>=sizeof(modes)/sizeof(*modes))
                    138:                                mode = 1;
                    139:                        else if(temp>=-1)
                    140:                                mode = temp;
                    141:                        break;
                    142: 
                    143:                case 'o':
                    144:                        if(numb(&temp,&argc,&argv) && temp>=1)
                    145:                                ovlay = temp;
                    146:                        break;
                    147:                case 'a': /*automatic abscissas*/
                    148:                        absf = 1;
                    149:                        dx = 1;
                    150:                        if(!numb(&dx,&argc,&argv))
                    151:                                break;
                    152:                        if(numb(&absbot,&argc,&argv))
                    153:                                absf = 2;
                    154:                        break;
                    155: 
                    156:                case 's': /*save screen, overlay plot*/
                    157:                        erasf = 0;
                    158:                        break;
                    159: 
                    160:                case 'g': /*grid style 0 none, 1 ticks, 2 full*/
                    161:                        gridf = 0;
                    162:                        if(!numb(&temp,&argc,&argv))
                    163:                                temp = argv[0][1]-'0';  /*for caompatibility*/
                    164:                        if(temp>=0&&temp<=2)
                    165:                                gridf = temp;
                    166:                        break;
                    167: 
                    168:                case 'c': /*character(s) for plotting*/
                    169:                        if(argc >= 2) {
                    170:                                symbf = 1;
                    171:                                plotsymb = argv[1];
                    172:                                argv++;
                    173:                                argc--;
                    174:                        }
                    175:                        break;
                    176: 
                    177:                case 't':       /*transpose*/
                    178:                        transf = 1;
                    179:                        break;
                    180:                case 'e':       /*equal scales*/
                    181:                        equf = 1;
                    182:                        break;
                    183:                case 'b':       /*breaks*/
                    184:                        brkf = 1;
                    185:                        break;
                    186:                case 'x':       /*x limits */
                    187:                        limread(&xd,&argc,&argv);
                    188:                        break;
                    189:                case 'y':
                    190:                        limread(&yd,&argc,&argv);
                    191:                        break;
                    192:                case 'h': /*set height of plot */
                    193:                        if(!numb(&yd.xsize, &argc,&argv))
                    194:                                badarg();
                    195:                        break;
                    196:                case 'w': /*set width of plot */
                    197:                        if(!numb(&xd.xsize, &argc, &argv))
                    198:                                badarg();
                    199:                        break;
                    200:                case 'r': /* set offset to right */
                    201:                        if(!numb(&xd.xoff, &argc, &argv))
                    202:                                badarg();
                    203:                        break;
                    204:                case 'u': /*set offset up the screen*/
                    205:                        if(!numb(&yd.xoff,&argc,&argv))
                    206:                                badarg();
                    207:                        break;
                    208:                default:
                    209:                        badarg();
                    210:                }
                    211:        }
                    212: }
                    213: 
                    214: limread(p, argcp, argvp)
                    215: register struct xy *p;
                    216: int *argcp;
                    217: char ***argvp;
                    218: {
                    219:        if(*argcp>1 && (*argvp)[1][0]=='l') {
                    220:                (*argcp)--;
                    221:                (*argvp)++;
                    222:                p->xf = log10;
                    223:        }
                    224:        if(!numb(&p->xlb,argcp,argvp))
                    225:                return;
                    226:        p->xlbf = 1;
                    227:        if(!numb(&p->xub,argcp,argvp))
                    228:                return;
                    229:        p->xubf = 1;
                    230:        if(!numb(&p->xquant,argcp,argvp))
                    231:                return;
                    232:        p->xqf = 1;
                    233: }
                    234: 
                    235: numb(np, argcp, argvp)
                    236: int *argcp;
                    237: float *np;
                    238: register char ***argvp;
                    239: {
                    240:        register char c;
                    241: 
                    242:        if(*argcp <= 1)
                    243:                return(0);
                    244:        while((c=(*argvp)[1][0]) == '+')
                    245:                (*argvp)[1]++;
                    246:        if(!(isdigit(c) || c=='-'&&(*argvp)[1][1]<'A' || c=='.'))
                    247:                return(0);
                    248:        *np = atof((*argvp)[1]);
                    249:        (*argcp)--;
                    250:        (*argvp)++;
                    251:        return(1);
                    252: }
                    253: 
                    254: readin()
                    255: {
                    256:        register t,i;
                    257:        struct val *temp;
                    258: 
                    259:        if(absf==1) {
                    260:                if(xd.xlbf)
                    261:                        absbot = xd.xlb;
                    262:                else if(xd.xf==log10)
                    263:                        absbot = 1;
                    264:        }
                    265:        for(;;) {
                    266:                temp = (struct val *)realloc((char*)xx,
                    267:                        (unsigned)(n+ovlay)*sizeof(struct val));
                    268:                if(temp==0)
                    269:                        return;
                    270:                xx = temp;
                    271:                if(absf)
                    272:                        xx[n].xv = n*dx/ovlay + absbot;
                    273:                else
                    274:                        if(!getfloat(&xx[n].xv))
                    275:                                return;
                    276:                for(i=0;i<ovlay;i++) {
                    277:                        xx[n+i].xv = xx[n].xv;
                    278:                        if(!getfloat(&xx[n+i].yv))
                    279:                                return;
                    280:                        xx[n+i].lblptr = -1;
                    281:                        t = getstring();
                    282:                        if(t>0)
                    283:                                xx[n+i].lblptr = copystring(t);
                    284:                        if(t<0 && i+1<ovlay)
                    285:                                return;
                    286:                }
                    287:                n += ovlay;
                    288:                if(t<0)
                    289:                        return;
                    290:        }
                    291: }
                    292: 
                    293: transpose()
                    294: {
                    295:        register i;
                    296:        float f;
                    297:        struct xy t;
                    298:        if(!transf)
                    299:                return;
                    300:        t = xd; xd = yd; yd = t;
                    301:        for(i= 0;i<n;i++) {
                    302:                f = xx[i].xv; xx[i].xv = xx[i].yv; xx[i].yv = f;
                    303:        }
                    304: }
                    305: 
                    306: copystring(k)
                    307: {
                    308:        register char *temp;
                    309:        register i;
                    310:        int q;
                    311: 
                    312:        temp = realloc(labs,(unsigned)(labsiz+1+k));
                    313:        if(temp==0)
                    314:                return(0);
                    315:        labs = temp;
                    316:        q = labsiz;
                    317:        for(i=0;i<=k;i++)
                    318:                labs[labsiz++] = labbuf[i];
                    319:        return(q);
                    320: }
                    321: 
                    322: float
                    323: modceil(f,t)
                    324: float f,t;
                    325: {
                    326: 
                    327:        t = fabs(t);
                    328:        return(ceil(f/t)*t);
                    329: }
                    330: 
                    331: float
                    332: modfloor(f,t)
                    333: float f,t;
                    334: {
                    335:        t = fabs(t);
                    336:        return(floor(f/t)*t);
                    337: }
                    338: 
                    339: getlim(p,v)
                    340: register struct xy *p;
                    341: struct val *v;
                    342: {
                    343:        register i;
                    344: 
                    345:        i = 0;
                    346:        do {
                    347:                if(!p->xlbf && p->xlb>v[i].xv)
                    348:                        p->xlb = v[i].xv;
                    349:                if(!p->xubf && p->xub<v[i].xv)
                    350:                        p->xub = v[i].xv;
                    351:                i++;
                    352:        } while(i < n);
                    353: }
                    354: 
                    355: struct z {
                    356:        float lb,ub,mult,quant;
                    357: } setloglim(), setlinlim();
                    358: 
                    359: setlim(p)
                    360: register struct xy *p;
                    361: {
                    362:        float t,delta,sign;
                    363:        struct z z;
                    364:        int mark[50];
                    365:        float lb,ub;
                    366:        int lbf,ubf;
                    367: 
                    368:        lb = p->xlb;
                    369:        ub = p->xub;
                    370:        delta = ub-lb;
                    371:        if(p->xqf) {
                    372:                if(delta*p->xquant <=0 )
                    373:                        badarg();
                    374:                return;
                    375:        }
                    376:        sign = 1;
                    377:        lbf = p->xlbf;
                    378:        ubf = p->xubf;
                    379:        if(delta < 0) {
                    380:                sign = -1;
                    381:                t = lb;
                    382:                lb = ub;
                    383:                ub = t;
                    384:                t = lbf;
                    385:                lbf = ubf;
                    386:                ubf = t;
                    387:        }
                    388:        else if(delta == 0) {
                    389:                if(ub > 0) {
                    390:                        ub = 2*ub;
                    391:                        lb = 0;
                    392:                } 
                    393:                else
                    394:                        if(lb < 0) {
                    395:                                lb = 2*lb;
                    396:                                ub = 0;
                    397:                        } 
                    398:                        else {
                    399:                                ub = 1;
                    400:                                lb = -1;
                    401:                        }
                    402:        }
                    403:        if(p->xf==log10 && lb>0 && ub>lb) {
                    404:                z = setloglim(lbf,ubf,lb,ub);
                    405:                p->xlb = z.lb;
                    406:                p->xub = z.ub;
                    407:                p->xmult *= z.mult;
                    408:                p->xquant = z.quant;
                    409:                if(setmark(mark,p)<2) {
                    410:                        p->xqf = lbf = ubf = 1;
                    411:                        lb = z.lb; ub = z.ub;
                    412:                } else
                    413:                        return;
                    414:        }
                    415:        z = setlinlim(lbf,ubf,lb,ub);
                    416:        if(sign > 0) {
                    417:                p->xlb = z.lb;
                    418:                p->xub = z.ub;
                    419:        } else {
                    420:                p->xlb = z.ub;
                    421:                p->xub = z.lb;
                    422:        }
                    423:        p->xmult *= z.mult;
                    424:        p->xquant = sign*z.quant;
                    425: }
                    426: 
                    427: struct z
                    428: setloglim(lbf,ubf,lb,ub)
                    429: float lb,ub;
                    430: {
                    431:        float r,s,t;
                    432:        struct z z;
                    433: 
                    434:        for(s=1; lb*s<1; s*=10) ;
                    435:        lb *= s;
                    436:        ub *= s;
                    437:        for(r=1; 10*r<=lb; r*=10) ;
                    438:        for(t=1; t<ub; t*=10) ;
                    439:        z.lb = !lbf ? r : lb;
                    440:        z.ub = !ubf ? t : ub;
                    441:        if(ub/lb<100) {
                    442:                if(!lbf) {
                    443:                        if(lb >= 5*z.lb)
                    444:                                z.lb *= 5;
                    445:                        else if(lb >= 2*z.lb)
                    446:                                z.lb *= 2;
                    447:                }
                    448:                if(!ubf) {
                    449:                        if(ub*5 <= z.ub)
                    450:                                z.ub /= 5;
                    451:                        else if(ub*2 <= z.ub)
                    452:                                z.ub /= 2;
                    453:                }
                    454:        }
                    455:        z.mult = s;
                    456:        z.quant = r;
                    457:        return(z);
                    458: }
                    459: 
                    460: struct z
                    461: setlinlim(lbf,ubf,xlb,xub)
                    462: int lbf,ubf;
                    463: float xlb,xub;
                    464: {
                    465:        struct z z;
                    466:        float r,s,delta;
                    467:        float ub,lb;
                    468: 
                    469: loop:
                    470:        ub = xub;
                    471:        lb = xlb;
                    472:        delta = ub - lb;
                    473:        /*scale up by s, a power of 10, so range (delta) exceeds 1*/
                    474:        /*find power of 10 quantum, r, such that delta/10<=r<delta*/
                    475:        r = s = 1;
                    476:        while(delta*s < 10)
                    477:                s *= 10;
                    478:        delta *= s;
                    479:        while(10*r < delta)
                    480:                r *= 10;
                    481:        lb *= s;
                    482:        ub *= s;
                    483:        /*set r=(1,2,5)*10**n so that 3-5 quanta cover range*/
                    484:        if(r>=delta/2)
                    485:                r /= 2;
                    486:        else if(r<delta/5)
                    487:                r *= 2;
                    488:        z.ub = ubf? ub: modceil(ub,r);
                    489:        z.lb = lbf? lb: modfloor(lb,r);
                    490:        if(!lbf && z.lb<=r && z.lb>0) {
                    491:                xlb = 0;
                    492:                goto loop;
                    493:        }
                    494:        else if(!ubf && z.ub>=-r && z.ub<0) {
                    495:                xub = 0;
                    496:                goto loop;
                    497:        }
                    498:        z.quant = r;
                    499:        z.mult = s;
                    500:        return(z);
                    501: }
                    502: 
                    503: scale(p)
                    504: register struct xy *p;
                    505: {
                    506:        float edge;
                    507: 
                    508:        setlim(p);
                    509:        edge = top-bot;
                    510:        p->xa = p->xsize*edge/((*p->xf)(p->xub) - (*p->xf)(p->xlb));
                    511:        p->xbot = bot + edge*p->xoff;
                    512:        p->xtop = p->xbot + (top-bot)*p->xsize;
                    513:        p->xb = p->xbot - (*p->xf)(p->xlb)*p->xa + .5;
                    514: }
                    515: 
                    516: equilibrate(p,q)
                    517: struct xy *p,*q;
                    518: {
                    519:        if(p->xlbf||    /* needn't test xubf; it implies xlbf*/
                    520:           q->xubf&&q->xlb>q->xub)
                    521:                return;
                    522:        if(p->xlb>q->xlb) {
                    523:                p->xlb = q->xlb;
                    524:                p->xlbf = q->xlbf;
                    525:        }
                    526:        if(p->xub<q->xub) {
                    527:                p->xub = q->xub;
                    528:                p->xubf = q->xubf;
                    529:        }
                    530: }
                    531: 
                    532: axes()
                    533: {
                    534:        register i;
                    535:        int mark[50];
                    536:        int xn, yn;
                    537:        if(gridf==0)
                    538:                return;
                    539: 
                    540:        line(xd.xbot,yd.xbot,xd.xtop,yd.xbot);
                    541:        vec(xd.xtop,yd.xtop);
                    542:        vec(xd.xbot,yd.xtop);
                    543:        vec(xd.xbot,yd.xbot);
                    544: 
                    545:        xn = setmark(mark,&xd);
                    546:        for(i=0; i<xn; i++) {
                    547:                if(gridf==2)
                    548:                        line(mark[i],yd.xbot,mark[i],yd.xtop);
                    549:                if(gridf==1) {
                    550:                        line(mark[i],yd.xbot,mark[i],yd.xbot+tick);
                    551:                        line(mark[i],yd.xtop-tick,mark[i],yd.xtop);
                    552:                }
                    553:        }
                    554:        yn = setmark(mark,&yd);
                    555:        for(i=0; i<yn; i++) {
                    556:                if(gridf==2)
                    557:                        line(xd.xbot,mark[i],xd.xtop,mark[i]);
                    558:                if(gridf==1) {
                    559:                        line(xd.xbot,mark[i],xd.xbot+tick,mark[i]);
                    560:                        line(xd.xtop-tick,mark[i],xd.xtop,mark[i]);
                    561:                }
                    562:        }
                    563: }
                    564: 
                    565: setmark(xmark,p)
                    566: int *xmark;
                    567: register struct xy *p;
                    568: {
                    569:        int xn = 0;
                    570:        float x,xl,xu;
                    571:        float q;
                    572:        if(p->xf==log10&&!p->xqf) {
                    573:                for(x=p->xquant; x<p->xub; x*=10) {
                    574:                        submark(xmark,&xn,x,p);
                    575:                        if(p->xub/p->xlb<=100) {
                    576:                                submark(xmark,&xn,2*x,p);
                    577:                                submark(xmark,&xn,5*x,p);
                    578:                        }
                    579:                }
                    580:        } else {
                    581:                xn = 0;
                    582:                q = p->xquant;
                    583:                if(q>0) {
                    584:                        xl = modceil(p->xlb+q/6,q);
                    585:                        xu = modfloor(p->xub-q/6,q)+q/2;
                    586:                } else {
                    587:                        xl = modceil(p->xub-q/6,q);
                    588:                        xu = modfloor(p->xlb+q/6,q)-q/2;
                    589:                }
                    590:                for(x=xl; x<=xu; x+=fabs(p->xquant))
                    591:                        xmark[xn++] = (*p->xf)(x)*p->xa + p->xb;
                    592:        }
                    593:        return(xn);
                    594: }
                    595: submark(xmark,pxn,x,p)
                    596: int *xmark;
                    597: int *pxn;
                    598: float x;
                    599: struct xy *p;
                    600: {
                    601:        if(1.001*p->xlb < x && .999*p->xub > x)
                    602:                xmark[(*pxn)++] = log10(x)*p->xa + p->xb;
                    603: }
                    604: 
                    605: plot()
                    606: {
                    607:        int ix,iy;
                    608:        int i,j;
                    609:        int conn;
                    610: 
                    611:        for(j=0;j<ovlay;j++) {
                    612:                switch(mode) {
                    613:                case -1:
                    614:                        pen(modes[j%(sizeof modes/sizeof *modes-1)+1]);
                    615:                        break;
                    616:                case 0:
                    617:                        break;
                    618:                default:
                    619:                        pen(modes[mode]);
                    620:                }
                    621:                conn = 0;
                    622:                for(i=j; i<n; i+=ovlay) {
                    623:                        if(!conv(xx[i].xv,&xd,&ix) ||
                    624:                           !conv(xx[i].yv,&yd,&iy)) {
                    625:                                conn = 0;
                    626:                                continue;
                    627:                        }
                    628:                        if(mode!=0) {
                    629:                                if(conn != 0)
                    630:                                        vec(ix,iy);
                    631:                                else
                    632:                                        move(ix,iy);
                    633:                                conn = 1;
                    634:                        }
                    635:                        conn &= symbol(ix,iy,xx[i].lblptr);
                    636:                }
                    637:        }
                    638:        pen(modes[1]);
                    639: }
                    640: 
                    641: conv(xv,p,ip)
                    642: float xv;
                    643: register struct xy *p;
                    644: int *ip;
                    645: {
                    646:        long ix;
                    647:        ix = p->xa*(*p->xf)(xv*p->xmult) + p->xb;
                    648:        if(ix<p->xbot || ix>p->xtop)
                    649:                return(0);
                    650:        *ip = ix;
                    651:        return(1);
                    652: }
                    653: 
                    654: getfloat(p)
                    655: float *p;
                    656: {
                    657:        register i;
                    658: 
                    659:        i = scanf("%f",p);
                    660:        return(i==1);
                    661: }
                    662: 
                    663: getstring()
                    664: {
                    665:        register i;
                    666:        char junk[20];
                    667:        i = scanf("%1s",labbuf);
                    668:        if(i==-1)
                    669:                return(-1);
                    670:        switch(*labbuf) {
                    671:        default:
                    672:                if(!isdigit(*labbuf)) {
                    673:                        ungetc(*labbuf,stdin);
                    674:                        i = scanf("%s",labbuf);
                    675:                        break;
                    676:                }
                    677:        case '.':
                    678:        case '+':
                    679:        case '-':
                    680:                ungetc(*labbuf,stdin);
                    681:                return(0);
                    682:        case '"':
                    683:                i = scanf("%[^\"\n]",labbuf);
                    684:                scanf("%[\"]",junk);
                    685:                break;
                    686:        }
                    687:        if(i==-1)
                    688:                return(-1);
                    689:        return(strlen(labbuf));
                    690: }
                    691: 
                    692: 
                    693: symbol(ix,iy,k)
                    694: {
                    695: 
                    696:        if(symbf==0&&k<0) {
                    697:                if(mode==0)
                    698:                        point(ix,iy);
                    699:                return(1);
                    700:        } 
                    701:        else {
                    702:                move(ix,iy);
                    703:                text(k>=0?labs+k:plotsymb);
                    704:                move(ix,iy);
                    705:                return(!brkf|k<0);
                    706:        }
                    707: }
                    708: 
                    709: title()
                    710: {
                    711:        char buf[BSIZ+100];
                    712:        buf[0] = ' ';
                    713:        buf[1] = ' ';
                    714:        buf[2] = ' ';
                    715:        strcpy(buf+3,titlebuf);
                    716:        if(erasf&&gridf) {
                    717:                axlab('x',&xd,buf);
                    718:                strcat(buf,",");
                    719:                axlab('y',&yd,buf);
                    720:        }
                    721:        move(xd.xbot,yd.xbot-60);
                    722:        text(buf);
                    723: }
                    724: 
                    725: axlab(c,p,b)
                    726: char c;
                    727: struct xy *p;
                    728: char *b;
                    729: {
                    730:        char *dir;
                    731:        dir = p->xlb<p->xub? "<=": ">=";
                    732:        sprintf(b+strlen(b), " %g %s %c%s %s %g", p->xlb/p->xmult,
                    733:                dir, c, p->xf==log10?" (log)":"", dir, p->xub/p->xmult);
                    734: }
                    735: 
                    736: badarg()
                    737: {
                    738:        fprintf(stderr,"graph: error in arguments\n");
                    739:        closepl();
                    740:        exit(1);
                    741: }

unix.superglobalmegacorp.com

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