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