Annotation of OpenXM_contrib2/asir2000/plot/plotf.c, Revision 1.3
1.3 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2000/plot/plotf.c,v 1.2 2000/03/28 06:32:23 noro Exp $ */
1.1 noro 2: #include "ca.h"
3: #include "parse.h"
4: #include "ox.h"
5: #include "ifplot.h"
6:
7: void Pifplot(), Pconplot(), Pplotover(), Pplot(), Parrayplot(), Pdrawcircle();
8:
9: struct ftab plot_tab[] = {
10: {"ifplot",Pifplot,-7},
11: {"conplot",Pconplot,-8},
12: {"plot",Pplot,-6},
13: {"plotover",Pplotover,3},
14: {"drawcircle",Pdrawcircle,5},
15: /*
16: {"arrayplot",Parrayplot,2},
17: */
18: {0,0,0},
19: };
20:
21: int current_s;
22:
23: void Pifplot(arg,rp)
24: NODE arg;
25: Obj *rp;
26: {
27: Q m2,p2,w300,sid;
28: NODE defrange;
29: LIST xrange,yrange,range[2],list,geom;
30: VL vl,vl0;
31: V v[2],av[2];
32: int stream,ri,id,i;
33: P poly;
34: P var;
35: NODE n,n0;
36: STRING fname,wname;
37:
38: STOQ(-2,m2); STOQ(2,p2);
39: MKNODE(n,p2,0); MKNODE(defrange,m2,n);
40: poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
41: for ( ; arg; arg = NEXT(arg) )
42: if ( !BDY(arg) )
43: stream = 0;
44: else
45: switch ( OID(BDY(arg)) ) {
46: case O_P:
47: poly = (P)BDY(arg);
48: get_vars_recursive(poly,&vl);
49: for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
50: if ( vl0->v->attr == V_IND )
51: if ( i >= 2 )
52: error("ifplot : invalid argument");
53: else
54: v[i++] = vl0->v;
55: break;
56: case O_LIST:
57: list = (LIST)BDY(arg);
58: if ( OID(BDY(BDY(list))) == O_P )
59: if ( ri > 1 )
60: error("ifplot : invalid argument");
61: else
62: range[ri++] = list;
63: else
64: geom = list;
65: break;
66: case O_N:
67: stream = QTOS((Q)BDY(arg)); break;
68: case O_STR:
69: wname = (STRING)BDY(arg); break;
70: default:
71: error("ifplot : invalid argument"); break;
72: }
73: if ( !poly )
74: error("ifplot : invalid argument");
75: switch ( ri ) {
76: case 0:
77: if ( !v[1] )
78: error("ifplot : please specify all variables");
79: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
80: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
81: break;
82: case 1:
83: if ( !v[1] )
84: error("ifplot : please specify all variables");
85: av[0] = VR((P)BDY(BDY(range[0])));
86: if ( v[0] == av[0] ) {
87: xrange = range[0];
88: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
89: } else if ( v[1] == av[0] ) {
90: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
91: yrange = range[0];
92: } else
93: error("ifplot : invalid argument");
94: break;
95: case 2:
96: av[0] = VR((P)BDY(BDY(range[0])));
97: av[1] = VR((P)BDY(BDY(range[1])));
98: if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
99: ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
100: xrange = range[0]; yrange = range[1];
101: } else
102: error("ifplot : invalid argument");
103: break;
104: default:
105: error("ifplot : cannot happen"); break;
106: }
107: /* ifplot in ox_plot requires
108: [sid (Q),
109: formula (Obj),
110: xrange=[x,xmin,xmax] (LIST),
111: yrange=[y,ymin,ymax] (LIST),
112: zrange=0,
113: geom=[xsize,ysize] (LIST),
114: wname=name (STRING)]
115: */
116:
117: if ( stream < 0 )
118: stream = current_s;
119: else
120: current_s = stream;
121: STOQ(stream,sid);
122: if ( !geom ) {
123: STOQ(300,w300);
124: MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
125: }
126: MKSTR(fname,"plot");
127: arg = mknode(8,sid,fname,poly,xrange,yrange,0,geom,wname);
1.3 ! noro 128: Pox_rpc(arg,rp);
1.1 noro 129: }
130:
131: void Pconplot(arg,rp)
132: NODE arg;
133: Obj *rp;
134: {
135: Q m2,p2,w300,sid;
136: NODE defrange;
137: LIST xrange,yrange,zrange,range[3],list,geom;
138: VL vl,vl0;
139: V v[2],av[2];
140: int stream,ri,id,i;
141: P poly;
142: P var;
143: NODE n,n0;
144: STRING fname,wname;
145:
146: STOQ(-2,m2); STOQ(2,p2);
147: MKNODE(n,p2,0); MKNODE(defrange,m2,n);
148: poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
149: for ( ; arg; arg = NEXT(arg) )
150: if ( !BDY(arg) )
151: stream = 0;
152: else
153: switch ( OID(BDY(arg)) ) {
154: case O_P:
155: poly = (P)BDY(arg);
156: get_vars_recursive(poly,&vl);
157: for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
158: if ( vl0->v->attr == V_IND )
159: if ( i >= 2 )
160: error("ifplot : invalid argument");
161: else
162: v[i++] = vl0->v;
163: break;
164: case O_LIST:
165: list = (LIST)BDY(arg);
166: if ( OID(BDY(BDY(list))) == O_P )
167: if ( ri > 2 )
168: error("ifplot : invalid argument");
169: else
170: range[ri++] = list;
171: else
172: geom = list;
173: break;
174: case O_N:
175: stream = QTOS((Q)BDY(arg)); break;
176: case O_STR:
177: wname = (STRING)BDY(arg); break;
178: default:
179: error("ifplot : invalid argument"); break;
180: }
181: if ( !poly )
182: error("ifplot : invalid argument");
183: switch ( ri ) {
184: case 0:
185: if ( !v[1] )
186: error("ifplot : please specify all variables");
187: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
188: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
189: MKNODE(n,0,defrange); MKLIST(zrange,n);
190: break;
191: case 1:
192: if ( !v[1] )
193: error("ifplot : please specify all variables");
194: av[0] = VR((P)BDY(BDY(range[0])));
195: if ( v[0] == av[0] ) {
196: xrange = range[0];
197: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
198: MKNODE(n,0,defrange); MKLIST(zrange,n);
199: } else if ( v[1] == av[0] ) {
200: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
201: yrange = range[0];
202: MKNODE(n,0,defrange); MKLIST(zrange,n);
203: } else {
204: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
205: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
206: zrange = range[0];
207: }
208: break;
209: case 2: case 3:
210: av[0] = VR((P)BDY(BDY(range[0])));
211: av[1] = VR((P)BDY(BDY(range[1])));
212: if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
213: ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
214: xrange = range[0]; yrange = range[1];
215: if ( ri == 3 )
216: zrange = range[2];
217: else {
218: MKNODE(n,0,defrange); MKLIST(zrange,n);
219: }
220: } else
221: error("ifplot : invalid argument");
222: break;
223: default:
224: error("ifplot : cannot happen"); break;
225: }
226: if ( stream < 0 )
227: stream = current_s;
228: else
229: current_s = stream;
230:
231: /* conplot in ox_plot requires
232: [sid (Q),
233: formula (Obj),
234: xrange=[x,xmin,xmax] (LIST),
235: yrange=[y,ymin,ymax] (LIST),
236: zrange=[z,zmin,zmax] (LIST),
237: geom=[xsize,ysize] (LIST),
238: wname=name (STRING)]
239: */
240:
241: if ( stream < 0 )
242: stream = current_s;
243: else
244: current_s = stream;
245: STOQ(stream,sid);
246: if ( !geom ) {
247: STOQ(300,w300);
248: MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
249: }
250: MKSTR(fname,"plot");
251: arg = mknode(8,sid,fname,poly,xrange,yrange,zrange,geom,wname);
1.3 ! noro 252: Pox_rpc(arg,rp);
1.1 noro 253: }
254:
255: void Pplot(arg,rp)
256: NODE arg;
257: Obj *rp;
258: {
259: Q m2,p2,w300,sid;
260: NODE defrange;
261: LIST xrange,range[1],list,geom;
262: VL vl,vl0;
263: V v[1],av[1];
264: int stream,ri,id,i;
265: P poly;
266: P var;
267: NODE n,n0;
268: STRING fname,wname;
269:
270: STOQ(-2,m2); STOQ(2,p2);
271: MKNODE(n,p2,0); MKNODE(defrange,m2,n);
272: poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
273: for ( ; arg; arg = NEXT(arg) )
274: if ( !BDY(arg) )
275: stream = 0;
276: else
277: switch ( OID(BDY(arg)) ) {
278: case O_P: case O_R:
279: poly = (P)BDY(arg);
280: get_vars_recursive(poly,&vl);
281: for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
282: if ( vl0->v->attr == V_IND )
283: if ( i >= 1 )
284: error("ifplot : invalid argument");
285: else
286: v[i++] = vl0->v;
287: break;
288: case O_LIST:
289: list = (LIST)BDY(arg);
290: if ( OID(BDY(BDY(list))) == O_P )
291: if ( ri > 0 )
292: error("plot : invalid argument");
293: else
294: range[ri++] = list;
295: else
296: geom = list;
297: break;
298: case O_N:
299: stream = QTOS((Q)BDY(arg)); break;
300: case O_STR:
301: wname = (STRING)BDY(arg); break;
302: default:
303: error("plot : invalid argument"); break;
304: }
305: if ( !poly )
306: error("plot : invalid argument");
307: switch ( ri ) {
308: case 0:
309: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
310: break;
311: case 1:
312: av[0] = VR((P)BDY(BDY(range[0])));
313: if ( v[0] == av[0] )
314: xrange = range[0];
315: else
316: error("plot : invalid argument");
317: break;
318: default:
319: error("plot : cannot happen"); break;
320: }
321: /* conplot in ox_plot requires
322: [sid (Q),
323: formula (Obj),
324: xrange=[x,xmin,xmax] (LIST),
325: yrange=0,
326: zrange=0,
327: geom=[xsize,ysize] (LIST),
328: wname=name (STRING)]
329: */
330: if ( stream < 0 )
331: stream = current_s;
332: else
333: current_s = stream;
334: STOQ(stream,sid);
335: if ( !geom ) {
336: STOQ(300,w300);
337: MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
338: }
339: MKSTR(fname,"plot");
340: arg = mknode(8,sid,fname,poly,xrange,0,0,geom,wname);
1.3 ! noro 341: Pox_rpc(arg,rp);
1.1 noro 342: }
343:
344: void Pplotover(arg,rp)
345: NODE arg;
346: Obj *rp;
347: {
348: Q sid,index;
349: P poly;
350: STRING fname;
351:
352: poly = (P)ARG0(arg);
353: sid = (Q)ARG1(arg);
354: index = (Q)ARG2(arg);
355: MKSTR(fname,"plotover");
356: arg = mknode(4,sid,fname,index,poly);
1.3 ! noro 357: Pox_rpc(arg,rp);
1.1 noro 358: }
359:
360: /* arg = [x,y,r,sid,index] */
361:
362: void Pdrawcircle(arg,rp)
363: NODE arg;
364: Obj *rp;
365: {
366: Q sid,index;
367: Obj x,y,r;
368: STRING fname;
369: NODE n;
370: LIST pos;
371:
372: x = (Obj)ARG0(arg);
373: y = (Obj)ARG1(arg);
374: r = (Obj)ARG2(arg);
375: sid = (Q)ARG3(arg);
376: index = (Q)ARG4(arg);
377: MKSTR(fname,"drawcircle");
378: n = mknode(3,x,y,r); MKLIST(pos,n);
379: arg = mknode(4,sid,fname,index,pos);
1.3 ! noro 380: Pox_rpc(arg,rp);
1.1 noro 381: }
382:
383: #if 0
384: void Parrayplot(arg,rp)
385: NODE arg;
386: Obj *rp;
387: {
388: int s;
389: int id;
390:
391: if ( ID((Obj)ARG0(arg)) == O_VECT && ID((Obj)ARG1(arg)) == O_LIST ) {
392: s = current_s;
393: gensend(s,C_APLOT,0);
394: gensend(s,C_OBJ,ARG0(arg)); gensend(s,C_OBJ,ARG1(arg)); genflush(s);
395: }
396: genrecv(s,&id,rp);
397: }
398: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>