1*11779Ssam #ifndef lint 2*11779Ssam static char sccsid[] = "@(#)graph.c 4.2 03/30/83"; 3*11779Ssam #endif 4*11779Ssam 511778Ssam #include <stdio.h> 611778Ssam #include <ctype.h> 711778Ssam #include <math.h> 811778Ssam #define INF HUGE 911778Ssam #define F .25 1011778Ssam 1111778Ssam struct xy { 1211778Ssam int xlbf; /*flag:explicit lower bound*/ 1311778Ssam int xubf; /*flag:explicit upper bound*/ 1411778Ssam int xqf; /*flag:explicit quantum*/ 1511778Ssam double (*xf)(); /*transform function, e.g. log*/ 1611778Ssam float xa,xb; /*scaling coefficients*/ 1711778Ssam float xlb,xub; /*lower and upper bound*/ 1811778Ssam float xquant; /*quantum*/ 1911778Ssam float xoff; /*screen offset fraction*/ 2011778Ssam float xsize; /*screen fraction*/ 2111778Ssam int xbot,xtop; /*screen coords of border*/ 2211778Ssam float xmult; /*scaling constant*/ 2311778Ssam } xd,yd; 2411778Ssam struct val { 2511778Ssam float xv; 2611778Ssam float yv; 2711778Ssam int lblptr; 2811778Ssam } *xx; 2911778Ssam 3011778Ssam char *labs; 3111778Ssam int labsiz; 3211778Ssam 3311778Ssam int tick = 50; 3411778Ssam int top = 4000; 3511778Ssam int bot = 200; 3611778Ssam float absbot; 3711778Ssam int n; 3811778Ssam int erasf = 1; 3911778Ssam int gridf = 2; 4011778Ssam int symbf = 0; 4111778Ssam int absf = 0; 4211778Ssam int transf; 4311778Ssam int brkf; 4411778Ssam float dx; 4511778Ssam char *plotsymb; 4611778Ssam 4711778Ssam double atof(); 4811778Ssam #define BSIZ 80 4911778Ssam char labbuf[BSIZ]; 5011778Ssam char titlebuf[BSIZ]; 5111778Ssam 5211778Ssam char *modes[] = { 5311778Ssam "disconnected", 5411778Ssam "solid", 5511778Ssam "dotted", 5611778Ssam "dotdashed", 5711778Ssam "shortdashed", 5811778Ssam "longdashed" 5911778Ssam }; 6011778Ssam int mode = 1; 6111778Ssam char *realloc(); 6211778Ssam char *malloc(); 6311778Ssam 6411778Ssam double ident(x) 6511778Ssam double x; 6611778Ssam { 6711778Ssam return(x); 6811778Ssam } 6911778Ssam 7011778Ssam main(argc,argv) 7111778Ssam char *argv[]; 7211778Ssam { 7311778Ssam 7411778Ssam space(0,0,4096,4096); 7511778Ssam init(&xd); 7611778Ssam init(&yd); 7711778Ssam xd.xsize = yd.xsize = 1.; 7811778Ssam xx = (struct val *)malloc((unsigned)sizeof(struct val)); 7911778Ssam labs = malloc(1); 8011778Ssam labs[labsiz++] = 0; 8111778Ssam setopt(argc,argv); 8211778Ssam if(erasf) 8311778Ssam erase(); 8411778Ssam readin(); 8511778Ssam transpose(); 8611778Ssam scale(&xd,(struct val *)&xx->xv); 8711778Ssam scale(&yd,(struct val *)&xx->yv); 8811778Ssam axes(); 8911778Ssam title(); 9011778Ssam plot(); 9111778Ssam move(1,1); 9211778Ssam closevt(); 9311778Ssam return(0); 9411778Ssam } 9511778Ssam 9611778Ssam init(p) 9711778Ssam struct xy *p; 9811778Ssam { 9911778Ssam p->xf = ident; 10011778Ssam p->xmult = 1; 10111778Ssam } 10211778Ssam 10311778Ssam setopt(argc,argv) 10411778Ssam char *argv[]; 10511778Ssam { 10611778Ssam char *p1, *p2; 10711778Ssam float temp; 10811778Ssam 10911778Ssam xd.xlb = yd.xlb = INF; 11011778Ssam xd.xub = yd.xub = -INF; 11111778Ssam while(--argc > 0) { 11211778Ssam argv++; 11311778Ssam again: switch(argv[0][0]) { 11411778Ssam case '-': 11511778Ssam argv[0]++; 11611778Ssam goto again; 11711778Ssam case 'l': /* label for plot */ 11811778Ssam p1 = titlebuf; 11911778Ssam if (argc>=2) { 12011778Ssam argv++; 12111778Ssam argc--; 12211778Ssam p2 = argv[0]; 12311778Ssam while (*p1++ = *p2++); 12411778Ssam } 12511778Ssam break; 12611778Ssam 12711778Ssam case 'd': /*disconnected,obsolete option*/ 12811778Ssam case 'm': /*line mode*/ 12911778Ssam mode = 0; 13011778Ssam if(!numb(&temp,&argc,&argv)) 13111778Ssam break; 13211778Ssam if(temp>=sizeof(modes)/sizeof(*modes)) 13311778Ssam mode = 1; 13411778Ssam else if(temp>=0) 13511778Ssam mode = temp; 13611778Ssam break; 13711778Ssam 13811778Ssam case 'a': /*automatic abscissas*/ 13911778Ssam absf = 1; 14011778Ssam dx = 1; 14111778Ssam if(!numb(&dx,&argc,&argv)) 14211778Ssam break; 14311778Ssam if(numb(&absbot,&argc,&argv)) 14411778Ssam absf = 2; 14511778Ssam break; 14611778Ssam 14711778Ssam case 's': /*save screen, overlay plot*/ 14811778Ssam erasf = 0; 14911778Ssam break; 15011778Ssam 15111778Ssam case 'g': /*grid style 0 none, 1 ticks, 2 full*/ 15211778Ssam gridf = 0; 15311778Ssam if(!numb(&temp,&argc,&argv)) 15411778Ssam temp = argv[0][1]-'0'; /*for caompatibility*/ 15511778Ssam if(temp>=0&&temp<=2) 15611778Ssam gridf = temp; 15711778Ssam break; 15811778Ssam 15911778Ssam case 'c': /*character(s) for plotting*/ 16011778Ssam if(argc >= 2) { 16111778Ssam symbf = 1; 16211778Ssam plotsymb = argv[1]; 16311778Ssam argv++; 16411778Ssam argc--; 16511778Ssam } 16611778Ssam break; 16711778Ssam 16811778Ssam case 't': /*transpose*/ 16911778Ssam transf = 1; 17011778Ssam break; 17111778Ssam case 'b': /*breaks*/ 17211778Ssam brkf = 1; 17311778Ssam break; 17411778Ssam case 'x': /*x limits */ 17511778Ssam limread(&xd,&argc,&argv); 17611778Ssam break; 17711778Ssam case 'y': 17811778Ssam limread(&yd,&argc,&argv); 17911778Ssam break; 18011778Ssam case 'h': /*set height of plot */ 18111778Ssam if(!numb(&yd.xsize, &argc,&argv)) 18211778Ssam badarg(); 18311778Ssam break; 18411778Ssam case 'w': /*set width of plot */ 18511778Ssam if(!numb(&xd.xsize, &argc, &argv)) 18611778Ssam badarg(); 18711778Ssam break; 18811778Ssam case 'r': /* set offset to right */ 18911778Ssam if(!numb(&xd.xoff, &argc, &argv)) 19011778Ssam badarg(); 19111778Ssam break; 19211778Ssam case 'u': /*set offset up the screen*/ 19311778Ssam if(!numb(&yd.xoff,&argc,&argv)) 19411778Ssam badarg(); 19511778Ssam break; 19611778Ssam default: 19711778Ssam badarg(); 19811778Ssam } 19911778Ssam } 20011778Ssam } 20111778Ssam 20211778Ssam limread(p, argcp, argvp) 20311778Ssam register struct xy *p; 20411778Ssam int *argcp; 20511778Ssam char ***argvp; 20611778Ssam { 20711778Ssam if(*argcp>1 && (*argvp)[1][0]=='l') { 20811778Ssam (*argcp)--; 20911778Ssam (*argvp)++; 21011778Ssam p->xf = log10; 21111778Ssam } 21211778Ssam if(!numb(&p->xlb,argcp,argvp)) 21311778Ssam return; 21411778Ssam p->xlbf = 1; 21511778Ssam if(!numb(&p->xub,argcp,argvp)) 21611778Ssam return; 21711778Ssam p->xubf = 1; 21811778Ssam if(!numb(&p->xquant,argcp,argvp)) 21911778Ssam return; 22011778Ssam p->xqf = 1; 22111778Ssam } 22211778Ssam 22311778Ssam numb(np, argcp, argvp) 22411778Ssam int *argcp; 22511778Ssam float *np; 22611778Ssam register char ***argvp; 22711778Ssam { 22811778Ssam register char c; 22911778Ssam 23011778Ssam if(*argcp <= 1) 23111778Ssam return(0); 23211778Ssam while((c=(*argvp)[1][0]) == '+') 23311778Ssam (*argvp)[1]++; 23411778Ssam if(!(isdigit(c) || c=='-'&&(*argvp)[1][1]<'A' || c=='.')) 23511778Ssam return(0); 23611778Ssam *np = atof((*argvp)[1]); 23711778Ssam (*argcp)--; 23811778Ssam (*argvp)++; 23911778Ssam return(1); 24011778Ssam } 24111778Ssam 24211778Ssam readin() 24311778Ssam { 24411778Ssam register t; 24511778Ssam struct val *temp; 24611778Ssam 24711778Ssam if(absf==1) { 24811778Ssam if(xd.xlbf) 24911778Ssam absbot = xd.xlb; 25011778Ssam else if(xd.xf==log10) 25111778Ssam absbot = 1; 25211778Ssam } 25311778Ssam for(;;) { 25411778Ssam temp = (struct val *)realloc((char*)xx, 25511778Ssam (unsigned)(n+1)*sizeof(struct val)); 25611778Ssam if(temp==0) 25711778Ssam return; 25811778Ssam xx = temp; 25911778Ssam if(absf) 26011778Ssam xx[n].xv = n*dx + absbot; 26111778Ssam else 26211778Ssam if(!getfloat(&xx[n].xv)) 26311778Ssam return; 26411778Ssam if(!getfloat(&xx[n].yv)) 26511778Ssam return; 26611778Ssam xx[n].lblptr = -1; 26711778Ssam t = getstring(); 26811778Ssam if(t>0) 26911778Ssam xx[n].lblptr = copystring(t); 27011778Ssam n++; 27111778Ssam if(t<0) 27211778Ssam return; 27311778Ssam } 27411778Ssam } 27511778Ssam 27611778Ssam transpose() 27711778Ssam { 27811778Ssam register i; 27911778Ssam float f; 28011778Ssam struct xy t; 28111778Ssam if(!transf) 28211778Ssam return; 28311778Ssam t = xd; xd = yd; yd = t; 28411778Ssam for(i= 0;i<n;i++) { 28511778Ssam f = xx[i].xv; xx[i].xv = xx[i].yv; xx[i].yv = f; 28611778Ssam } 28711778Ssam } 28811778Ssam 28911778Ssam copystring(k) 29011778Ssam { 29111778Ssam register char *temp; 29211778Ssam register i; 29311778Ssam int q; 29411778Ssam 29511778Ssam temp = realloc(labs,(unsigned)(labsiz+1+k)); 29611778Ssam if(temp==0) 29711778Ssam return(0); 29811778Ssam labs = temp; 29911778Ssam q = labsiz; 30011778Ssam for(i=0;i<=k;i++) 30111778Ssam labs[labsiz++] = labbuf[i]; 30211778Ssam return(q); 30311778Ssam } 30411778Ssam 30511778Ssam float 30611778Ssam modceil(f,t) 30711778Ssam float f,t; 30811778Ssam { 30911778Ssam 31011778Ssam t = fabs(t); 31111778Ssam return(ceil(f/t)*t); 31211778Ssam } 31311778Ssam 31411778Ssam float 31511778Ssam modfloor(f,t) 31611778Ssam float f,t; 31711778Ssam { 31811778Ssam t = fabs(t); 31911778Ssam return(floor(f/t)*t); 32011778Ssam } 32111778Ssam 32211778Ssam getlim(p,v) 32311778Ssam register struct xy *p; 32411778Ssam struct val *v; 32511778Ssam { 32611778Ssam register i; 32711778Ssam 32811778Ssam i = 0; 32911778Ssam do { 33011778Ssam if(!p->xlbf && p->xlb>v[i].xv) 33111778Ssam p->xlb = v[i].xv; 33211778Ssam if(!p->xubf && p->xub<v[i].xv) 33311778Ssam p->xub = v[i].xv; 33411778Ssam i++; 33511778Ssam } while(i < n); 33611778Ssam } 33711778Ssam 33811778Ssam struct z { 33911778Ssam float lb,ub,mult,quant; 34011778Ssam } setloglim(), setlinlim(); 34111778Ssam 34211778Ssam setlim(p) 34311778Ssam register struct xy *p; 34411778Ssam { 34511778Ssam float t,delta,sign; 34611778Ssam struct z z; 34711778Ssam int mark[50]; 34811778Ssam float lb,ub; 34911778Ssam int lbf,ubf; 35011778Ssam 35111778Ssam lb = p->xlb; 35211778Ssam ub = p->xub; 35311778Ssam delta = ub-lb; 35411778Ssam if(p->xqf) { 35511778Ssam if(delta*p->xquant <=0 ) 35611778Ssam badarg(); 35711778Ssam return; 35811778Ssam } 35911778Ssam sign = 1; 36011778Ssam lbf = p->xlbf; 36111778Ssam ubf = p->xubf; 36211778Ssam if(delta < 0) { 36311778Ssam sign = -1; 36411778Ssam t = lb; 36511778Ssam lb = ub; 36611778Ssam ub = t; 36711778Ssam t = lbf; 36811778Ssam lbf = ubf; 36911778Ssam ubf = t; 37011778Ssam } 37111778Ssam else if(delta == 0) { 37211778Ssam if(ub > 0) { 37311778Ssam ub = 2*ub; 37411778Ssam lb = 0; 37511778Ssam } 37611778Ssam else 37711778Ssam if(lb < 0) { 37811778Ssam lb = 2*lb; 37911778Ssam ub = 0; 38011778Ssam } 38111778Ssam else { 38211778Ssam ub = 1; 38311778Ssam lb = -1; 38411778Ssam } 38511778Ssam } 38611778Ssam if(p->xf==log10 && lb>0 && ub>lb) { 38711778Ssam z = setloglim(lbf,ubf,lb,ub); 38811778Ssam p->xlb = z.lb; 38911778Ssam p->xub = z.ub; 39011778Ssam p->xmult *= z.mult; 39111778Ssam p->xquant = z.quant; 39211778Ssam if(setmark(mark,p)<2) { 39311778Ssam p->xqf = lbf = ubf = 1; 39411778Ssam lb = z.lb; ub = z.ub; 39511778Ssam } else 39611778Ssam return; 39711778Ssam } 39811778Ssam z = setlinlim(lbf,ubf,lb,ub); 39911778Ssam if(sign > 0) { 40011778Ssam p->xlb = z.lb; 40111778Ssam p->xub = z.ub; 40211778Ssam } else { 40311778Ssam p->xlb = z.ub; 40411778Ssam p->xub = z.lb; 40511778Ssam } 40611778Ssam p->xmult *= z.mult; 40711778Ssam p->xquant = sign*z.quant; 40811778Ssam } 40911778Ssam 41011778Ssam struct z 41111778Ssam setloglim(lbf,ubf,lb,ub) 41211778Ssam float lb,ub; 41311778Ssam { 41411778Ssam float r,s,t; 41511778Ssam struct z z; 41611778Ssam 41711778Ssam for(s=1; lb*s<1; s*=10) ; 41811778Ssam lb *= s; 41911778Ssam ub *= s; 42011778Ssam for(r=1; 10*r<=lb; r*=10) ; 42111778Ssam for(t=1; t<ub; t*=10) ; 42211778Ssam z.lb = !lbf ? r : lb; 42311778Ssam z.ub = !ubf ? t : ub; 42411778Ssam if(ub/lb<100) { 42511778Ssam if(!lbf) { 42611778Ssam if(lb >= 5*z.lb) 42711778Ssam z.lb *= 5; 42811778Ssam else if(lb >= 2*z.lb) 42911778Ssam z.lb *= 2; 43011778Ssam } 43111778Ssam if(!ubf) { 43211778Ssam if(ub*5 <= z.ub) 43311778Ssam z.ub /= 5; 43411778Ssam else if(ub*2 <= z.ub) 43511778Ssam z.ub /= 2; 43611778Ssam } 43711778Ssam } 43811778Ssam z.mult = s; 43911778Ssam z.quant = r; 44011778Ssam return(z); 44111778Ssam } 44211778Ssam 44311778Ssam struct z 44411778Ssam setlinlim(lbf,ubf,xlb,xub) 44511778Ssam int lbf,ubf; 44611778Ssam float xlb,xub; 44711778Ssam { 44811778Ssam struct z z; 44911778Ssam float r,s,delta; 45011778Ssam float ub,lb; 45111778Ssam 45211778Ssam loop: 45311778Ssam ub = xub; 45411778Ssam lb = xlb; 45511778Ssam delta = ub - lb; 45611778Ssam /*scale up by s, a power of 10, so range (delta) exceeds 1*/ 45711778Ssam /*find power of 10 quantum, r, such that delta/10<=r<delta*/ 45811778Ssam r = s = 1; 45911778Ssam while(delta*s < 10) 46011778Ssam s *= 10; 46111778Ssam delta *= s; 46211778Ssam while(10*r < delta) 46311778Ssam r *= 10; 46411778Ssam lb *= s; 46511778Ssam ub *= s; 46611778Ssam /*set r=(1,2,5)*10**n so that 3-5 quanta cover range*/ 46711778Ssam if(r>=delta/2) 46811778Ssam r /= 2; 46911778Ssam else if(r<delta/5) 47011778Ssam r *= 2; 47111778Ssam z.ub = ubf? ub: modceil(ub,r); 47211778Ssam z.lb = lbf? lb: modfloor(lb,r); 47311778Ssam if(!lbf && z.lb<=r && z.lb>0) { 47411778Ssam xlb = 0; 47511778Ssam goto loop; 47611778Ssam } 47711778Ssam else if(!ubf && z.ub>=-r && z.ub<0) { 47811778Ssam xub = 0; 47911778Ssam goto loop; 48011778Ssam } 48111778Ssam z.quant = r; 48211778Ssam z.mult = s; 48311778Ssam return(z); 48411778Ssam } 48511778Ssam 48611778Ssam scale(p,v) 48711778Ssam register struct xy *p; 48811778Ssam struct val *v; 48911778Ssam { 49011778Ssam float edge; 49111778Ssam 49211778Ssam getlim(p,v); 49311778Ssam setlim(p); 49411778Ssam edge = top-bot; 49511778Ssam p->xa = p->xsize*edge/((*p->xf)(p->xub) - (*p->xf)(p->xlb)); 49611778Ssam p->xbot = bot + edge*p->xoff; 49711778Ssam p->xtop = p->xbot + (top-bot)*p->xsize; 49811778Ssam p->xb = p->xbot - (*p->xf)(p->xlb)*p->xa + .5; 49911778Ssam } 50011778Ssam 50111778Ssam axes() 50211778Ssam { 50311778Ssam register i; 50411778Ssam int mark[50]; 50511778Ssam int xn, yn; 50611778Ssam if(gridf==0) 50711778Ssam return; 50811778Ssam 50911778Ssam line(xd.xbot,yd.xbot,xd.xtop,yd.xbot); 51011778Ssam cont(xd.xtop,yd.xtop); 51111778Ssam cont(xd.xbot,yd.xtop); 51211778Ssam cont(xd.xbot,yd.xbot); 51311778Ssam 51411778Ssam xn = setmark(mark,&xd); 51511778Ssam for(i=0; i<xn; i++) { 51611778Ssam if(gridf==2) 51711778Ssam line(mark[i],yd.xbot,mark[i],yd.xtop); 51811778Ssam if(gridf==1) { 51911778Ssam line(mark[i],yd.xbot,mark[i],yd.xbot+tick); 52011778Ssam line(mark[i],yd.xtop-tick,mark[i],yd.xtop); 52111778Ssam } 52211778Ssam } 52311778Ssam yn = setmark(mark,&yd); 52411778Ssam for(i=0; i<yn; i++) { 52511778Ssam if(gridf==2) 52611778Ssam line(xd.xbot,mark[i],xd.xtop,mark[i]); 52711778Ssam if(gridf==1) { 52811778Ssam line(xd.xbot,mark[i],xd.xbot+tick,mark[i]); 52911778Ssam line(xd.xtop-tick,mark[i],xd.xtop,mark[i]); 53011778Ssam } 53111778Ssam } 53211778Ssam } 53311778Ssam 53411778Ssam setmark(xmark,p) 53511778Ssam int *xmark; 53611778Ssam register struct xy *p; 53711778Ssam { 53811778Ssam int xn = 0; 53911778Ssam float x,xl,xu; 54011778Ssam float q; 54111778Ssam if(p->xf==log10&&!p->xqf) { 54211778Ssam for(x=p->xquant; x<p->xub; x*=10) { 54311778Ssam submark(xmark,&xn,x,p); 54411778Ssam if(p->xub/p->xlb<=100) { 54511778Ssam submark(xmark,&xn,2*x,p); 54611778Ssam submark(xmark,&xn,5*x,p); 54711778Ssam } 54811778Ssam } 54911778Ssam } else { 55011778Ssam xn = 0; 55111778Ssam q = p->xquant; 55211778Ssam if(q>0) { 55311778Ssam xl = modceil(p->xlb+q/6,q); 55411778Ssam xu = modfloor(p->xub-q/6,q)+q/2; 55511778Ssam } else { 55611778Ssam xl = modceil(p->xub-q/6,q); 55711778Ssam xu = modfloor(p->xlb+q/6,q)-q/2; 55811778Ssam } 55911778Ssam for(x=xl; x<=xu; x+=fabs(p->xquant)) 56011778Ssam xmark[xn++] = (*p->xf)(x)*p->xa + p->xb; 56111778Ssam } 56211778Ssam return(xn); 56311778Ssam } 56411778Ssam submark(xmark,pxn,x,p) 56511778Ssam int *xmark; 56611778Ssam int *pxn; 56711778Ssam float x; 56811778Ssam struct xy *p; 56911778Ssam { 57011778Ssam if(1.001*p->xlb < x && .999*p->xub > x) 57111778Ssam xmark[(*pxn)++] = log10(x)*p->xa + p->xb; 57211778Ssam } 57311778Ssam 57411778Ssam plot() 57511778Ssam { 57611778Ssam int ix,iy; 57711778Ssam int i; 57811778Ssam int conn; 57911778Ssam 58011778Ssam conn = 0; 58111778Ssam if(mode!=0) 58211778Ssam linemod(modes[mode]); 58311778Ssam for(i=0; i<n; i++) { 58411778Ssam if(!conv(xx[i].xv,&xd,&ix) || 58511778Ssam !conv(xx[i].yv,&yd,&iy)) { 58611778Ssam conn = 0; 58711778Ssam continue; 58811778Ssam } 58911778Ssam if(mode!=0) { 59011778Ssam if(conn != 0) 59111778Ssam cont(ix,iy); 59211778Ssam else 59311778Ssam move(ix,iy); 59411778Ssam conn = 1; 59511778Ssam } 59611778Ssam conn &= symbol(ix,iy,xx[i].lblptr); 59711778Ssam } 59811778Ssam linemod(modes[1]); 59911778Ssam } 60011778Ssam 60111778Ssam conv(xv,p,ip) 60211778Ssam float xv; 60311778Ssam register struct xy *p; 60411778Ssam int *ip; 60511778Ssam { 60611778Ssam long ix; 60711778Ssam ix = p->xa*(*p->xf)(xv*p->xmult) + p->xb; 60811778Ssam if(ix<p->xbot || ix>p->xtop) 60911778Ssam return(0); 61011778Ssam *ip = ix; 61111778Ssam return(1); 61211778Ssam } 61311778Ssam 61411778Ssam getfloat(p) 61511778Ssam float *p; 61611778Ssam { 61711778Ssam register i; 61811778Ssam 61911778Ssam i = scanf("%f",p); 62011778Ssam return(i==1); 62111778Ssam } 62211778Ssam 62311778Ssam getstring() 62411778Ssam { 62511778Ssam register i; 62611778Ssam char junk[20]; 62711778Ssam i = scanf("%1s",labbuf); 62811778Ssam if(i==-1) 62911778Ssam return(-1); 63011778Ssam switch(*labbuf) { 63111778Ssam default: 63211778Ssam if(!isdigit(*labbuf)) { 63311778Ssam ungetc(*labbuf,stdin); 63411778Ssam i = scanf("%s",labbuf); 63511778Ssam break; 63611778Ssam } 63711778Ssam case '.': 63811778Ssam case '+': 63911778Ssam case '-': 64011778Ssam ungetc(*labbuf,stdin); 64111778Ssam return(0); 64211778Ssam case '"': 64311778Ssam i = scanf("%[^\"\n]",labbuf); 64411778Ssam scanf("%[\"]",junk); 64511778Ssam break; 64611778Ssam } 64711778Ssam if(i==-1) 64811778Ssam return(-1); 64911778Ssam return(strlen(labbuf)); 65011778Ssam } 65111778Ssam 65211778Ssam 65311778Ssam symbol(ix,iy,k) 65411778Ssam { 65511778Ssam 65611778Ssam if(symbf==0&&k<0) { 65711778Ssam if(mode==0) 65811778Ssam point(ix,iy); 65911778Ssam return(1); 66011778Ssam } 66111778Ssam else { 66211778Ssam move(ix,iy); 66311778Ssam label(k>=0?labs+k:plotsymb); 66411778Ssam move(ix,iy); 66511778Ssam return(!brkf|k<0); 66611778Ssam } 66711778Ssam } 66811778Ssam 66911778Ssam title() 67011778Ssam { 67111778Ssam move(xd.xbot,yd.xbot-60); 67211778Ssam if (titlebuf[0]) { 67311778Ssam label(titlebuf); 67411778Ssam label(" "); 67511778Ssam } 67611778Ssam if(erasf&&gridf) { 67711778Ssam axlab('x',&xd); 67811778Ssam label(" "); 67911778Ssam axlab('y',&yd); 68011778Ssam } 68111778Ssam } 68211778Ssam 68311778Ssam axlab(c,p) 68411778Ssam char c; 68511778Ssam struct xy *p; 68611778Ssam { 68711778Ssam char buf[50]; 68811778Ssam sprintf(buf,"%g -%s%c- %g", p->xlb/p->xmult, 68911778Ssam p->xf==log10?"log ":"", c, p->xub/p->xmult); 69011778Ssam label(buf); 69111778Ssam } 69211778Ssam 69311778Ssam badarg() 69411778Ssam { 69511778Ssam fprintf(stderr,"graph: error in arguments\n"); 69611778Ssam exit(1); 69711778Ssam } 698