int xlbf
; /*flag:explicit lower bound*/
int xubf
; /*flag:explicit upper bound*/
int xqf
; /*flag:explicit quantum*/
double (*xf
)(); /*transform function, e.g. log*/
float xa
,xb
; /*scaling coefficients*/
float xlb
,xub
; /*lower and upper bound*/
float xquant
; /*quantum*/
float xoff
; /*screen offset fraction*/
float xsize
; /*screen fraction*/
int xbot
,xtop
; /*screen coords of border*/
float xmult
; /*scaling constant*/
xd
.xsize
= yd
.xsize
= 1.;
xx
= (struct val
*)malloc((unsigned)sizeof(struct val
));
scale(&xd
,(struct val
*)&xx
->xv
);
scale(&yd
,(struct val
*)&xx
->yv
);
again
: switch(argv
[0][0]) {
case 'l': /* label for plot */
case 'd': /*disconnected,obsolete option*/
if(!numb(&temp
,&argc
,&argv
))
if(temp
>=sizeof(modes
)/sizeof(*modes
))
case 'a': /*automatic abscissas*/
if(!numb(&dx
,&argc
,&argv
))
if(numb(&absbot
,&argc
,&argv
))
case 's': /*save screen, overlay plot*/
case 'g': /*grid style 0 none, 1 ticks, 2 full*/
if(!numb(&temp
,&argc
,&argv
))
temp
= argv
[0][1]-'0'; /*for caompatibility*/
case 'c': /*character(s) for plotting*/
limread(&xd
,&argc
,&argv
);
limread(&yd
,&argc
,&argv
);
case 'h': /*set height of plot */
if(!numb(&yd
.xsize
, &argc
,&argv
))
case 'w': /*set width of plot */
if(!numb(&xd
.xsize
, &argc
, &argv
))
case 'r': /* set offset to right */
if(!numb(&xd
.xoff
, &argc
, &argv
))
case 'u': /*set offset up the screen*/
if(!numb(&yd
.xoff
,&argc
,&argv
))
if(*argcp
>1 && (*argvp
)[1][0]=='l') {
if(!numb(&p
->xlb
,argcp
,argvp
))
if(!numb(&p
->xub
,argcp
,argvp
))
if(!numb(&p
->xquant
,argcp
,argvp
))
while((c
=(*argvp
)[1][0]) == '+')
if(!(isdigit(c
) || c
=='-'&&(*argvp
)[1][1]<'A' || c
=='.'))
temp
= (struct val
*)realloc((char*)xx
,
(unsigned)(n
+1)*sizeof(struct val
));
xx
[n
].xv
= n
*dx
+ absbot
;
xx
[n
].lblptr
= copystring(t
);
f
= xx
[i
].xv
; xx
[i
].xv
= xx
[i
].yv
; xx
[i
].yv
= f
;
temp
= realloc(labs
,(unsigned)(labsiz
+1+k
));
labs
[labsiz
++] = labbuf
[i
];
if(!p
->xlbf
&& p
->xlb
>v
[i
].xv
)
if(!p
->xubf
&& p
->xub
<v
[i
].xv
)
} setloglim(), setlinlim();
if(p
->xf
==log10
&& lb
>0 && ub
>lb
) {
z
= setloglim(lbf
,ubf
,lb
,ub
);
z
= setlinlim(lbf
,ubf
,lb
,ub
);
p
->xquant
= sign
*z
.quant
;
for(s
=1; lb
*s
<1; s
*=10) ;
for(r
=1; 10*r
<=lb
; r
*=10) ;
setlinlim(lbf
,ubf
,xlb
,xub
)
/*scale up by s, a power of 10, so range (delta) exceeds 1*/
/*find power of 10 quantum, r, such that delta/10<=r<delta*/
/*set r=(1,2,5)*10**n so that 3-5 quanta cover range*/
z
.ub
= ubf
? ub
: modceil(ub
,r
);
z
.lb
= lbf
? lb
: modfloor(lb
,r
);
if(!lbf
&& z
.lb
<=r
&& z
.lb
>0) {
else if(!ubf
&& z
.ub
>=-r
&& z
.ub
<0) {
p
->xa
= p
->xsize
*edge
/((*p
->xf
)(p
->xub
) - (*p
->xf
)(p
->xlb
));
p
->xbot
= bot
+ edge
*p
->xoff
;
p
->xtop
= p
->xbot
+ (top
-bot
)*p
->xsize
;
p
->xb
= p
->xbot
- (*p
->xf
)(p
->xlb
)*p
->xa
+ .5;
line(xd
.xbot
,yd
.xbot
,xd
.xtop
,yd
.xbot
);
line(mark
[i
],yd
.xbot
,mark
[i
],yd
.xtop
);
line(mark
[i
],yd
.xbot
,mark
[i
],yd
.xbot
+tick
);
line(mark
[i
],yd
.xtop
-tick
,mark
[i
],yd
.xtop
);
line(xd
.xbot
,mark
[i
],xd
.xtop
,mark
[i
]);
line(xd
.xbot
,mark
[i
],xd
.xbot
+tick
,mark
[i
]);
line(xd
.xtop
-tick
,mark
[i
],xd
.xtop
,mark
[i
]);
if(p
->xf
==log10
&&!p
->xqf
) {
for(x
=p
->xquant
; x
<p
->xub
; x
*=10) {
submark(xmark
,&xn
,2*x
,p
);
submark(xmark
,&xn
,5*x
,p
);
xl
= modceil(p
->xlb
+q
/6,q
);
xu
= modfloor(p
->xub
-q
/6,q
)+q
/2;
xl
= modceil(p
->xub
-q
/6,q
);
xu
= modfloor(p
->xlb
+q
/6,q
)-q
/2;
for(x
=xl
; x
<=xu
; x
+=fabs(p
->xquant
))
xmark
[xn
++] = (*p
->xf
)(x
)*p
->xa
+ p
->xb
;
if(1.001*p
->xlb
< x
&& .999*p
->xub
> x
)
xmark
[(*pxn
)++] = log10(x
)*p
->xa
+ p
->xb
;
if(!conv(xx
[i
].xv
,&xd
,&ix
) ||
!conv(xx
[i
].yv
,&yd
,&iy
)) {
conn
&= symbol(ix
,iy
,xx
[i
].lblptr
);
ix
= p
->xa
*(*p
->xf
)(xv
*p
->xmult
) + p
->xb
;
if(ix
<p
->xbot
|| ix
>p
->xtop
)
i
= scanf("%[^\"\n]",labbuf
);
label(k
>=0?labs
+k
:plotsymb
);
move(xd
.xbot
,yd
.xbot
-60);
sprintf(buf
,"%g -%s%c- %g", p
->xlb
/p
->xmult
,
p
->xf
==log10
?"log ":"", c
, p
->xub
/p
->xmult
);
fprintf(stderr
,"graph: error in arguments\n");