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