1 #ifndef lint
2 static char sccsid[] = "@(#)misc.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 nnum = 0; /* number of saved numbers */
9 double num[MAXNUM];
10
11 int just; /* current justification mode (RJUST, etc.) */
12 int sizeop; /* current optional operator for size change */
13 double sizexpr; /* current size change expression */
14
savenum(n,f)15 savenum(n, f) /* save f in num[n] */
16 int n;
17 double f;
18 {
19 num[n] = f;
20 nnum = n+1;
21 if (nnum >= MAXNUM)
22 yyerror("too many numbers");
23 }
24
setjust(j)25 setjust(j)
26 {
27 just |= j;
28 }
29
setsize(op,expr)30 setsize(op, expr)
31 int op;
32 double expr;
33 {
34 sizeop = op;
35 sizexpr = expr;
36 }
37
tostring(s)38 char *tostring(s)
39 register char *s;
40 {
41 register char *p;
42
43 p = malloc(strlen(s)+1);
44 if (p == NULL)
45 fatal("out of space in tostring on %s", s);
46 strcpy(p, s);
47 return(p);
48 }
49
range(pt)50 range(pt) /* update the range for point pt */
51 Point pt;
52 {
53 Obj *p = pt.obj;
54
55 if (!(p->coord & XFLAG)) {
56 if (pt.x > p->pt1.x)
57 p->pt1.x = pt.x;
58 if (pt.x < p->pt.x)
59 p->pt.x = pt.x;
60 }
61 if (!(p->coord & YFLAG)) {
62 if (pt.y > p->pt1.y)
63 p->pt1.y = pt.y;
64 if (pt.y < p->pt.y)
65 p->pt.y = pt.y;
66 }
67 }
68
halfrange(p,side,val)69 halfrange(p, side, val) /* record max and min for one direction */
70 Obj *p;
71 int side;
72 double val;
73 {
74 if (!(p->coord&XFLAG) && (side == LEFT || side == RIGHT)) {
75 if (val < p->pt.y)
76 p->pt.y = val;
77 if (val > p->pt1.y)
78 p->pt1.y = val;
79 } else if (!(p->coord&YFLAG) && (side == TOP || side == BOT)) {
80 if (val < p->pt.x)
81 p->pt.x = val;
82 if (val > p->pt1.x)
83 p->pt1.x = val;
84 }
85 }
86
87
lookup(s,inst)88 Obj *lookup(s, inst) /* find s in objlist, install if inst */
89 char *s;
90 int inst;
91 {
92 Obj *p;
93 int found = 0;
94
95 for (p = objlist; p; p = p->next)
96 if (strcmp(s, p->name) == 0) {
97 found = 1;
98 break;
99 }
100 if (p == NULL && inst != 0) {
101 p = (Obj *) calloc(1, sizeof(Obj));
102 if (p == NULL)
103 fatal("out of space in lookup");
104 p->name = tostring(s);
105 p->type = NAME;
106 p->pt = ptmax;
107 p->pt1 = ptmin;
108 p->fval = 0.0;
109 p->next = objlist;
110 objlist = p;
111 }
112 dprintf("lookup(%s,%d) = %d\n", s, inst, found);
113 return p;
114 }
115
getvar(p)116 double getvar(p) /* return value of variable */
117 Obj *p;
118 {
119 return p->fval;
120 }
121
setvar(p,f)122 double setvar(p, f) /* set value of variable to f */
123 Obj *p;
124 double f;
125 {
126 if (strcmp(p->name, "pointsize") == 0) { /* kludge */
127 pointsize = f;
128 ps_set = 1;
129 }
130 p->type = VARNAME;
131 return p->fval = f;
132 }
133
makepoint(s,x,y)134 Point makepoint(s, x, y) /* make a Point */
135 Obj *s;
136 double x, y;
137 {
138 Point p;
139
140 dprintf("makepoint: %s, %g,%g\n", s->name, x, y);
141 p.obj = s;
142 p.x = x;
143 p.y = y;
144 return p;
145 }
146
makefattr(type,fval)147 Attr *makefattr(type, fval) /* set double in attribute */
148 int type;
149 double fval;
150 {
151 return makeattr(type, fval, (char *) 0, 0, 0);
152 }
153
makesattr(s,a)154 Attr *makesattr(s, a) /* make an Attr cell containing s */
155 char *s;
156 int a; /* fake */
157 {
158 Attr *ap = makeattr(STRING, sizexpr, s, just, sizeop);
159 just = sizeop = 0;
160 sizexpr = 0.0;
161 return ap;
162 }
163
makeattr(type,fval,sval,just,op)164 Attr *makeattr(type, fval, sval, just, op)
165 int type;
166 double fval;
167 char *sval;
168 int just, op;
169 {
170 Attr *a;
171
172 a = (Attr *) malloc(sizeof(Attr));
173 if (a == NULL)
174 fatal("out of space in makeattr");
175 a->type = type;
176 a->fval = fval;
177 a->sval = sval;
178 a->just = just;
179 a->op = op;
180 a->next = NULL;
181 return a;
182 }
183
addattr(a1,ap)184 Attr *addattr(a1, ap) /* add attr ap to end of list a1 */
185 Attr *a1, *ap;
186 {
187 Attr *p;
188
189 if (a1 == 0)
190 return ap;
191 if (ap == 0)
192 return a1;
193 for (p = a1; p->next; p = p->next)
194 ;
195 p->next = ap;
196 return a1;
197 }
198
freeattr(ap)199 freeattr(ap) /* free an attribute list */
200 Attr *ap;
201 {
202 Attr *p;
203
204 while (ap) {
205 p = ap->next; /* save next */
206 if (ap->sval)
207 free(ap->sval);
208 free(ap);
209 ap = p;
210 }
211 }
212
slprint(stringlist)213 char *slprint(stringlist) /* print strings from stringlist */
214 Attr *stringlist;
215 {
216 int ntext, n, last_op, last_just;
217 double last_fval;
218 static char buf[1000];
219 Attr *ap;
220
221 buf[0] = '\0';
222 last_op = last_just = 0;
223 last_fval = 0.0;
224 for (ntext = 0, ap = stringlist; ap != NULL; ap = ap->next)
225 ntext++;
226 sprintf(buf, "box invis wid 0 ht %d*textht", ntext);
227 n = strlen(buf);
228 for (ap = stringlist; ap != NULL; ap = ap->next) {
229 if (ap->op == 0) { /* propagate last value */
230 ap->op = last_op;
231 ap->fval = last_fval;
232 } else {
233 last_op = ap->op;
234 last_fval = ap->fval;
235 }
236 sprintf(buf+n, " \"%s\"", ps_set || ap->op ? sizeit(ap) : ap->sval);
237 if (ap->just)
238 last_just = ap->just;
239 if (last_just)
240 strcat(buf+n, juststr(last_just));
241 n = strlen(buf);
242 }
243 return buf; /* watch it: static */
244 }
245
juststr(j)246 char *juststr(j) /* convert RJUST, etc., into string */
247 int j;
248 {
249 static char buf[50];
250
251 buf[0] = '\0';
252 if (j & RJUST)
253 strcat(buf, " rjust");
254 if (j & LJUST)
255 strcat(buf, " ljust");
256 if (j & ABOVE)
257 strcat(buf, " above");
258 if (j & BELOW)
259 strcat(buf, " below");
260 return buf; /* watch it: static */
261 }
262