1*23974Sjaap #ifndef lint
2*23974Sjaap static char sccsid[] = "@(#)ticks.c	1.1 (CWI) 85/07/19";
3*23974Sjaap #endif lint
4*23974Sjaap #include <stdio.h>
5*23974Sjaap #include "grap.h"
6*23974Sjaap #include "y.tab.h"
7*23974Sjaap 
8*23974Sjaap #define	MAXTICK	200
9*23974Sjaap int	ntick	= 0;
10*23974Sjaap double	tickval[MAXTICK];	/* tick values (one axis at a time */
11*23974Sjaap char	*tickstr[MAXTICK];	/* and labels */
12*23974Sjaap 
13*23974Sjaap int	tside	= 0;
14*23974Sjaap int	tlist	= 0;		/* 1 => explicit values given */
15*23974Sjaap int	toffside = 0;		/* no ticks on these sides */
16*23974Sjaap int	tick_dir = OUT;
17*23974Sjaap double	ticklen	= TICKLEN;	/* default tick length */
18*23974Sjaap int	autoticks = LEFT|BOT;
19*23974Sjaap 
savetick(f,s)20*23974Sjaap savetick(f, s)	/* remember tick location and label */
21*23974Sjaap 	double f;
22*23974Sjaap 	char *s;
23*23974Sjaap {
24*23974Sjaap 	if (ntick >= MAXTICK)
25*23974Sjaap 		fatal("too many ticks (%d)", MAXTICK);
26*23974Sjaap 	tickval[ntick] = f;
27*23974Sjaap 	tickstr[ntick] = s;
28*23974Sjaap 	ntick++;
29*23974Sjaap }
30*23974Sjaap 
tickside(n)31*23974Sjaap tickside(n)	/* remember which side these ticks go on */
32*23974Sjaap 	int n;
33*23974Sjaap {
34*23974Sjaap 	tside |= n;
35*23974Sjaap }
36*23974Sjaap 
tickoff(side)37*23974Sjaap tickoff(side)	/* remember explicit sides */
38*23974Sjaap 	int side;
39*23974Sjaap {
40*23974Sjaap 	toffside |= side;
41*23974Sjaap }
42*23974Sjaap 
setlist()43*23974Sjaap setlist()	/* remember that there was an explicit list */
44*23974Sjaap {
45*23974Sjaap 	tlist = 1;
46*23974Sjaap }
47*23974Sjaap 
tickdir(dir,val,explicit)48*23974Sjaap tickdir(dir, val, explicit)	/* remember in/out [expr] */
49*23974Sjaap 	int dir, explicit;
50*23974Sjaap 	double val;
51*23974Sjaap {
52*23974Sjaap 	tick_dir = dir;
53*23974Sjaap 	if (explicit)
54*23974Sjaap 		ticklen = val;
55*23974Sjaap }
56*23974Sjaap 
ticks()57*23974Sjaap ticks()		/* set autoticks after ticks statement */
58*23974Sjaap {
59*23974Sjaap 	/* was there an explicit "ticks [side] off"? */
60*23974Sjaap 	if (toffside)
61*23974Sjaap 		autoticks &= ~toffside;
62*23974Sjaap 	/* was there an explicit list? */
63*23974Sjaap 	if (tlist) {
64*23974Sjaap 		if (tside & (BOT|TOP))
65*23974Sjaap 			autoticks &= ~(BOT|TOP);
66*23974Sjaap 		if (tside & (LEFT|RIGHT))
67*23974Sjaap 			autoticks &= ~(LEFT|RIGHT);
68*23974Sjaap 	}
69*23974Sjaap 	/* was there a side without a list? */
70*23974Sjaap 	if (tside && !tlist) {
71*23974Sjaap 		if (tside & (BOT|TOP))
72*23974Sjaap 			autoticks = (autoticks & ~(BOT|TOP)) | (tside & (BOT|TOP));
73*23974Sjaap 		if (tside & (LEFT|RIGHT))
74*23974Sjaap 			autoticks = (autoticks & ~(LEFT|RIGHT)) | (tside & (LEFT|RIGHT));
75*23974Sjaap 	}
76*23974Sjaap 	tlist = tside = toffside = 0;
77*23974Sjaap }
78*23974Sjaap 
modfloor(f,t)79*23974Sjaap double modfloor(f, t)
80*23974Sjaap 	double f, t;
81*23974Sjaap {
82*23974Sjaap 	t = fabs(t);
83*23974Sjaap 	return floor(f/t) * t;
84*23974Sjaap }
85*23974Sjaap 
modceil(f,t)86*23974Sjaap double modceil(f, t)
87*23974Sjaap 	double f, t;
88*23974Sjaap {
89*23974Sjaap 	t = fabs(t);
90*23974Sjaap 	return ceil(f/t) * t;
91*23974Sjaap }
92*23974Sjaap 
93*23974Sjaap double	xtmin, xtmax;	/* range of ticks */
94*23974Sjaap double	ytmin, ytmax;
95*23974Sjaap double	xquant, xmult;	/* quantization & scale for auto x ticks */
96*23974Sjaap double	yquant, ymult;
97*23974Sjaap double	lograt = 5;
98*23974Sjaap 
do_autoticks(p)99*23974Sjaap do_autoticks(p)	/* make set of ticks for default coord only */
100*23974Sjaap 	Obj *p;
101*23974Sjaap {
102*23974Sjaap 	double x, xl, xu, q;
103*23974Sjaap 
104*23974Sjaap 	if (p == NULL)
105*23974Sjaap 		return;
106*23974Sjaap 	fprintf(tfd, "Autoticks:\t# x %g..%g, y %g..%g",
107*23974Sjaap 		p->pt.x, p->pt1.x, p->pt.y, p->pt1.y);
108*23974Sjaap 	fprintf(tfd, ";   xt %g,%g, yt %g,%g, xq,xm = %g,%g, yq,ym = %g,%g\n",
109*23974Sjaap 		xtmin, xtmax, ytmin, ytmax, xquant, xmult, yquant, ymult);
110*23974Sjaap 	if ((autoticks & (BOT|TOP)) && p->pt1.x > p->pt.x) {	/* make x ticks */
111*23974Sjaap 		q = xquant;
112*23974Sjaap 		xl = p->pt.x;
113*23974Sjaap 		xu = p->pt1.x;
114*23974Sjaap 		if ((p->log & XFLAG) && xu/xl >= lograt) {
115*23974Sjaap 			for (x = q; x < xu; x *= 10) {
116*23974Sjaap 				logtick(x, xl, xu);
117*23974Sjaap 				if (xu/xl <= 100) {
118*23974Sjaap 					logtick(2*x, xl, xu);
119*23974Sjaap 					logtick(5*x, xl, xu);
120*23974Sjaap 				}
121*23974Sjaap 			}
122*23974Sjaap 		} else {
123*23974Sjaap 			xl = modceil(xtmin - q/100, q);
124*23974Sjaap 			xu = modfloor(xtmax + q/100, q) + q/2;
125*23974Sjaap 			for (x = xl; x <= xu; x += q)
126*23974Sjaap 				savetick(x, tostring("%g"));
127*23974Sjaap 		}
128*23974Sjaap 		tside = autoticks & (BOT|TOP);
129*23974Sjaap 		ticklist(p);
130*23974Sjaap 	}
131*23974Sjaap 	if ((autoticks & (LEFT|RIGHT)) && p->pt1.y > p->pt.y) {	/* make y ticks */
132*23974Sjaap 		q = yquant;
133*23974Sjaap 		xl = p->pt.y;
134*23974Sjaap 		xu = p->pt1.y;
135*23974Sjaap 		if ((p->log & YFLAG) && xu/xl >= lograt) {
136*23974Sjaap 			for (x = q; x < xu; x *= 10) {
137*23974Sjaap 				logtick(x, xl, xu);
138*23974Sjaap 				if (xu/xl <= 100) {
139*23974Sjaap 					logtick(2*x, xl, xu);
140*23974Sjaap 					logtick(5*x, xl, xu);
141*23974Sjaap 				}
142*23974Sjaap 			}
143*23974Sjaap 		} else {
144*23974Sjaap 			xl = modceil(ytmin - q/100, q);
145*23974Sjaap 			xu = modfloor(ytmax + q/100, q) + q/2;
146*23974Sjaap 			for (x = xl; x <= xu; x += q)
147*23974Sjaap 				savetick(x, tostring("%g"));
148*23974Sjaap 		}
149*23974Sjaap 		tside = autoticks & (LEFT|RIGHT);
150*23974Sjaap 		ticklist(p);
151*23974Sjaap 	}
152*23974Sjaap }
153*23974Sjaap 
logtick(v,lb,ub)154*23974Sjaap logtick(v, lb, ub)
155*23974Sjaap 	double v, lb, ub;
156*23974Sjaap {
157*23974Sjaap 	float slop = 1.0;	/* was 1.001 */
158*23974Sjaap 
159*23974Sjaap 	if (slop * lb <= v && ub >= slop * v)
160*23974Sjaap 		savetick(v, tostring("%g"));
161*23974Sjaap }
162*23974Sjaap 
setauto()163*23974Sjaap Obj *setauto()	/* compute new min,max, and quant & mult */
164*23974Sjaap {
165*23974Sjaap 	Obj *p, *q;
166*23974Sjaap 
167*23974Sjaap 	if ((q = lookup("lograt",0)) != NULL)
168*23974Sjaap 		lograt = q->fval;
169*23974Sjaap 	for (p = objlist; p; p = p->next)
170*23974Sjaap 		if (p->type == NAME && strcmp(p->name,dflt_coord) == 0)
171*23974Sjaap 			break;
172*23974Sjaap 	if (p) {
173*23974Sjaap 		if ((p->log & XFLAG) && p->pt1.x/p->pt.x >= lograt)
174*23974Sjaap 			autolog(p, 'x');
175*23974Sjaap 		else
176*23974Sjaap 			autoside(p, 'x');
177*23974Sjaap 		if ((p->log & YFLAG) && p->pt1.y/p->pt.y >= lograt)
178*23974Sjaap 			autolog(p, 'y');
179*23974Sjaap 		else
180*23974Sjaap 			autoside(p, 'y');
181*23974Sjaap 	}
182*23974Sjaap 	return p;
183*23974Sjaap }
184*23974Sjaap 
autoside(p,side)185*23974Sjaap autoside(p, side)
186*23974Sjaap 	Obj *p;
187*23974Sjaap 	int side;
188*23974Sjaap {
189*23974Sjaap 	double r, s, d, ub, lb;
190*23974Sjaap 
191*23974Sjaap 	if (side == 'x') {
192*23974Sjaap 		xtmin = lb = p->pt.x;
193*23974Sjaap 		xtmax = ub = p->pt1.x;
194*23974Sjaap 	} else {
195*23974Sjaap 		ytmin = lb = p->pt.y;
196*23974Sjaap 		ytmax = ub = p->pt1.y;
197*23974Sjaap 	}
198*23974Sjaap 	if (ub <= lb)
199*23974Sjaap 		return 0;	/* cop out on little ranges */
200*23974Sjaap 	d = ub - lb;
201*23974Sjaap 	r = s = 1;
202*23974Sjaap 	while (d * s < 10)
203*23974Sjaap 		s *= 10;
204*23974Sjaap 	d *= s;
205*23974Sjaap 	lb *= s;
206*23974Sjaap 	ub *= s;
207*23974Sjaap 	while (10 * r < d)
208*23974Sjaap 		r *= 10;
209*23974Sjaap 	if (r > d/3)
210*23974Sjaap 		r /= 2;
211*23974Sjaap 	else if (r <= d/6)
212*23974Sjaap 		r *= 2;
213*23974Sjaap 	if (side == 'x') {
214*23974Sjaap 		xquant = r / s;
215*23974Sjaap 	} else {
216*23974Sjaap 		yquant = r / s;
217*23974Sjaap 	}
218*23974Sjaap }
219*23974Sjaap 
autolog(p,side)220*23974Sjaap autolog(p, side)
221*23974Sjaap 	Obj *p;
222*23974Sjaap 	int side;
223*23974Sjaap {
224*23974Sjaap 	double r, s, t, d, ub, lb;
225*23974Sjaap 	int flg;
226*23974Sjaap 
227*23974Sjaap 	if (side == 'x') {
228*23974Sjaap 		xtmin = lb = p->pt.x;
229*23974Sjaap 		xtmax = ub = p->pt1.x;
230*23974Sjaap 		flg = p->coord & XFLAG;
231*23974Sjaap 	} else {
232*23974Sjaap 		ytmin = lb = p->pt.y;
233*23974Sjaap 		ytmax = ub = p->pt1.y;
234*23974Sjaap 		flg = p->coord & YFLAG;
235*23974Sjaap 	}
236*23974Sjaap 	for (s = 1; lb * s < 1; s *= 10)
237*23974Sjaap 		;
238*23974Sjaap 	lb *= s;
239*23974Sjaap 	ub *= s;
240*23974Sjaap 	for (r = 1; 10 * r < lb; r *= 10)
241*23974Sjaap 		;
242*23974Sjaap 	for (t = 1; t < ub; t *= 10)
243*23974Sjaap 		;
244*23974Sjaap 	if (side == 'x')
245*23974Sjaap 		xquant = r / s;
246*23974Sjaap 	else
247*23974Sjaap 		yquant = r / s;
248*23974Sjaap 	if (flg)
249*23974Sjaap 		return;
250*23974Sjaap 	if (ub / lb < 100) {
251*23974Sjaap 		if (lb >= 5 * r)
252*23974Sjaap 			r *= 5;
253*23974Sjaap 		else if (lb >= 2 * r)
254*23974Sjaap 			r *= 2;
255*23974Sjaap 		if (ub * 5 <= t)
256*23974Sjaap 			t /= 5;
257*23974Sjaap 		else if (ub * 2 <= t)
258*23974Sjaap 			t /= 2;
259*23974Sjaap 		if (side == 'x') {
260*23974Sjaap 			xtmin = r / s;
261*23974Sjaap 			xtmax = t / s;
262*23974Sjaap 		} else {
263*23974Sjaap 			ytmin = r / s;
264*23974Sjaap 			ytmax = t / s;
265*23974Sjaap 		}
266*23974Sjaap 	}
267*23974Sjaap }
268*23974Sjaap 
iterator(from,to,op,by,fmt)269*23974Sjaap iterator(from, to, op, by, fmt)	/* create an iterator */
270*23974Sjaap 	double from, to, by;
271*23974Sjaap 	int op;
272*23974Sjaap 	char *fmt;
273*23974Sjaap {
274*23974Sjaap 	double x;
275*23974Sjaap 
276*23974Sjaap 	/* should validate limits, etc. */
277*23974Sjaap 	/* punt for now */
278*23974Sjaap 
279*23974Sjaap 	if (fmt == NULL)
280*23974Sjaap 		fmt = tostring("%g");
281*23974Sjaap 	dprintf("iterate from %g to %g by %g, op = %c, fmt=%s\n",
282*23974Sjaap 		from, to, by, op, fmt);
283*23974Sjaap 	switch (op) {
284*23974Sjaap 	case '+':
285*23974Sjaap 	case ' ':
286*23974Sjaap 		for (x = from; x <= SLOP * to; x += by)
287*23974Sjaap 			savetick(x, tostring(fmt));
288*23974Sjaap 		break;
289*23974Sjaap 	case '-':
290*23974Sjaap 		for (x = from; x >= to; x -= by)
291*23974Sjaap 			savetick(x, tostring(fmt));
292*23974Sjaap 		break;
293*23974Sjaap 	case '*':
294*23974Sjaap 		for (x = from; x <= SLOP * to; x *= by)
295*23974Sjaap 			savetick(x, tostring(fmt));
296*23974Sjaap 		break;
297*23974Sjaap 	case '/':
298*23974Sjaap 		for (x = from; x >= to; x /= by)
299*23974Sjaap 			savetick(x, tostring(fmt));
300*23974Sjaap 		break;
301*23974Sjaap 	}
302*23974Sjaap 	if (fmt)
303*23974Sjaap 		free(fmt);
304*23974Sjaap }
305*23974Sjaap 
ticklist(p)306*23974Sjaap ticklist(p)	/* fire out the accumulated ticks */
307*23974Sjaap 	Obj *p;
308*23974Sjaap {
309*23974Sjaap 	if (p == NULL)
310*23974Sjaap 		return;
311*23974Sjaap 	fprintf(tfd, "Ticks_%s:\n\tticklen = %g\n", p->name, ticklen);
312*23974Sjaap 	print_ticks(TICKS, p, "ticklen", "");
313*23974Sjaap }
314*23974Sjaap 
print_ticks(type,p,lenstr,descstr)315*23974Sjaap print_ticks(type, p, lenstr, descstr)
316*23974Sjaap 	int type;
317*23974Sjaap 	Obj *p;
318*23974Sjaap 	char *lenstr, *descstr;
319*23974Sjaap {
320*23974Sjaap 	int i, logflag;
321*23974Sjaap 	char buf[100];
322*23974Sjaap 	double tv;
323*23974Sjaap 
324*23974Sjaap 	for (i = 0; i < ntick; i++)	/* any ticks given explicitly? */
325*23974Sjaap 		if (tickstr[i] != NULL)
326*23974Sjaap 			break;
327*23974Sjaap 	if (i >= ntick && type == TICKS)	/* no, so use values */
328*23974Sjaap 		for (i = 0; i < ntick; i++) {
329*23974Sjaap 			sprintf(buf, "%g", tickval[i]);
330*23974Sjaap 			tickstr[i] = tostring(buf);
331*23974Sjaap 		}
332*23974Sjaap 	else
333*23974Sjaap 		for (i = 0; i < ntick; i++) {
334*23974Sjaap 			if (tickstr[i] != NULL) {
335*23974Sjaap 				sprintf(buf, tickstr[i], tickval[i]);
336*23974Sjaap 				free(tickstr[i]);
337*23974Sjaap 				tickstr[i] = tostring(buf);
338*23974Sjaap 			}
339*23974Sjaap 		}
340*23974Sjaap 	logflag = sidelog(p->log, tside);
341*23974Sjaap 	for (i = 0; i < ntick; i++) {
342*23974Sjaap 		tv = tickval[i];
343*23974Sjaap 		halfrange(p, tside, tv);
344*23974Sjaap 		if (logflag) {
345*23974Sjaap 			if (tv <= 0.0)
346*23974Sjaap 				fatal("can't take log of tick value %g", tv);
347*23974Sjaap 			logit(tv);
348*23974Sjaap 		}
349*23974Sjaap 		if (tside & BOT)
350*23974Sjaap 			maketick(p->name, BOT, tv, tickstr[i], lenstr, descstr);
351*23974Sjaap 		if (tside & TOP)
352*23974Sjaap 			maketick(p->name, TOP, tv, tickstr[i], lenstr, descstr);
353*23974Sjaap 		if (tside & LEFT)
354*23974Sjaap 			maketick(p->name, LEFT, tv, tickstr[i], lenstr, descstr);
355*23974Sjaap 		if (tside & RIGHT)
356*23974Sjaap 			maketick(p->name, RIGHT, tv, tickstr[i], lenstr, descstr);
357*23974Sjaap 		if (tickstr[i]) {
358*23974Sjaap 			free(tickstr[i]);
359*23974Sjaap 			tickstr[i] = NULL;
360*23974Sjaap 		}
361*23974Sjaap 	}
362*23974Sjaap 	ntick = 0;
363*23974Sjaap }
364*23974Sjaap 
maketick(name,side,val,lab,lenstr,descstr)365*23974Sjaap maketick(name, side, val, lab, lenstr, descstr)
366*23974Sjaap 	char *name;
367*23974Sjaap 	int side;
368*23974Sjaap 	double val;
369*23974Sjaap 	char *lab, *lenstr, *descstr;
370*23974Sjaap {
371*23974Sjaap 	char *sidestr, *td;
372*23974Sjaap 
373*23974Sjaap 	fprintf(tfd, "\tline %s ", descstr);
374*23974Sjaap 	switch (side) {
375*23974Sjaap 	case BOT:
376*23974Sjaap 	case 0:
377*23974Sjaap 		td = tick_dir == IN ? "up" : "down";
378*23974Sjaap 		fprintf(tfd, "%s %s from (x_%s(%g),0)", td, lenstr, name, val);
379*23974Sjaap 		break;
380*23974Sjaap 	case TOP:
381*23974Sjaap 		td = tick_dir == IN ? "down" : "up";
382*23974Sjaap 		fprintf(tfd, "%s %s from (x_%s(%g),frameht)", td, lenstr, name, val);
383*23974Sjaap 		break;
384*23974Sjaap 	case LEFT:
385*23974Sjaap 		td = tick_dir == IN ? "right" : "left";
386*23974Sjaap 		fprintf(tfd, "%s %s from (0,y_%s(%g))", td, lenstr, name, val);
387*23974Sjaap 		break;
388*23974Sjaap 	case RIGHT:
389*23974Sjaap 		td = tick_dir == IN ? "left" : "right";
390*23974Sjaap 		fprintf(tfd, "%s %s from (framewid,y_%s(%g))", td, lenstr, name, val);
391*23974Sjaap 		break;
392*23974Sjaap 	}
393*23974Sjaap 	fprintf(tfd, "\n");
394*23974Sjaap 	sidestr = tick_dir == IN ? "start" : "end";
395*23974Sjaap 	if (lab != NULL) {
396*23974Sjaap 		/* BUG: should fix size of lab here */
397*23974Sjaap 		switch (side) {
398*23974Sjaap 		case BOT: case 0:
399*23974Sjaap 			/* can drop "box invis" with new pic */
400*23974Sjaap 			fprintf(tfd, "\tbox invis \"%s\" ht .25 wid 0 with .n at last line.%s",
401*23974Sjaap 				lab, sidestr);
402*23974Sjaap 			break;
403*23974Sjaap 		case TOP:
404*23974Sjaap 			fprintf(tfd, "\tbox invis \"%s\" ht .2 wid 0 with .s at last line.%s",
405*23974Sjaap 				lab, sidestr);
406*23974Sjaap 			break;
407*23974Sjaap 		case LEFT:
408*23974Sjaap 			fprintf(tfd, "\t\"%s \" rjust at last line.%s",
409*23974Sjaap 				lab, sidestr);
410*23974Sjaap 			break;
411*23974Sjaap 		case RIGHT:
412*23974Sjaap 			fprintf(tfd, "\t\" %s\" ljust at last line.%s",
413*23974Sjaap 				lab, sidestr);
414*23974Sjaap 			break;
415*23974Sjaap 		}
416*23974Sjaap 		/* BUG: works only if "down x" comes before "at wherever" */
417*23974Sjaap 		lab_adjust();
418*23974Sjaap 		fprintf(tfd, "\n");
419*23974Sjaap 	}
420*23974Sjaap }
421*23974Sjaap 
422*23974Sjaap Attr	*grid_desc	= 0;
423*23974Sjaap 
griddesc(a)424*23974Sjaap griddesc(a)
425*23974Sjaap 	Attr *a;
426*23974Sjaap {
427*23974Sjaap 	grid_desc = a;
428*23974Sjaap }
429*23974Sjaap 
gridlist(p)430*23974Sjaap gridlist(p)
431*23974Sjaap 	Obj *p;
432*23974Sjaap {
433*23974Sjaap 	int i, logflag;
434*23974Sjaap 	double tv;
435*23974Sjaap 	char *framestr;
436*23974Sjaap 
437*23974Sjaap 	if ((tside & (BOT|TOP)) || tside == 0)
438*23974Sjaap 		framestr = "frameht";
439*23974Sjaap 	else
440*23974Sjaap 		framestr = "framewid";
441*23974Sjaap 	fprintf(tfd, "Grid_%s:\n", p->name);
442*23974Sjaap 	tick_dir = IN;
443*23974Sjaap 	print_ticks(GRID, p, framestr, desc_str(grid_desc));
444*23974Sjaap 	if (grid_desc) {
445*23974Sjaap 		freeattr(grid_desc);
446*23974Sjaap 		free(grid_desc);
447*23974Sjaap 		grid_desc = 0;
448*23974Sjaap 	}
449*23974Sjaap }
450*23974Sjaap 
desc_str(a)451*23974Sjaap char *desc_str(a)	/* convert DOT to "dotted", etc. */
452*23974Sjaap 	Attr *a;
453*23974Sjaap {
454*23974Sjaap 	static char buf[50], *p;
455*23974Sjaap 
456*23974Sjaap 	if (a == NULL)
457*23974Sjaap 		return p = "";
458*23974Sjaap 	switch (a->type) {
459*23974Sjaap 	case DOT:	p = "dotted"; break;
460*23974Sjaap 	case DASH:	p = "dashed"; break;
461*23974Sjaap 	case INVIS:	p = "invis"; break;
462*23974Sjaap 	default:	p = "";
463*23974Sjaap 	}
464*23974Sjaap 	if (a->fval != 0.0) {
465*23974Sjaap 		sprintf(buf, "%s %g", p, a->fval);
466*23974Sjaap 		return buf;
467*23974Sjaap 	} else
468*23974Sjaap 		return p;
469*23974Sjaap }
470*23974Sjaap 
sidelog(logflag,side)471*23974Sjaap sidelog(logflag, side)	/* figure out whether to scale a side */
472*23974Sjaap 	int logflag, side;
473*23974Sjaap {
474*23974Sjaap 	if ((logflag & XFLAG) && ((side & (BOT|TOP)) || side == 0))
475*23974Sjaap 		return 1;
476*23974Sjaap 	else if ((logflag & YFLAG) && (side & (LEFT|RIGHT)))
477*23974Sjaap 		return 1;
478*23974Sjaap 	else
479*23974Sjaap 		return 0;
480*23974Sjaap }
481