Annotation of OpenXM_contrib2/asir2018/plot/plotf.c, Revision 1.3
1.1 noro 1: /*
2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
3: * All rights reserved.
4: *
5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
6: * non-exclusive and royalty-free license to use, copy, modify and
7: * redistribute, solely for non-commercial and non-profit purposes, the
8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
9: * conditions of this Agreement. For the avoidance of doubt, you acquire
10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
11: * third party developer retains all rights, including but not limited to
12: * copyrights, in and to the SOFTWARE.
13: *
14: * (1) FLL does not grant you a license in any way for commercial
15: * purposes. You may use the SOFTWARE only for non-commercial and
16: * non-profit purposes only, such as academic, research and internal
17: * business use.
18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
19: * international copyright treaties. If you make copies of the SOFTWARE,
20: * with or without modification, as permitted hereunder, you shall affix
21: * to all such copies of the SOFTWARE the above copyright notice.
22: * (3) An explicit reference to this SOFTWARE and its copyright owner
23: * shall be made on your publication or presentation in any form of the
24: * results obtained by use of the SOFTWARE.
25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
27: * for such modification or the source code of the modified part of the
28: * SOFTWARE.
29: *
30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
47: *
1.3 ! noro 48: * $OpenXM: OpenXM_contrib2/asir2018/plot/plotf.c,v 1.2 2018/09/28 08:20:29 noro Exp $
1.1 noro 49: */
50: #include "ca.h"
51: #include "parse.h"
52: #include "ox.h"
53: #include "ifplot.h"
54:
55: int validate_ox_plot_stream(int);
56: void ListCheck(char *,LIST);
57: void Pplot(NODE,Obj *);
58: void Ppolarplot(NODE,Z *);
59: void Pobj_cp(NODE,Obj *),Parrayplot(NODE,Obj*),Pdrawcircle(NODE,Obj*);
60: void Pifplot(NODE,Obj *),Pconplot(NODE,Obj *),Pplotover(NODE,Obj *);
61: void Pmemory_ifplot(NODE,Obj *),Pmemory_conplot(NODE,Obj *);
62: void Pmemory_plot(NODE,Obj *);
63: void ifplot_main(NODE,int,char *,Obj *);
64: void plot_main(NODE,int,char *,Obj *);
65: void conplot_main(NODE,int,Obj *);
66:
67: void Popen_canvas(NODE,Obj *),Pclear_canvas(NODE,Obj *),Pdraw_obj(NODE,Obj *);
68: void Pdraw_string(NODE,Obj *);
69: void Pox_rpc(NODE,Obj *), Pox_cmo_rpc(NODE,Obj *);
70:
71: //NG
72: #if defined(INTERVAL)
73: void Pitvifplot(NODE, Obj *);
74: #endif
75: void PifplotD(NODE,Obj *),PifplotQ(NODE,Obj *),PifplotB(NODE,Obj *);
76: void PineqnD(NODE,Obj *), PineqnQ(NODE,Obj *), PineqnB(NODE,Obj *);
77: void PineqnandD(NODE,Obj *), PineqnandQ(NODE,Obj *), PineqnandB(NODE,Obj *);
78: void PineqnorD(NODE,Obj *), PineqnorQ(NODE,Obj *), PineqnorB(NODE,Obj *);
79: void PineqnxorD(NODE,Obj *), PineqnxorQ(NODE,Obj *), PineqnxorB(NODE,Obj *);
80: void PconplotD(NODE,Obj *),PconplotQ(NODE,Obj *),PconplotB(NODE,Obj *);
81: void PpolarplotD(NODE,Obj *);
82: void PplotoverD(NODE,Obj *),PplotoverQ(NODE,Obj *),PplotoverB(NODE,Obj *);
83: void ifplot_mainNG(NODE,char *,Obj *);
84: void conplot_mainNG(NODE,char *,Obj *);
85: void plotover_mainNG(NODE,char *,Obj *);
86:
87: struct ftab plot_tab[]={
88: {PLOT,Pplot,-7},
89: #if defined(INTERVAL)
90: {ITVIFPLOT,Pitvifplot,-8},
91: #endif
92: {OBJ_CP,Pobj_cp,4},
93: {POLARPLOT,Ppolarplot,-6},
94: {POLARPLOTD,PpolarplotD,-7},
95: {IFPLOT,Pifplot,-7},
96: {IFPLOTD,PifplotD,-8},
97: {IFPLOTQ,PifplotQ,-8},
98: {IFPLOTB,PifplotB,-8},
99: {INEQN,PineqnD,-8},
100: {INEQND,PineqnD,-8},
101: {INEQNQ,PineqnQ,-8},
102: {INEQNB,PineqnB,-8},
103: {INEQNAND,PineqnandD,-4},
104: {INEQNDAND,PineqnandD,-4},
105: {INEQNQAND,PineqnandQ,-4},
106: {INEQNBAND,PineqnandB,-4},
107: {INEQNOR,PineqnorD,-4},
108: {INEQNDOR,PineqnorD,-4},
109: {INEQNQOR,PineqnorQ,-4},
110: {INEQNBOR,PineqnorB,-4},
111: {INEQNXOR,PineqnxorD,-4},
112: {INEQNDXOR,PineqnxorD,-4},
113: {INEQNQXOR,PineqnxorQ,-4},
114: {INEQNBXOR,PineqnxorB,-4},
115: {CONPLOT,Pconplot,-7},
116: {CONPLOTD,PconplotD,-8},
117: {CONPLOTB,PconplotB,-8},
118: {CONPLOTQ,PconplotQ,-8},
119: {PLOTOVER,Pplotover,-4},
120: {PLOTOVERD,PplotoverD,-4},
121: {PLOTOVERQ,PplotoverQ,-4},
122: {PLOTOVERB,PplotoverB,-4},
123: {MEMORY_IFPLOT,Pmemory_ifplot,-7},
124: {MEMORY_CONPLOT,Pmemory_conplot,-7},
125: {MEMORY_PLOT,Pmemory_plot,-7},
126: {DRAWCIRCLE,Pdrawcircle,6},
127: {OPEN_CANVAS,Popen_canvas,-3},
128: {CLEAR_CANVAS,Pclear_canvas,2},
129: {DRAW_OBJ,Pdraw_obj,-4},
130: {DRAW_STRING,Pdraw_string,-5},
131: {0,0,0},
132: };
133: char *pfn[]={
134: IFPLOT,CONPLOT,PLOT,INTERACTIVE,POLARPLOT,PLOTOVER,
135: IFPLOTD,IFPLOTQ,IFPLOTB,INEQND,INEQNQ,INEQNB,
136: INEQNDAND,INEQNQAND,INEQNBAND,
137: INEQNDOR,INEQNQOR,INEQNBOR,
138: INEQNDXOR,INEQNQXOR,INEQNBXOR,
139: CONPLOTD,CONPLOTQ,CONPLOTB,ITVIFPLOT,
140: PLOTOVERD,PLOTOVERQ,PLOTOVERB,
141: MEMORY_IFPLOT,MEMORY_CONPLOT,MEMORY_PLOT,ARRAYPLOT,OPEN_CANVAS,
142: DRAWCIRCLE,DRAW_OBJ,DRAW_STRING,OBJ_CP,CLEAR_CANVAS,POLARPLOTD};
143: /*
144: IFPLOT:0,CONPLOT:1,PLOT:2,INTERACTIVE:3,POLARPLOT:4,PLOTOVER:5,
145: IFPLOTD:6,IFPLOTQ:7,IFPLOTB:8,INEQND:9,INEQNQ:10,INEQNB:11,
146: INEQNDAND:12,INEQNQAND:13,INEQNBAND:14,
147: INEQNDOR:15,INEQNQOR:16,INEQNBOR:17,
148: INEQNDXOR:18,INEQNQXOR:19,INEQNBXOR:20,
149: CONPLOTD:21,CONPLOTQ:22,CONPLOTB:23,ITVIFPLOT:24,
150: PLOTOVERD:25,PLOTOVERQ:26,PLOTOVERB:27,
151: MEMORY_IFPLOT:28,MEMORY_CONPLOT:29,MEMORY_PLOT:30,ARRAYPLOT:31,
152: OPEN_CANVAS:32,DRAWCIRCLE:33,DRAW_OBJ:34,DRAW_STRING:35,OBJ_CP:36,
153: CLEAR_CANVAS:37,POLARPLOTD:38
154: */
155: int modeNO(char *fn){
156: int i;
157: char **z;
158: for(i=0,z=pfn;*z!=NULL;z++,i++)if(!strcmp(fn,*z))return i;
159: return -1;
160: }
161:
162: void Popen_canvas(NODE arg,Obj *rp){
163: Z w300,s_id;
164: LIST geom;
165: int stream;
166: NODE n,n0;
167: STRING fname,wname;
168:
169: geom=0;wname=0;stream=-1;
170: for(;arg;arg=NEXT(arg))
171: if(!BDY(arg)) stream=0;
172: else switch (OID(BDY(arg))){
173: case O_LIST:
174: geom=(LIST)BDY(arg);
175: break;
176: case O_N:
1.2 noro 177: stream=ZTOS((Q)BDY(arg));
1.1 noro 178: break;
179: case O_STR:
180: wname=(STRING)BDY(arg);
181: break;
182: default:
183: error("open_canvas : invalid argument");
184: break;
185: }
186: stream=validate_ox_plot_stream(stream);
1.2 noro 187: STOZ(stream,s_id);
1.1 noro 188: if(!geom){
1.2 noro 189: STOZ(300,w300);
1.1 noro 190: MKNODE(n0,w300,0);
191: MKNODE(n,w300,n0);
192: MKLIST(geom,n);
193: }
194: MKSTR(fname,OPEN_CANVAS);
195: arg=mknode(4,s_id,fname,geom,wname);
196: Pox_cmo_rpc(arg,rp);
197: *rp=(Obj)s_id;
198: }
199:
200: void Pifplot(NODE arg,Obj *rp){ifplot_main(arg,0,IFPLOT,rp);}
201: void Pmemory_ifplot(NODE arg,Obj *rp){ifplot_main(arg,1,IFPLOT,rp);}
202:
203: void ifplot_main(NODE arg,int is_memory,char *fn,Obj *rp){
204: Z m2,p2,w300,s_id;
205: NODE defrange;
206: LIST xrange,yrange,zrange,range[2],list,geom=0;
207: VL vl,vl0;
208: V v[2],av[2];
209: int stream,ri,i,sign;
210: Obj poly;
211: P var;
212: NODE n,n0;
213: STRING fname,wname;
214: Obj t;
215: int found_f;
216:
1.2 noro 217: STOZ(-2,m2);STOZ(2,p2);MKNODE(n,p2,0);MKNODE(defrange,m2,n);
1.1 noro 218: poly=0;vl=0;geom=0;wname=0;stream=-1;ri=0;xrange=0;yrange=0;zrange=0;
219: v[0]=v[1]=0;
220: found_f = 0;
221: for(;arg;arg=NEXT(arg))
222: if(!BDY(arg)){
223: if ( !found_f ) {
224: poly = 0;
225: found_f = 1;
226: } else stream=0;
227: } else
228: switch(OID(BDY(arg))){
229: case O_P:
230: poly=(Obj)BDY(arg);
231: get_vars_recursive((Obj)poly,&vl);
232: for(vl0=vl,i=0;vl0;vl0=NEXT(vl0)){
233: if(vl0->v->attr==(pointer)V_IND){
234: if(i>=2)error("ifplot : invalid argument");
235: else v[i++]=vl0->v;
236: }
237: }
238: found_f = 1;
239: break;
240: case O_LIST:
241: list=(LIST)BDY(arg);
242: if(OID(BDY(BDY(list)))==O_P)
243: if(ri>1) error("ifplot : invalid argument");
244: else range[ri++]=list;
245: else if ( geom )
246: error("ifplot : Two geometries are specified. Probably a variable is missing.");
247: else
248: geom=list;
249: break;
250: case O_N:
251: if ( !found_f ) {
252: poly = (Obj)BDY(arg);
253: found_f = 1;
1.2 noro 254: } else stream=ZTOS((Q)BDY(arg));
1.1 noro 255: break;
256: case O_STR:
257: wname=(STRING)BDY(arg);break;
258: default:
259: error("ifplot : invalid argument");break;
260: }
261: if(!found_f) error("ifplot : invalid argument");
262: switch(ri){
263: case 0:
264: if(!v[1]) error("ifplot : please specify all variables");
265: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
266: MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n);
267: break;
268: case 1:
269: if(!v[1]) error("ifplot : please specify all variables");
270: av[0]=VR((P)BDY(BDY(range[0])));
271: if(!poly || NUM(poly) || v[0]==av[0]){
272: xrange=range[0];
273: MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n);
274: } else if(v[1]==av[0]){
275: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
276: yrange=range[0];
277: } else error("ifplot : invalid argument");
278: break;
279: case 2:
280: av[0]=VR((P)BDY(BDY(range[0])));
281: av[1]=VR((P)BDY(BDY(range[1])));
282: if(!poly || NUM(poly) || (((v[0]==av[0])&&(!v[1]||v[1]==av[1]))||
283: ((v[0]==av[1])&&(!v[1]||v[1]==av[0])))){
284: xrange=range[0];yrange=range[1];
285: } else error("ifplot : invalid argument");
286: break;
287: default:
288: error("ifplot : cannot happen");break;
289: }
290: /* ifplot in ox_plot requires
291: [s_id (Q),
292: formula (Obj),
293: xrange=[x,xmin,xmax] (LIST),
294: yrange=[y,ymin,ymax] (LIST),
295: zrange=0,
296: geom=[xsize,ysize] (LIST),
297: wname=name (STRING)]
298: */
299: stream=validate_ox_plot_stream(stream);
1.2 noro 300: STOZ(stream,s_id);
1.1 noro 301: if(!geom){
1.2 noro 302: STOZ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
1.1 noro 303: }
304: if(is_memory){
305: MKSTR(fname,MEMORY_PLOT);
306: arg=mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom);
307: Pox_rpc(arg,&t);
308: arg=mknode(1,s_id);
309: Pox_pop_cmo(arg,rp);
310: } else {
311: MKSTR(fname,fn);
312: arg=mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname);
313: Pox_rpc(arg,&t);
314: *rp=(Obj)s_id;
315: }
316: }
317:
318: void Pconplot(NODE arg,Obj *rp){conplot_main(arg, 0, rp);}
319: void Pmemory_conplot(NODE arg,Obj *rp){conplot_main(arg,1,rp);}
320:
321: void conplot_main(NODE arg,int is_memory,Obj *rp){
322: Z m2,p2,w300,s_id;
323: NODE defrange;
324: LIST xrange,yrange,zrange,range[3],list,geom;
325: VL vl,vl0;
326: V v[2],av[2];
327: int stream,ri,i;
328: P poly;
329: P var;
330: NODE n,n0;
331: STRING fname,wname;
332: Obj t;
333:
1.2 noro 334: STOZ(-2,m2); STOZ(2,p2);
1.1 noro 335: MKNODE(n,p2,0); MKNODE(defrange,m2,n);
336: poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
337: v[0] = v[1] = 0;
338: for ( ; arg; arg = NEXT(arg) )
339: if ( !BDY(arg) )
340: stream = 0;
341: else
342: switch ( OID(BDY(arg)) ) {
343: case O_P:
344: poly = (P)BDY(arg);
345: get_vars_recursive((Obj)poly,&vl);
346: for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
1.3 ! noro 347: if ( vl0->v->attr == (pointer)V_IND ) {
1.1 noro 348: if ( i >= 2 )
349: error("ifplot : invalid argument");
350: else
351: v[i++] = vl0->v;
1.3 ! noro 352: }
1.1 noro 353: break;
354: case O_LIST:
355: list = (LIST)BDY(arg);
356: if ( OID(BDY(BDY(list))) == O_P ) {
357: if ( ri > 2 )
358: error("ifplot : invalid argument");
359: else
360: range[ri++] = list;
361: } else if ( geom )
362: error("conplot : Two geometries are specified. Probably a variable is missing.");
363: else
364: geom = list;
365: break;
366: case O_N:
1.2 noro 367: stream = ZTOS((Q)BDY(arg)); break;
1.1 noro 368: case O_STR:
369: wname = (STRING)BDY(arg); break;
370: default:
371: error("ifplot : invalid argument"); break;
372: }
373: if ( !poly )
374: error("ifplot : invalid argument");
375: switch ( ri ) {
376: case 0:
377: if ( !v[1] )
378: error("ifplot : please specify all variables");
379: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
380: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
381: MKNODE(n,0,defrange); MKLIST(zrange,n);
382: break;
383: case 1:
384: if ( !v[1] )
385: error("ifplot : please specify all variables");
386: av[0] = VR((P)BDY(BDY(range[0])));
387: if ( v[0] == av[0] ) {
388: xrange = range[0];
389: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
390: MKNODE(n,0,defrange); MKLIST(zrange,n);
391: } else if ( v[1] == av[0] ) {
392: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
393: yrange = range[0];
394: MKNODE(n,0,defrange); MKLIST(zrange,n);
395: } else {
396: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
397: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
398: zrange = range[0];
399: }
400: break;
401: case 2: case 3:
402: av[0] = VR((P)BDY(BDY(range[0])));
403: av[1] = VR((P)BDY(BDY(range[1])));
404: if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
405: ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
406: xrange = range[0]; yrange = range[1];
407: if ( ri == 3 )
408: zrange = range[2];
409: else {
410: MKNODE(n,0,defrange); MKLIST(zrange,n);
411: }
412: } else
413: error("ifplot : invalid argument");
414: break;
415: default:
416: error("ifplot : cannot happen"); break;
417: }
418: /* conplot in ox_plot requires
419: [s_id (Q),
420: formula (Obj),
421: xrange=[x,xmin,xmax] (LIST),
422: yrange=[y,ymin,ymax] (LIST),
423: zrange=[z,zmin,zmax] (LIST),
424: geom=[xsize,ysize] (LIST),
425: wname=name (STRING)]
426: */
427:
428: stream = validate_ox_plot_stream(stream);
1.2 noro 429: STOZ(stream,s_id);
1.1 noro 430: if ( !geom ) {
1.2 noro 431: STOZ(300,w300);
1.1 noro 432: MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
433: }
434: if ( is_memory ) {
435: MKSTR(fname,"memory_plot");
436: arg = mknode(7,s_id,fname,poly,xrange,yrange,zrange,geom);
437: Pox_rpc(arg,&t);
438: arg = mknode(1,s_id);
439: Pox_pop_cmo(arg,rp);
440: } else {
441: MKSTR(fname,CONPLOT);
442: arg = mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname);
443: Pox_rpc(arg,&t);
444: *rp = (Obj)s_id;
445: }
446: }
447:
448: void Pplot(NODE arg,Obj *rp){plot_main(arg,0,PLOT,rp);}
449: void Pmemory_plot(NODE arg,Obj *rp){plot_main(arg,1,PLOT,rp);}
450:
451: int plot_by_bigfloat;
452:
453: void plot_main(NODE arg,int is_memory,char *fn,Obj *rp){
454: Z m2,p2,w300,s_id;
455: NODE defrange;
456: LIST xrange,range[1],list,geom;
457: VL vl,vl0;
458: V v[1],av[1];
459: int stream,ri,i,found_f;
460: Obj func;
461: P var;
462: NODE n,n0;
463: STRING fname,wname;
464: Obj t;
465: Z prec;
466:
1.2 noro 467: STOZ(-2,m2);STOZ(2,p2);
1.1 noro 468: MKNODE(n,p2,0);MKNODE(defrange,m2,n);
469: func=0;vl=0;geom=0;wname=0;stream=-1;ri=0;
470: v[0]=0;
471: found_f = 0;
472: for(;arg;arg=NEXT(arg) ) {
473: if(!BDY(arg) )
474: if ( !found_f ) {
475: makevar("x",&var);
476: v[0] = VR(var);
477: found_f = 1;
478: } else
479: stream=0;
480: else
481: switch ( OID(BDY(arg)) ){
482: case O_P: case O_R:
483: func = (Obj)BDY(arg);
484: get_vars_recursive(func,&vl);
485: for(vl0=vl, i=0;vl0;vl0=NEXT(vl0) ){
486: if(vl0->v->attr==(pointer)V_IND ){
487: if(i >= 1 ) error("plot : function must be univariate");
488: else v[i++]=vl0->v;
489: }
490: }
491: found_f = 1;
492: break;
493: case O_LIST:
494: list=(LIST)BDY(arg);
495: if(OID(BDY(BDY(list)))==O_P ){
496: if(ri > 0 ) error("plot : too many intervals");
497: else range[ri++]=list;
498: } else geom=list;
499: break;
500: case O_N:
501: if ( !found_f ) {
502: func = (Obj)BDY(arg);
503: makevar("x",&var);
504: v[0] = VR(var);
505: found_f = 1;
506: } else
1.2 noro 507: stream=ZTOS((Q)BDY(arg));
1.1 noro 508: break;
509: case O_STR:
510: wname=(STRING)BDY(arg);break;
511: default:
512: error("plot : invalid argument");break;
513: }
514: }
515: if(!found_f )
516: error("plot : invalid argument");
517: switch ( ri ){
518: case 0:
519: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
520: break;
521: case 1:
522: av[0]=VR((P)BDY(BDY(range[0])));
523: if(!func || NUM(func) || v[0]==av[0] )
524: xrange=range[0];
525: else
526: error("plot : invalid argument");
527: break;
528: default:
529: error("plot : cannot happen");break;
530: }
531: /* conplot in ox_plot requires
532: [s_id (Q),
533: formula (Obj),
534: xrange=[x,xmin,xmax] (LIST),
535: yrange=0,
536: zrange=0,
537: geom=[xsize,ysize] (LIST),
538: wname=name (STRING)]
539: */
540: stream=validate_ox_plot_stream(stream);
1.2 noro 541: STOZ(stream,s_id);
1.1 noro 542: if(!geom ){
1.2 noro 543: STOZ(300,w300);
1.1 noro 544: MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
545: }
546: if(plot_by_bigfloat)
1.2 noro 547: STOZ(plot_by_bigfloat,prec);
1.1 noro 548: else
549: prec = 0;
550: if(is_memory ){
551: MKSTR(fname,MEMORY_PLOT);
552: arg=mknode(8,s_id,fname,func,xrange,NULLP,NULLP,geom,prec);
553: Pox_rpc(arg,&t);
554: arg=mknode(1,s_id);
555: Pox_pop_cmo(arg,rp);
556: } else {
557: MKSTR(fname,fn);
558: arg=mknode(9,s_id,fname,func,xrange,NULLP,NULLP,geom,wname,prec);
559: Pox_rpc(arg,&t);
560: *rp=(Obj)s_id;
561: }
562: }
563:
564: #define Pi 3.14159265358979323846264
565:
566: void Ppolarplot(NODE arg,Z *rp){
567: Z m2,p2,w300,s_id;
568: NODE defrange,n,n0;
569: LIST zrange,range[1],geom,list;
570: VL vl,vl0;
571: V v[1],av[1];
572: int stream,ri,i;
573: P poly,var;
574: STRING fname,wname;
575: Real pi2;
576: Obj t;
577:
578: MKReal(2*Pi,pi2);MKNODE(n,pi2,0); MKNODE(defrange,0,n);
579: poly=0;vl=0;geom=0;wname=0;stream=-1;ri=0;v[0]=0;
580: for(;arg;arg=NEXT(arg)){
581: if(!BDY(arg)) stream=0;
582: else switch(OID(BDY(arg))){
583: case O_P: case O_R://formula
584: poly=(P)BDY(arg);
585: get_vars_recursive((Obj)poly,&vl);
586: for(vl0=vl,i=0;vl0;vl0=NEXT(vl0))
1.3 ! noro 587: if(vl0->v->attr==(pointer)V_IND) {
1.1 noro 588: if(i>=1)error("polarplot : invalid argument");
1.3 ! noro 589: else v[i++]=vl0->v;
! 590: }
1.1 noro 591: if(i!=1)error("polarplot : invalid argument");
592: break;
593: case O_LIST://range,geomerty
594: list=(LIST)BDY(arg);
595: if(OID(BDY(BDY(list)))==O_P)
596: if(ri>0)error("polarplot : invalid argument");
597: else range[ri++]=list;
598: else geom=list;
599: break;
600: case O_N:
1.2 noro 601: stream=ZTOS((Q)BDY(arg));
1.1 noro 602: break;
603: case O_STR://wname
604: wname=(STRING)BDY(arg);
605: break;
606: default:
607: error("polarplot : invalid argument");
608: break;
609: }
610: }
611: //formular check
612: if(!poly)error("polarplot : invalid argument");
613: switch (ri){
614: case 0:
615: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(zrange,n);
616: break;
617: case 1:
618: av[0]=VR((P)BDY(BDY(range[0])));
619: if(v[0]==av[0]) zrange = range[0];
620: else error("polarplot : invalid argument");
621: break;
622: default:
623: error("polarplot : cannot happen");
624: break;
625: }
626: stream=validate_ox_plot_stream(stream);
1.2 noro 627: STOZ(stream,s_id);
1.1 noro 628: if(!geom){
1.2 noro 629: STOZ(300,w300);
1.1 noro 630: MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
631: }
632: MKSTR(fname,POLARPLOT);
633: arg=mknode(8,s_id,fname,poly,NULLP,NULLP,zrange,geom,wname);
634: Pox_rpc(arg,&t);
635: *rp=s_id;
636: }
637:
638: void Pplotover(NODE arg,Obj *rp){
639: Q s_id,w_id,color;
640: P poly;
641: STRING fname;
642: Obj t;
643: poly=(P)ARG0(arg);
644: s_id=(Q)ARG1(arg);
645: w_id=(Q)ARG2(arg);
646: if(argc(arg)==4)color=(Q)ARG3(arg);
647: else color=0;
648: MKSTR(fname,PLOTOVER);
649: arg=mknode(5,s_id,fname,w_id,poly,color);
650: Pox_rpc(arg,&t);
651: *rp=(Obj)s_id;
652: }
653:
654: void Pdrawcircle(NODE arg,Obj *rp){
655: Q s_id,index;
656: Obj x,y,r,c,t;
657: STRING fname;
658: NODE n;
659: LIST pos;
660:
661: x=(Obj)ARG0(arg);
662: y=(Obj)ARG1(arg);
663: r=(Obj)ARG2(arg);
664: c=(Obj)ARG3(arg);
665: s_id=(Q)ARG4(arg);
666: index=(Q)ARG5(arg);
667: MKSTR(fname,DRAWCIRCLE);
668: n=mknode(3,x,y,r,c);
669: MKLIST(pos,n);
670: arg=mknode(5,s_id,fname,index,pos,c);
671: Pox_rpc(arg,&t);
672: *rp=(Obj)s_id;
673: }
674:
675: void Pdraw_obj(NODE arg,Obj *rp){
676: static STRING fname;
677: Q s_id,index;
678: LIST obj;
679: Obj t;
680:
681: if(!fname)MKSTR(fname,DRAW_OBJ);
682: s_id=(Q)ARG0(arg);
683: index=(Q)ARG1(arg);
684: obj=(LIST)ARG2(arg);
685: // ARG3(arg)=color
686: if(argc(arg)==4) arg=mknode(5,s_id,fname,index,obj,ARG3(arg));
687: else arg=mknode(4,s_id,fname,index,obj);
688: Pox_cmo_rpc(arg,&t);
689: *rp=(Obj)s_id;
690: }
691:
692: void Pdraw_string(NODE arg,Obj *rp){
693: static STRING fname;
694: STRING str;
695: Q s_id,index;
696: LIST pos;
697: Obj t;
698:
699: if(!fname)MKSTR(fname,DRAW_STRING);
700: s_id=(Q)ARG0(arg);
701: index=(Q)ARG1(arg);
702: pos=(LIST)ARG2(arg);
703: str=(STRING)ARG3(arg);
704: // ARG4(arg)=color
705: if(argc(arg)==5) arg=mknode(6,s_id,fname,index,pos,str,ARG4(arg));
706: else arg=mknode(5,s_id,fname,index,pos,str);
707: Pox_cmo_rpc(arg,&t);
708: *rp=(Obj)s_id;
709: }
710:
711: void Pclear_canvas(NODE arg,Obj *rp){
712: static STRING fname;
713: Q s_id,index;
714: Obj t;
715:
716: if(!fname) MKSTR(fname,CLEAR_CANVAS);
717: s_id=(Q)ARG0(arg);
718: index=(Q)ARG1(arg);
719: arg=mknode(3,s_id,fname,index);
720: Pox_cmo_rpc(arg,&t);
721: *rp=(Obj)s_id;
722: }
723: //****************************ifplotNG
724: /*
725: * name ifplot,ineqn,ineqnor,ineqnand,ineqnxor,conplot
726: * type
727: * D:sign character using double
728: * Q:sign character use rational
729: * B:Boundary character use sturm theorem
730: */
731: void ListCheck(char * head,LIST list){
732: int i;
733: NODE n;
734: if(!list){
735: printf("%s zero \n",head);
736: return;
737: }
738: for(i=0,n=(NODE)BDY(list);n;i++,n=NEXT(n));
739: printf("%s length %d\n",head,i);
740: for(i=0,n=(NODE)BDY(list);n;i++,n=NEXT(n)){
741: if(!BDY(n))printf("%d 0\n",i);
742: else if(OID(BDY(n))==O_P) printf("%d poly\n",i);
743: else if(OID(BDY(n))==O_R) printf("%d real\n",i);
1.3 ! noro 744: else if(OID(BDY(n))==O_N) printf("%d %ld\n",i,ZTOS((Q)BDY(n)));
1.1 noro 745: }
746: }
747:
748: void PifplotD(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTD,rp);}
749: void PifplotQ(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTQ,rp);}
750: void PifplotB(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTB,rp);}
751:
752: void PconplotD(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTD,rp);}
753: void PconplotQ(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTQ,rp);}
754: void PconplotB(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTB,rp);}
755:
756: void PineqnD(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQND,rp);}
757: void PineqnQ(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQNQ,rp);}
758: void PineqnB(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQNB,rp);}
759:
760: #if defined(INTERVAL)
761: void Pitvifplot(NODE arg,Obj *rp){ifplot_mainNG(arg,ITVIFPLOT,rp);}
762: #endif
763:
764: void PineqnorD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDOR,rp);}
765: void PineqnorQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQOR,rp);}
766: void PineqnorB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBOR,rp);}
767:
768: void PineqnandD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDAND,rp);}
769: void PineqnandQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQAND,rp);}
770: void PineqnandB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBAND,rp);}
771:
772: void PineqnxorD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDXOR,rp);}
773: void PineqnxorQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQXOR,rp);}
774: void PineqnxorB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBXOR,rp);}
775:
776: void PplotoverD(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERD,rp);}
777: void PplotoverQ(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERQ,rp);}
778: void PplotoverB(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERB,rp);}
779:
780: void Pobj_cp(NODE arg,Obj *rp){
781: //copy canvas
782: //1:and,3:copy,6:xor,7:or
783: Q sysid,index_A,index_B,op_code;
784: STRING fname;
785: Obj t;
786: sysid=(Q)ARG0(arg);
787: index_A=(Q)ARG1(arg);
788: index_B=(Q)ARG2(arg);
789: op_code=(Q)ARG3(arg);
790: MKSTR(fname,OBJ_CP);
791: arg=mknode(5,sysid,fname,index_A,index_B,op_code);
792: Pox_rpc(arg,&t);
793: *rp=(Obj)sysid;
794: }
795:
796: void PpolarplotD(NODE arg,Obj *rp){
797: Z m2,p2,w300,defstep,s_id,color;
798: NODE defrange,n,n0,n1,n2;
799: LIST range,geom,list[2];
800: VL vl,vl0;
801: V v[1],av;
802: int stream,ri,i,len,iNo,lNo,vNo,sNo,pfine,findG;
803: P poly,var;
804: STRING fname,wname;
805: Real pi2;
806: Obj t,frst,sec,thr;
807: char ebuf[BUFSIZ];
808:
809: iNo=lNo=sNo=findG=0;pfine=TRUE;
810: poly=0;vl=0;geom=0;wname=0;color=0;stream=-1;ri=0;v[0]=0;
811: for(;arg;arg=NEXT(arg)){
812: if(!BDY(arg)) iNo++;
813: else switch(OID(BDY(arg))){
814: case O_P: case O_R://formular
815: poly=(P)BDY(arg);
816: get_vars_recursive((Obj)poly,&vl);
817: for(vl0=vl,vNo=0;vl0;vl0=NEXT(vl0)){
818: if(vl0->v->attr==(pointer)V_IND){
819: if(vNo>=1){
820: sprintf(ebuf,"%s : invalaid argument",POLARPLOT);
821: error(ebuf);
822: } else v[vNo++]=vl0->v;
823: }
824: }
825: if(vNo!=1){
826: sprintf(ebuf,"%s : only uni-variate formular",POLARPLOT);
827: error(ebuf);
828: }
829: break;
830: case O_N://color,id,idx,division
831: switch (iNo){
832: case 0://color arg
833: color=(Z)BDY(arg);
834: iNo++;
835: break;
836: case 1://stream arg
1.2 noro 837: stream=ZTOS((Q)BDY(arg));
1.1 noro 838: iNo++;
839: break;
840: default://error
841: sprintf(ebuf,"%s : invalid number arguments",POLARPLOT);
842: error(ebuf);
843: break;
844: }
845: break;
846: case O_LIST://range,geomerty
847: if(lNo<2)list[lNo++]=(LIST)BDY(arg);
848: else {
849: sprintf(ebuf,"%s : invalid list argument",POLARPLOT);
850: error(ebuf);
851: }
852: break;
853: case O_STR://wname
854: wname=(STRING)BDY(arg);
855: sNo++;
856: break;
857: default:
858: break;
859: }
860: }
861: //formular check
862: if(!poly){
863: sprintf(ebuf,"%s : invalid plot argument",POLARPLOT);
864: error(ebuf);
865: }
866: //vars check
867: get_vars_recursive((Obj)poly,&vl);
868: for(vl0=vl,vNo=0;vl0;vNo++,vl0=NEXT(vl0)){
869: if(vl0->v->attr==(pointer)V_IND){
870: if(vNo>=2){
871: sprintf(ebuf,"%s : invalid plot argument",POLARPLOT);
872: error(ebuf);
873: } else v[vNo]=vl0->v;
874: }
875: }
876: //list check
877: for(i=0;i<lNo;i++){
878: if(OID(BDY(BDY(list[i])))!=O_P){
879: // list first value is number (geometry)
880: for(len=0,n=(NODE)BDY(list[i]);n;len++,n=NEXT(n)){
881: if(len==0) frst=BDY(n);
882: else if(len==1) sec=BDY(n);
883: else {
884: sprintf(ebuf,"%s : geometry list too long",POLARPLOT);
885: error(ebuf);
886: }
887: }
888: if(len!=2){
889: sprintf(ebuf,"%s : geometry requierd 2 numbers", POLARPLOT);
890: error(ebuf);
891: } else geom=list[i];
892: } else {
893: //list first value is var (range)
894: av=VR((P)BDY(BDY(list[i])));
895: if(v[0]==av)range=list[i];
896: else {
897: sprintf(ebuf,"%s : invalid list length",POLARPLOT);
898: error(ebuf);
899: }
900: }
901: }
902: // set default
903: if(!range){
1.2 noro 904: STOZ(DEFAULTPOLARSTEP,defstep);MKReal(2*Pi,pi2);MKV(v[0],var);
1.1 noro 905: MKNODE(n,defstep,0);MKNODE(n1,pi2,n);MKNODE(n2,0,n1);
906: MKNODE(defrange,var,n2);MKLIST(range,defrange);
907: }
908: if(!geom){
1.2 noro 909: STOZ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
1.1 noro 910: }
911: stream=validate_ox_plot_stream(stream);
1.2 noro 912: STOZ(stream,s_id);
1.1 noro 913: MKSTR(fname,POLARPLOTD);
914: arg=mknode(7,s_id,fname,poly,color,range,geom,wname);
915: Pox_rpc(arg,&t);
916: *rp=(Obj)s_id;
917: }
918:
919: void ifplot_mainNG(NODE arg,char *fn,Obj *rp){
920: Z m2,p2,w300,mxgc,s_id,color;
921: NODE defrange,n,n0,n1,n2;
922: P poly,var;
923: VL vl,vl0;
924: V v[2],av;
925: LIST xrange,yrange,zrange,geom,range[2],list[4];
926: int stream,ri,i,j,sign,llen,len,iNo,lNo,vNo,sNo,pfine,findG;
927: STRING fname,wname;
928: Obj t,frst,sec,thr;
929: char ebuf[BUFSIZ];
930:
931: iNo=lNo=sNo=findG=0;pfine=TRUE;
932: poly=0;stream=-1;wname=0;color=0;stream=0;
1.2 noro 933: STOZ(-2,m2);STOZ(2,p2);MKNODE(n,p2,0);MKNODE(defrange,m2,n);
934: STOZ(MAXGC,mxgc);
1.1 noro 935: for(;arg;arg=NEXT(arg)){
936: if(!BDY(arg)) iNo++;
937: else switch(OID(BDY(arg))){
938: case O_P://formular
939: if(pfine){
940: poly=(P)BDY(arg);
941: pfine=FALSE;
942: } else {
943: sprintf(ebuf,"%s : to many plot arguments",fn);
944: error(ebuf);
945: }
946: break;
947: case O_N://color,id,idx,division
948: switch (iNo){
949: case 0: //color arg
950: color=(Z)BDY(arg);
951: iNo++;
952: break;
953: case 1: //stream arg
1.2 noro 954: stream=ZTOS((Q)BDY(arg));
1.1 noro 955: iNo++;
956: break;
957: default:
958: sprintf(ebuf,"%s : invalid number arguments",fn);
959: error(ebuf);
960: break;
961: }
962: break;
963: case O_LIST://xrange,yrange,zrange,geometry
964: if(lNo<4) list[lNo++]=(LIST)BDY(arg);
965: else {
966: sprintf(ebuf,"%s : invalid list argument",fn);
967: error(ebuf);
968: }
969: break;
970: case O_STR://wname
971: wname=(STRING)BDY(arg);
972: sNo++;
973: break;
974: default:
975: break;
976: }
977: }
978: // formular check
979: if(!poly){
980: sprintf(ebuf,"%s : invalid plot argument",fn);
981: error(ebuf);
982: }
983: // vars check
984: get_vars_recursive((Obj)poly,&vl);
985: for(vl0=vl,vNo=0;vl0;vl0=NEXT(vl0)){
986: if(vl0->v->attr==(pointer)V_IND){
987: if(vNo>=2){
988: sprintf(ebuf,"%s : invalid plot argument",fn);
989: error(ebuf);
990: } else v[vNo++]=vl0->v;
991: }
992: }
993: //list check
994: xrange=yrange=zrange=geom=0;frst=sec=thr=0;
995: for(i=0;i<lNo;i++){
996: for(llen=0,n=(NODE)BDY(list[i]);n;llen++,n=NEXT(n));
997: if(llen>4){
998: sprintf(ebuf,"%s : invalid list length",fn);
999: error(ebuf);
1000: }
1001: if(OID(BDY(BDY(list[i])))!=O_P){
1002: // First list value is number
1003: for(len=0,n=(NODE)BDY(list[i]);n;len++,n=NEXT(n)){
1004: if(len==0)frst=BDY(n);
1005: else if(len==1)sec=BDY(n);
1006: else thr=BDY(n);
1007: }
1008: switch(len){
1009: case 2:
1010: if(!strcmp(fn,CONPLOT)){
1011: if(thr==0)thr=(Obj)mxgc;
1012: MKNODE(n,thr,0);MKNODE(n1,sec,n);MKNODE(n2,frst,n1);MKLIST(zrange,n2);
1013: } else geom=list[i];
1014: break;
1015: case 3:
1016: zrange=list[i];
1017: break;
1018: case 0:
1019: case 1:
1020: default:
1021: sprintf(ebuf,"%s : invalid list length",fn);
1022: error(ebuf);
1023: break;
1024: }
1025: } else {
1026: //xrange,yrange
1027: av=VR((P)BDY(BDY(list[i])));
1028: if(v[0]==av)xrange=list[i];
1029: else if(v[1]==av)yrange=list[i];
1030: else {
1031: MKLIST(zrange,NEXT(BDY(list[i])));
1032: }
1033: }
1034: }
1035: //set default
1036: if(!xrange){
1037: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
1038: }
1039: if(!yrange){
1040: MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n);
1041: }
1042: if(!geom){
1.2 noro 1043: STOZ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
1.1 noro 1044: }
1045: if(!(strcmp(fn,CONPLOTD)&strcmp(fn,CONPLOTQ)&strcmp(fn,CONPLOTB))&!zrange){
1046: MKNODE(n,mxgc,0);MKNODE(n1,m2,n);MKNODE(n2,m2,n1);MKLIST(zrange,n2);
1047: }
1048: /*new ifplot in ox_plot requires
1049: [s_id (Q),
1050: formula (Obj),
1051: color (Q),
1052: geom=[xsize,ysize] (LIST optional),
1053: xrange=[x,xmin,xmax] (LIST optional),
1054: yrange=[y,ymin,ymax] (LIST optional),
1055: zrange=[zmin,zmax,zstep] (LIST optional),
1056: wname=name (STRING optional)],
1057: itvstep (Q) if ITVIFPLOT */
1058: stream=validate_ox_plot_stream(stream);
1.2 noro 1059: STOZ(stream,s_id);
1.1 noro 1060: MKSTR(fname,fn);
1061: arg=mknode(9,s_id,fname,poly,color,xrange,yrange,zrange,geom,wname);
1062: Pox_rpc(arg,&t);
1063: *rp=(Obj)s_id;
1064: }
1065:
1066: void plotover_mainNG(NODE arg,char *fn,Obj *rp){
1067: Q s_id,w_id,color;
1068: P poly;
1069: STRING fname;
1070: Obj t;
1071: int iNo,pfine,sfine;
1072: char ebuf[BUFSIZ];
1073:
1074: pfine=sfine=TRUE;
1075: iNo=0;poly=0;color=s_id=w_id=0;
1076: for(;arg;arg=NEXT(arg)){
1077: if(!BDY(arg)) iNo++;
1078: else switch(OID(BDY(arg))){
1079: case O_P://formular
1080: if(pfine){
1081: poly=(P)BDY(arg);
1082: pfine=FALSE;
1083: } else {
1084: sprintf(ebuf,"%s : to many plot arguments",fn);
1085: error(ebuf);
1086: }
1087: break;
1088: case O_N://color,s_id,w_id
1089: switch(iNo){
1090: case 0://color arg
1091: color=(Q)BDY(arg);
1092: iNo++;
1093: break;
1094: case 1://stream arg
1095: s_id=(Q)BDY(arg);
1096: iNo++;
1097: break;
1098: case 2://window arg
1099: w_id=(Q)BDY(arg);
1100: iNo++;
1101: break;
1102: default://error
1103: sprintf(ebuf,"%s : to many numbers",fn);
1104: error(ebuf);
1105: break;
1106: }
1107: break;
1108: default:
1109: sprintf(ebuf,"%s : arguments type miss match",fn);
1110: error(ebuf);
1111: }
1112: }
1113: MKSTR(fname,fn);
1114: //[s_id (Q), w_id (Q), formula (Obj), color (Q)]
1115: arg=mknode(5,s_id,fname,w_id,poly,color);
1116: Pox_rpc(arg,&t);
1117: *rp=(Obj)s_id;
1118: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>