1 #ifndef lint
2 static char sccsid[] = "@(#)label.c	1.1 (CWI) 85/07/19";
3 #endif lint
4 #include <stdio.h>
5 #include "grap.h"
6 #include "y.tab.h"
7 
8 int	pointsize	= 10;	/* assumed pointsize to start */
9 int	ps_set		= 0;	/* someone has set pointsize explicitly */
10 
11 double	textht	= 1.0/6.0;	/* 6 lines/inch */
12 double	textwid = 1;		/* width of text box for vertical */
13 
14 double	lab_up	= 0.0;		/* extra motion for label */
15 double	lab_rt	= 0.0;		/* extra motion for label */
16 
17 labelmove(dir, amt)	/* record direction & motion of position corr */
18 	int dir;
19 	double amt;
20 {
21 	switch (dir) {
22 	case UP:	lab_up += amt; break;
23 	case DOWN:	lab_up -= amt; break;
24 	case LEFT:	lab_rt -= amt; break;
25 	case RIGHT:	lab_rt += amt; break;
26 	}
27 }
28 
29 label(label_side, stringlist)	/* stick label on label_side */
30 	int label_side;
31 	Attr *stringlist;
32 {
33 	int i, m;
34 	Attr *ap, *nap;
35 
36 	fprintf(tfd, "\ttextht = %g\n", textht);
37 	if (label_side == LEFT || label_side == RIGHT) {
38 		textwid = 0;
39 		for (ap = stringlist; ap != NULL; ap = ap->next)
40 			if ((m = strlen(ap->sval)) > textwid)
41 				textwid = m;
42 		textwid /= 15;	/* estimate width at 15 chars/inch */
43 		fprintf(tfd, "\ttextwid = %g\n", textwid);
44 	}
45 	fprintf(tfd, "Label:\t%s", slprint(stringlist));
46 	freeattr(stringlist);
47 	switch (label_side) {
48 	case BOT:
49 	case 0:
50 		fprintf(tfd, " with .n at Frame.s - (0,2 * textht)");
51 		break;
52 	case LEFT:
53 		fprintf(tfd, " wid textwid with .e at Frame.w - (0.2,0)");
54 		break;
55 	case RIGHT:
56 		fprintf(tfd, " wid textwid with .w at Frame.e + (0.2,0)");
57 		break;
58 	case TOP:
59 		fprintf(tfd, " with .s at Frame.n + (0,2 * textht)");
60 		break;
61 	}
62 	lab_adjust();
63 	fprintf(tfd, "\n");
64 	label_side = BOT;
65 }
66 
67 lab_adjust()	/* add a string to adjust labels, ticks, etc. */
68 {
69 	if (lab_up != 0.0 || lab_rt != 0.0)
70 		fprintf(tfd, " + (%g,%g)", lab_rt, lab_up);
71 }
72 
73 char *sizeit(ap)		/* add \s..\s to ap->sval */
74 	Attr *ap;
75 {
76 	int n;
77 	static char buf[1000];
78 
79 	if (!ap->op) {	/* no explicit size command */
80 		if (ps_set) {
81 			sprintf(buf, "\\s%d%s\\s0", pointsize, ap->sval);
82 			return buf;
83 		} else
84 			return ap->sval;
85 	} else if (!ps_set) {	/* explicit size but no global size */
86 		n = (int) ap->fval;
87 		switch (ap->op) {
88 		case ' ':	/* absolute size */
89 			sprintf(buf, "\\s%d%s\\s0", n, ap->sval);
90 			break;
91 		case '+':	/* better be only one digit! */
92 			sprintf(buf, "\\s+%d%s\\s-%d", n, ap->sval, n);
93 			break;
94 		case '-':
95 			sprintf(buf, "\\s-%d%s\\s+%d", n, ap->sval, n);
96 			break;
97 		case '*':
98 		case '/':
99 			return ap->sval;	/* ignore for now */
100 		}
101 		return buf;
102 	} else {
103 		/* explicit size and a global background size */
104 		n = (int) ap->fval;
105 		switch (ap->op) {
106 		case ' ':	/* absolute size */
107 			sprintf(buf, "\\s%d%s\\s0", n, ap->sval);
108 			break;
109 		case '+':
110 			sprintf(buf, "\\s%d%s\\s0", pointsize+n, ap->sval);
111 			break;
112 		case '-':
113 			sprintf(buf, "\\s%d%s\\s0", pointsize-n, ap->sval);
114 			break;
115 		case '*':
116 		case '/':
117 			return ap->sval;	/* ignore for now */
118 		}
119 		return buf;
120 	}
121 }
122