Blame


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