Annotation of OpenXM_contrib2/asir2000/plot/plotf.c, Revision 1.34
1.4 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
1.5 noro 26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
1.4 noro 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.34 ! noro 48: * $OpenXM: OpenXM_contrib2/asir2000/plot/plotf.c,v 1.33 2017/09/04 01:57:53 noro Exp $
1.4 noro 49: */
1.1 noro 50: #include "ca.h"
51: #include "parse.h"
52: #include "ox.h"
53: #include "ifplot.h"
54:
1.26 saito 55: int validate_ox_plot_stream(int);
1.24 saito 56: void ListCheck(char *,LIST);
1.26 saito 57: void Pplot(NODE,Obj *);
58: void Ppolarplot(NODE,Obj *);
59: void Pobj_cp(NODE,Obj *),Parrayplot(NODE,Obj*),Pdrawcircle(NODE,Obj*);
1.24 saito 60: void Pifplot(NODE,Obj *),Pconplot(NODE,Obj *),Pplotover(NODE,Obj *);
1.26 saito 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 *);
1.24 saito 66:
67: void Popen_canvas(NODE,Obj *),Pclear_canvas(NODE,Obj *),Pdraw_obj(NODE,Obj *);
68: void Pdraw_string(NODE,Obj *);
1.26 saito 69: void Pox_rpc(NODE,Obj *), Pox_cmo_rpc(NODE,Obj *);
1.1 noro 70:
1.24 saito 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 *);
1.29 saito 81: void PpolarplotD(NODE,Obj *);
1.24 saito 82: void PplotoverD(NODE,Obj *),PplotoverQ(NODE,Obj *),PplotoverB(NODE,Obj *);
1.26 saito 83: void ifplot_mainNG(NODE,char *,Obj *);
84: void conplot_mainNG(NODE,char *,Obj *);
85: void plotover_mainNG(NODE,char *,Obj *);
1.34 ! noro 86:
1.24 saito 87: struct ftab plot_tab[]={
1.34 ! noro 88: {PLOT,Pplot,-7},
1.22 saito 89: #if defined(INTERVAL)
1.34 ! noro 90: {ITVIFPLOT,Pitvifplot,-8},
1.24 saito 91: #endif
1.34 ! noro 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},
1.1 noro 132: };
1.26 saito 133: char *pfn[]={
1.34 ! noro 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};
1.26 saito 143: /*
1.34 ! noro 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
1.26 saito 154: */
155: int modeNO(char *fn){
1.34 ! noro 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;
1.26 saito 160: }
1.1 noro 161:
1.24 saito 162: void Popen_canvas(NODE arg,Obj *rp){
1.34 ! noro 163: Q 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:
! 177: stream=QTOS((Q)BDY(arg));
! 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);
! 187: STOQ(stream,s_id);
! 188: if(!geom){
! 189: STOQ(300,w300);
! 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;
1.6 noro 198: }
199:
1.26 saito 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);}
1.18 noro 202:
1.26 saito 203: void ifplot_main(NODE arg,int is_memory,char *fn,Obj *rp){
1.34 ! noro 204: Q m2,p2,w300,s_id;
! 205: NODE defrange;
! 206: LIST xrange,yrange,zrange,range[2],list,geom;
! 207: VL vl,vl0;
! 208: V v[2],av[2];
! 209: int stream,ri,i,sign;
1.32 noro 210: Obj poly;
1.34 ! noro 211: P var;
! 212: NODE n,n0;
! 213: STRING fname,wname;
! 214: Obj t;
1.32 noro 215: int found_f;
1.22 saito 216:
1.34 ! noro 217: STOQ(-2,m2);STOQ(2,p2);MKNODE(n,p2,0);MKNODE(defrange,m2,n);
! 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;
1.32 noro 220: found_f = 0;
1.34 ! noro 221: for(;arg;arg=NEXT(arg))
! 222: if(!BDY(arg)){
1.32 noro 223: if ( !found_f ) {
224: poly = 0;
225: found_f = 1;
226: } else stream=0;
1.34 ! noro 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: }
1.32 noro 238: found_f = 1;
1.34 ! noro 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 geom=list;
! 246: break;
! 247: case O_N:
1.32 noro 248: if ( !found_f ) {
249: poly = (Obj)BDY(arg);
250: found_f = 1;
251: } else stream=QTOS((Q)BDY(arg));
252: break;
1.34 ! noro 253: case O_STR:
! 254: wname=(STRING)BDY(arg);break;
! 255: default:
! 256: error("ifplot : invalid argument");break;
! 257: }
! 258: if(!found_f) error("ifplot : invalid argument");
! 259: switch(ri){
! 260: case 0:
! 261: if(!v[1]) error("ifplot : please specify all variables");
! 262: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
! 263: MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n);
! 264: break;
! 265: case 1:
! 266: if(!v[1]) error("ifplot : please specify all variables");
! 267: av[0]=VR((P)BDY(BDY(range[0])));
! 268: if(!poly || NUM(poly) || v[0]==av[0]){
! 269: xrange=range[0];
! 270: MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n);
! 271: } else if(v[1]==av[0]){
! 272: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
! 273: yrange=range[0];
! 274: } else error("ifplot : invalid argument");
! 275: break;
! 276: case 2:
! 277: av[0]=VR((P)BDY(BDY(range[0])));
! 278: av[1]=VR((P)BDY(BDY(range[1])));
! 279: if(!poly || NUM(poly) || (((v[0]==av[0])&&(!v[1]||v[1]==av[1]))||
! 280: ((v[0]==av[1])&&(!v[1]||v[1]==av[0])))){
! 281: xrange=range[0];yrange=range[1];
! 282: } else error("ifplot : invalid argument");
! 283: break;
! 284: default:
! 285: error("ifplot : cannot happen");break;
! 286: }
! 287: /* ifplot in ox_plot requires
! 288: [s_id (Q),
! 289: formula (Obj),
! 290: xrange=[x,xmin,xmax] (LIST),
! 291: yrange=[y,ymin,ymax] (LIST),
! 292: zrange=0,
! 293: geom=[xsize,ysize] (LIST),
! 294: wname=name (STRING)]
! 295: */
! 296: stream=validate_ox_plot_stream(stream);
! 297: STOQ(stream,s_id);
! 298: if(!geom){
! 299: STOQ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
! 300: }
! 301: if(is_memory){
! 302: MKSTR(fname,MEMORY_PLOT);
! 303: arg=mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom);
! 304: Pox_rpc(arg,&t);
! 305: arg=mknode(1,s_id);
! 306: Pox_pop_cmo(arg,rp);
! 307: } else {
! 308: MKSTR(fname,fn);
! 309: arg=mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname);
! 310: Pox_rpc(arg,&t);
! 311: *rp=(Obj)s_id;
! 312: }
1.22 saito 313: }
314:
1.24 saito 315: void Pconplot(NODE arg,Obj *rp){conplot_main(arg, 0, rp);}
316: void Pmemory_conplot(NODE arg,Obj *rp){conplot_main(arg,1,rp);}
1.22 saito 317:
1.24 saito 318: void conplot_main(NODE arg,int is_memory,Obj *rp){
1.34 ! noro 319: Q m2,p2,w300,s_id;
! 320: NODE defrange;
! 321: LIST xrange,yrange,zrange,range[3],list,geom;
! 322: VL vl,vl0;
! 323: V v[2],av[2];
! 324: int stream,ri,i;
! 325: P poly;
! 326: P var;
! 327: NODE n,n0;
! 328: STRING fname,wname;
! 329: Obj t;
! 330:
! 331: STOQ(-2,m2); STOQ(2,p2);
! 332: MKNODE(n,p2,0); MKNODE(defrange,m2,n);
! 333: poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
! 334: v[0] = v[1] = 0;
! 335: for ( ; arg; arg = NEXT(arg) )
! 336: if ( !BDY(arg) )
! 337: stream = 0;
! 338: else
! 339: switch ( OID(BDY(arg)) ) {
! 340: case O_P:
! 341: poly = (P)BDY(arg);
! 342: get_vars_recursive((Obj)poly,&vl);
! 343: for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
! 344: if ( vl0->v->attr == (pointer)V_IND )
! 345: if ( i >= 2 )
! 346: error("ifplot : invalid argument");
! 347: else
! 348: v[i++] = vl0->v;
! 349: break;
! 350: case O_LIST:
! 351: list = (LIST)BDY(arg);
! 352: if ( OID(BDY(BDY(list))) == O_P )
! 353: if ( ri > 2 )
! 354: error("ifplot : invalid argument");
! 355: else
! 356: range[ri++] = list;
! 357: else
! 358: geom = list;
! 359: break;
! 360: case O_N:
! 361: stream = QTOS((Q)BDY(arg)); break;
! 362: case O_STR:
! 363: wname = (STRING)BDY(arg); break;
! 364: default:
! 365: error("ifplot : invalid argument"); break;
! 366: }
! 367: if ( !poly )
! 368: error("ifplot : invalid argument");
! 369: switch ( ri ) {
! 370: case 0:
! 371: if ( !v[1] )
! 372: error("ifplot : please specify all variables");
! 373: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
! 374: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
! 375: MKNODE(n,0,defrange); MKLIST(zrange,n);
! 376: break;
! 377: case 1:
! 378: if ( !v[1] )
! 379: error("ifplot : please specify all variables");
! 380: av[0] = VR((P)BDY(BDY(range[0])));
! 381: if ( v[0] == av[0] ) {
! 382: xrange = range[0];
! 383: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
! 384: MKNODE(n,0,defrange); MKLIST(zrange,n);
! 385: } else if ( v[1] == av[0] ) {
! 386: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
! 387: yrange = range[0];
! 388: MKNODE(n,0,defrange); MKLIST(zrange,n);
! 389: } else {
! 390: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
! 391: MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
! 392: zrange = range[0];
! 393: }
! 394: break;
! 395: case 2: case 3:
! 396: av[0] = VR((P)BDY(BDY(range[0])));
! 397: av[1] = VR((P)BDY(BDY(range[1])));
! 398: if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
! 399: ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
! 400: xrange = range[0]; yrange = range[1];
! 401: if ( ri == 3 )
! 402: zrange = range[2];
! 403: else {
! 404: MKNODE(n,0,defrange); MKLIST(zrange,n);
! 405: }
! 406: } else
! 407: error("ifplot : invalid argument");
! 408: break;
! 409: default:
! 410: error("ifplot : cannot happen"); break;
! 411: }
! 412: /* conplot in ox_plot requires
! 413: [s_id (Q),
! 414: formula (Obj),
! 415: xrange=[x,xmin,xmax] (LIST),
! 416: yrange=[y,ymin,ymax] (LIST),
! 417: zrange=[z,zmin,zmax] (LIST),
! 418: geom=[xsize,ysize] (LIST),
! 419: wname=name (STRING)]
! 420: */
! 421:
! 422: stream = validate_ox_plot_stream(stream);
! 423: STOQ(stream,s_id);
! 424: if ( !geom ) {
! 425: STOQ(300,w300);
! 426: MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
! 427: }
! 428: if ( is_memory ) {
! 429: MKSTR(fname,"memory_plot");
! 430: arg = mknode(7,s_id,fname,poly,xrange,yrange,zrange,geom);
! 431: Pox_rpc(arg,&t);
! 432: arg = mknode(1,s_id);
! 433: Pox_pop_cmo(arg,rp);
! 434: } else {
! 435: MKSTR(fname,CONPLOT);
! 436: arg = mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname);
! 437: Pox_rpc(arg,&t);
! 438: *rp = (Obj)s_id;
! 439: }
1.18 noro 440: }
441:
1.26 saito 442: void Pplot(NODE arg,Obj *rp){plot_main(arg,0,PLOT,rp);}
443: void Pmemory_plot(NODE arg,Obj *rp){plot_main(arg,1,PLOT,rp);}
1.1 noro 444:
1.33 noro 445: int plot_by_bigfloat;
446:
1.26 saito 447: void plot_main(NODE arg,int is_memory,char *fn,Obj *rp){
1.34 ! noro 448: Q m2,p2,w300,s_id;
! 449: NODE defrange;
! 450: LIST xrange,range[1],list,geom;
! 451: VL vl,vl0;
! 452: V v[1],av[1];
! 453: int stream,ri,i,found_f;
! 454: Obj func;
! 455: P var;
! 456: NODE n,n0;
! 457: STRING fname,wname;
! 458: Obj t;
1.33 noro 459: Q prec;
1.1 noro 460:
1.34 ! noro 461: STOQ(-2,m2);STOQ(2,p2);
! 462: MKNODE(n,p2,0);MKNODE(defrange,m2,n);
! 463: func=0;vl=0;geom=0;wname=0;stream=-1;ri=0;
! 464: v[0]=0;
1.31 noro 465: found_f = 0;
1.34 ! noro 466: for(;arg;arg=NEXT(arg) ) {
! 467: if(!BDY(arg) )
1.32 noro 468: if ( !found_f ) {
469: makevar("x",&var);
470: v[0] = VR(var);
471: found_f = 1;
472: } else
1.34 ! noro 473: stream=0;
! 474: else
! 475: switch ( OID(BDY(arg)) ){
! 476: case O_P: case O_R:
1.32 noro 477: func = (Obj)BDY(arg);
1.34 ! noro 478: get_vars_recursive(func,&vl);
! 479: for(vl0=vl, i=0;vl0;vl0=NEXT(vl0) ){
! 480: if(vl0->v->attr==(pointer)V_IND ){
! 481: if(i >= 1 ) error("plot : function must be univariate");
! 482: else v[i++]=vl0->v;
! 483: }
! 484: }
1.31 noro 485: found_f = 1;
1.34 ! noro 486: break;
! 487: case O_LIST:
! 488: list=(LIST)BDY(arg);
! 489: if(OID(BDY(BDY(list)))==O_P ){
! 490: if(ri > 0 ) error("plot : too many intervals");
! 491: else range[ri++]=list;
! 492: } else geom=list;
! 493: break;
! 494: case O_N:
1.31 noro 495: if ( !found_f ) {
1.32 noro 496: func = (Obj)BDY(arg);
1.31 noro 497: makevar("x",&var);
498: v[0] = VR(var);
1.32 noro 499: found_f = 1;
1.31 noro 500: } else
1.34 ! noro 501: stream=QTOS((Q)BDY(arg));
1.31 noro 502: break;
1.34 ! noro 503: case O_STR:
! 504: wname=(STRING)BDY(arg);break;
! 505: default:
! 506: error("plot : invalid argument");break;
! 507: }
! 508: }
! 509: if(!found_f )
! 510: error("plot : invalid argument");
! 511: switch ( ri ){
! 512: case 0:
! 513: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
! 514: break;
! 515: case 1:
! 516: av[0]=VR((P)BDY(BDY(range[0])));
! 517: if(!func || NUM(func) || v[0]==av[0] )
! 518: xrange=range[0];
! 519: else
! 520: error("plot : invalid argument");
! 521: break;
! 522: default:
! 523: error("plot : cannot happen");break;
! 524: }
! 525: /* conplot in ox_plot requires
! 526: [s_id (Q),
! 527: formula (Obj),
! 528: xrange=[x,xmin,xmax] (LIST),
! 529: yrange=0,
! 530: zrange=0,
! 531: geom=[xsize,ysize] (LIST),
! 532: wname=name (STRING)]
! 533: */
! 534: stream=validate_ox_plot_stream(stream);
! 535: STOQ(stream,s_id);
! 536: if(!geom ){
! 537: STOQ(300,w300);
! 538: MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
! 539: }
1.33 noro 540: if(plot_by_bigfloat)
541: STOQ(plot_by_bigfloat,prec);
542: else
543: prec = 0;
1.34 ! noro 544: if(is_memory ){
! 545: MKSTR(fname,MEMORY_PLOT);
! 546: arg=mknode(8,s_id,fname,func,xrange,NULLP,NULLP,geom,prec);
! 547: Pox_rpc(arg,&t);
! 548: arg=mknode(1,s_id);
! 549: Pox_pop_cmo(arg,rp);
! 550: } else {
! 551: MKSTR(fname,fn);
! 552: arg=mknode(9,s_id,fname,func,xrange,NULLP,NULLP,geom,wname,prec);
! 553: Pox_rpc(arg,&t);
! 554: *rp=(Obj)s_id;
! 555: }
1.15 noro 556: }
557:
558: #define Pi 3.14159265358979323846264
559:
1.24 saito 560: void Ppolarplot(NODE arg,Obj *rp){
1.34 ! noro 561: Q m2,p2,w300,s_id;
! 562: NODE defrange,n,n0;
! 563: LIST zrange,range[1],geom,list;
! 564: VL vl,vl0;
! 565: V v[1],av[1];
! 566: int stream,ri,i;
! 567: P poly,var;
! 568: STRING fname,wname;
! 569: Real pi2;
! 570: Obj t;
! 571:
! 572: MKReal(2*Pi,pi2);MKNODE(n,pi2,0); MKNODE(defrange,0,n);
! 573: poly=0;vl=0;geom=0;wname=0;stream=-1;ri=0;v[0]=0;
! 574: for(;arg;arg=NEXT(arg)){
! 575: if(!BDY(arg)) stream=0;
! 576: else switch(OID(BDY(arg))){
! 577: case O_P: case O_R://formula
! 578: poly=(P)BDY(arg);
! 579: get_vars_recursive((Obj)poly,&vl);
! 580: for(vl0=vl,i=0;vl0;vl0=NEXT(vl0))
! 581: if(vl0->v->attr==(pointer)V_IND)
! 582: if(i>=1)error("polarplot : invalid argument");
! 583: else v[i++]=vl0->v;
! 584: if(i!=1)error("polarplot : invalid argument");
! 585: break;
! 586: case O_LIST://range,geomerty
! 587: list=(LIST)BDY(arg);
! 588: if(OID(BDY(BDY(list)))==O_P)
! 589: if(ri>0)error("polarplot : invalid argument");
! 590: else range[ri++]=list;
! 591: else geom=list;
! 592: break;
! 593: case O_N:
! 594: stream=QTOS((Q)BDY(arg));
! 595: break;
! 596: case O_STR://wname
! 597: wname=(STRING)BDY(arg);
! 598: break;
! 599: default:
! 600: error("polarplot : invalid argument");
! 601: break;
! 602: }
! 603: }
! 604: //formular check
! 605: if(!poly)error("polarplot : invalid argument");
! 606: switch (ri){
! 607: case 0:
! 608: MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(zrange,n);
! 609: break;
! 610: case 1:
! 611: av[0]=VR((P)BDY(BDY(range[0])));
! 612: if(v[0]==av[0]) zrange = range[0];
! 613: else error("polarplot : invalid argument");
! 614: break;
! 615: default:
! 616: error("polarplot : cannot happen");
! 617: break;
! 618: }
! 619: stream=validate_ox_plot_stream(stream);
! 620: STOQ(stream,s_id);
! 621: if(!geom){
! 622: STOQ(300,w300);
! 623: MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
! 624: }
! 625: MKSTR(fname,POLARPLOT);
! 626: arg=mknode(8,s_id,fname,poly,NULLP,NULLP,zrange,geom,wname);
! 627: Pox_rpc(arg,&t);
! 628: *rp=s_id;
1.1 noro 629: }
630:
1.24 saito 631: void Pplotover(NODE arg,Obj *rp){
1.34 ! noro 632: Q s_id,w_id,color;
! 633: P poly;
! 634: STRING fname;
! 635: Obj t;
! 636: poly=(P)ARG0(arg);
! 637: s_id=(Q)ARG1(arg);
! 638: w_id=(Q)ARG2(arg);
! 639: if(argc(arg)==4)color=(Q)ARG3(arg);
! 640: else color=0;
! 641: MKSTR(fname,PLOTOVER);
! 642: arg=mknode(5,s_id,fname,w_id,poly,color);
! 643: Pox_rpc(arg,&t);
! 644: *rp=(Obj)s_id;
1.1 noro 645: }
646:
1.24 saito 647: void Pdrawcircle(NODE arg,Obj *rp){
1.34 ! noro 648: Q s_id,index;
! 649: Obj x,y,r,c,t;
! 650: STRING fname;
! 651: NODE n;
! 652: LIST pos;
! 653:
! 654: x=(Obj)ARG0(arg);
! 655: y=(Obj)ARG1(arg);
! 656: r=(Obj)ARG2(arg);
! 657: c=(Obj)ARG3(arg);
! 658: s_id=(Q)ARG4(arg);
! 659: index=(Q)ARG5(arg);
! 660: MKSTR(fname,DRAWCIRCLE);
! 661: n=mknode(3,x,y,r,c);
! 662: MKLIST(pos,n);
! 663: arg=mknode(5,s_id,fname,index,pos,c);
! 664: Pox_rpc(arg,&t);
! 665: *rp=(Obj)s_id;
1.6 noro 666: }
667:
1.24 saito 668: void Pdraw_obj(NODE arg,Obj *rp){
1.34 ! noro 669: static STRING fname;
! 670: Q s_id,index;
! 671: LIST obj;
! 672: Obj t;
! 673:
! 674: if(!fname)MKSTR(fname,DRAW_OBJ);
! 675: s_id=(Q)ARG0(arg);
! 676: index=(Q)ARG1(arg);
! 677: obj=(LIST)ARG2(arg);
! 678: // ARG3(arg)=color
! 679: if(argc(arg)==4) arg=mknode(5,s_id,fname,index,obj,ARG3(arg));
! 680: else arg=mknode(4,s_id,fname,index,obj);
! 681: Pox_cmo_rpc(arg,&t);
! 682: *rp=(Obj)s_id;
1.12 noro 683: }
684:
1.24 saito 685: void Pdraw_string(NODE arg,Obj *rp){
1.34 ! noro 686: static STRING fname;
! 687: STRING str;
! 688: Q s_id,index;
! 689: LIST pos;
! 690: Obj t;
! 691:
! 692: if(!fname)MKSTR(fname,DRAW_STRING);
! 693: s_id=(Q)ARG0(arg);
! 694: index=(Q)ARG1(arg);
! 695: pos=(LIST)ARG2(arg);
! 696: str=(STRING)ARG3(arg);
! 697: // ARG4(arg)=color
! 698: if(argc(arg)==5) arg=mknode(6,s_id,fname,index,pos,str,ARG4(arg));
! 699: else arg=mknode(5,s_id,fname,index,pos,str);
! 700: Pox_cmo_rpc(arg,&t);
! 701: *rp=(Obj)s_id;
1.6 noro 702: }
703:
1.24 saito 704: void Pclear_canvas(NODE arg,Obj *rp){
1.34 ! noro 705: static STRING fname;
! 706: Q s_id,index;
! 707: Obj t;
! 708:
! 709: if(!fname) MKSTR(fname,CLEAR_CANVAS);
! 710: s_id=(Q)ARG0(arg);
! 711: index=(Q)ARG1(arg);
! 712: arg=mknode(3,s_id,fname,index);
! 713: Pox_cmo_rpc(arg,&t);
! 714: *rp=(Obj)s_id;
1.24 saito 715: }
716: //****************************ifplotNG
717: /*
718: * name ifplot,ineqn,ineqnor,ineqnand,ineqnxor,conplot
719: * type
720: * D:sign character using double
721: * Q:sign character use rational
722: * B:Boundary character use sturm theorem
723: */
724: void ListCheck(char * head,LIST list){
1.34 ! noro 725: int i;
! 726: NODE n;
! 727: if(!list){
! 728: printf("%s zero \n",head);
! 729: return;
! 730: }
! 731: for(i=0,n=(NODE)BDY(list);n;i++,n=NEXT(n));
! 732: printf("%s length %d\n",head,i);
! 733: for(i=0,n=(NODE)BDY(list);n;i++,n=NEXT(n)){
! 734: if(!BDY(n))printf("%d 0\n",i);
! 735: else if(OID(BDY(n))==O_P) printf("%d poly\n",i);
! 736: else if(OID(BDY(n))==O_R) printf("%d real\n",i);
! 737: else if(OID(BDY(n))==O_N) printf("%d %d\n",i,QTOS((Q)BDY(n)));
! 738: }
1.1 noro 739: }
740:
1.26 saito 741: void PifplotD(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTD,rp);}
742: void PifplotQ(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTQ,rp);}
743: void PifplotB(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTB,rp);}
1.24 saito 744:
1.26 saito 745: void PconplotD(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTD,rp);}
746: void PconplotQ(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTQ,rp);}
747: void PconplotB(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTB,rp);}
1.24 saito 748:
1.26 saito 749: void PineqnD(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQND,rp);}
750: void PineqnQ(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQNQ,rp);}
751: void PineqnB(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQNB,rp);}
1.24 saito 752:
753: #if defined(INTERVAL)
1.26 saito 754: void Pitvifplot(NODE arg,Obj *rp){ifplot_mainNG(arg,ITVIFPLOT,rp);}
1.24 saito 755: #endif
756:
1.26 saito 757: void PineqnorD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDOR,rp);}
758: void PineqnorQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQOR,rp);}
759: void PineqnorB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBOR,rp);}
760:
761: void PineqnandD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDAND,rp);}
762: void PineqnandQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQAND,rp);}
763: void PineqnandB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBAND,rp);}
764:
765: void PineqnxorD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDXOR,rp);}
766: void PineqnxorQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQXOR,rp);}
767: void PineqnxorB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBXOR,rp);}
768:
769: void PplotoverD(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERD,rp);}
770: void PplotoverQ(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERQ,rp);}
771: void PplotoverB(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERB,rp);}
1.24 saito 772:
1.29 saito 773: void Pobj_cp(NODE arg,Obj *rp){
1.34 ! noro 774: //copy canvas
! 775: //1:and,3:copy,6:xor,7:or
! 776: Q sysid,index_A,index_B,op_code;
! 777: STRING fname;
! 778: Obj t;
! 779: sysid=(Q)ARG0(arg);
! 780: index_A=(Q)ARG1(arg);
! 781: index_B=(Q)ARG2(arg);
! 782: op_code=(Q)ARG3(arg);
! 783: MKSTR(fname,OBJ_CP);
! 784: arg=mknode(5,sysid,fname,index_A,index_B,op_code);
! 785: Pox_rpc(arg,&t);
! 786: *rp=(Obj)sysid;
1.29 saito 787: }
788:
789: void PpolarplotD(NODE arg,Obj *rp){
1.34 ! noro 790: Q m2,p2,w300,defstep,s_id,color;
! 791: NODE defrange,n,n0,n1,n2;
! 792: LIST range,geom,list[2];
! 793: VL vl,vl0;
! 794: V v[1],av;
! 795: int stream,ri,i,len,iNo,lNo,vNo,sNo,pfine,findG;
! 796: P poly,var;
! 797: STRING fname,wname;
! 798: Real pi2;
! 799: Obj t,frst,sec,thr;
! 800: char ebuf[BUFSIZ];
! 801:
! 802: iNo=lNo=sNo=findG=0;pfine=TRUE;
! 803: poly=0;vl=0;geom=0;wname=0;color=0;stream=-1;ri=0;v[0]=0;
! 804: for(;arg;arg=NEXT(arg)){
! 805: if(!BDY(arg)) iNo++;
! 806: else switch(OID(BDY(arg))){
! 807: case O_P: case O_R://formular
! 808: poly=(P)BDY(arg);
! 809: get_vars_recursive((Obj)poly,&vl);
! 810: for(vl0=vl,vNo=0;vl0;vl0=NEXT(vl0)){
! 811: if(vl0->v->attr==(pointer)V_IND){
! 812: if(vNo>=1){
! 813: sprintf(ebuf,"%s : invalaid argument",POLARPLOT);
! 814: error(ebuf);
! 815: } else v[vNo++]=vl0->v;
! 816: }
! 817: }
! 818: if(vNo!=1){
! 819: sprintf(ebuf,"%s : only uni-variate formular",POLARPLOT);
! 820: error(ebuf);
! 821: }
! 822: break;
! 823: case O_N://color,id,idx,division
! 824: switch (iNo){
! 825: case 0://color arg
! 826: color=(Q)BDY(arg);
! 827: iNo++;
! 828: break;
! 829: case 1://stream arg
! 830: stream=QTOS((Q)BDY(arg));
! 831: iNo++;
! 832: break;
! 833: default://error
! 834: sprintf(ebuf,"%s : invalid number arguments",POLARPLOT);
! 835: error(ebuf);
! 836: break;
! 837: }
! 838: break;
! 839: case O_LIST://range,geomerty
! 840: if(lNo<2)list[lNo++]=(LIST)BDY(arg);
! 841: else {
! 842: sprintf(ebuf,"%s : invalid list argument",POLARPLOT);
! 843: error(ebuf);
! 844: }
! 845: break;
! 846: case O_STR://wname
! 847: wname=(STRING)BDY(arg);
! 848: sNo++;
! 849: break;
! 850: default:
! 851: break;
! 852: }
! 853: }
! 854: //formular check
! 855: if(!poly){
! 856: sprintf(ebuf,"%s : invalid plot argument",POLARPLOT);
! 857: error(ebuf);
! 858: }
! 859: //vars check
! 860: get_vars_recursive((Obj)poly,&vl);
! 861: for(vl0=vl,vNo=0;vl0;vNo++,vl0=NEXT(vl0)){
! 862: if(vl0->v->attr==(pointer)V_IND){
! 863: if(vNo>=2){
! 864: sprintf(ebuf,"%s : invalid plot argument",POLARPLOT);
! 865: error(ebuf);
! 866: } else v[vNo]=vl0->v;
! 867: }
! 868: }
! 869: //list check
! 870: for(i=0;i<lNo;i++){
! 871: if(OID(BDY(BDY(list[i])))!=O_P){
! 872: // list first value is number (geometry)
! 873: for(len=0,n=(NODE)BDY(list[i]);n;len++,n=NEXT(n)){
! 874: if(len==0) frst=BDY(n);
! 875: else if(len==1) sec=BDY(n);
! 876: else {
! 877: sprintf(ebuf,"%s : geometry list too long",POLARPLOT);
! 878: error(ebuf);
! 879: }
! 880: }
! 881: if(len!=2){
! 882: sprintf(ebuf,"%s : geometry requierd 2 numbers", POLARPLOT);
! 883: error(ebuf);
! 884: } else geom=list[i];
! 885: } else {
! 886: //list first value is var (range)
! 887: av=VR((P)BDY(BDY(list[i])));
! 888: if(v[0]==av)range=list[i];
! 889: else {
! 890: sprintf(ebuf,"%s : invalid list length",POLARPLOT);
! 891: error(ebuf);
! 892: }
! 893: }
! 894: }
! 895: // set default
! 896: if(!range){
! 897: STOQ(DEFAULTPOLARSTEP,defstep);MKReal(2*Pi,pi2);MKV(v[0],var);
! 898: MKNODE(n,defstep,0);MKNODE(n1,pi2,n);MKNODE(n2,0,n1);
! 899: MKNODE(defrange,var,n2);MKLIST(range,defrange);
! 900: }
! 901: if(!geom){
! 902: STOQ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
! 903: }
! 904: stream=validate_ox_plot_stream(stream);
! 905: STOQ(stream,s_id);
! 906: MKSTR(fname,POLARPLOTD);
! 907: arg=mknode(7,s_id,fname,poly,color,range,geom,wname);
! 908: Pox_rpc(arg,&t);
! 909: *rp=(Obj)s_id;
1.29 saito 910: }
911:
1.26 saito 912: void ifplot_mainNG(NODE arg,char *fn,Obj *rp){
1.34 ! noro 913: Q m2,p2,w300,mxgc,s_id,color;
! 914: NODE defrange,n,n0,n1,n2;
! 915: P poly,var;
! 916: VL vl,vl0;
! 917: V v[2],av;
! 918: LIST xrange,yrange,zrange,geom,range[2],list[4];
! 919: int stream,ri,i,j,sign,llen,len,iNo,lNo,vNo,sNo,pfine,findG;
! 920: STRING fname,wname;
! 921: Obj t,frst,sec,thr;
! 922: char ebuf[BUFSIZ];
! 923:
! 924: iNo=lNo=sNo=findG=0;pfine=TRUE;
! 925: poly=0;stream=-1;wname=0;color=0;stream=0;
! 926: STOQ(-2,m2);STOQ(2,p2);MKNODE(n,p2,0);MKNODE(defrange,m2,n);
! 927: STOQ(MAXGC,mxgc);
! 928: for(;arg;arg=NEXT(arg)){
! 929: if(!BDY(arg)) iNo++;
! 930: else switch(OID(BDY(arg))){
! 931: case O_P://formular
! 932: if(pfine){
! 933: poly=(P)BDY(arg);
! 934: pfine=FALSE;
! 935: } else {
! 936: sprintf(ebuf,"%s : to many plot arguments",fn);
! 937: error(ebuf);
! 938: }
! 939: break;
! 940: case O_N://color,id,idx,division
! 941: switch (iNo){
! 942: case 0: //color arg
! 943: color=(Q)BDY(arg);
! 944: iNo++;
! 945: break;
! 946: case 1: //stream arg
! 947: stream=QTOS((Q)BDY(arg));
! 948: iNo++;
! 949: break;
! 950: default:
! 951: sprintf(ebuf,"%s : invalid number arguments",fn);
! 952: error(ebuf);
! 953: break;
! 954: }
! 955: break;
! 956: case O_LIST://xrange,yrange,zrange,geometry
! 957: if(lNo<4) list[lNo++]=(LIST)BDY(arg);
! 958: else {
! 959: sprintf(ebuf,"%s : invalid list argument",fn);
! 960: error(ebuf);
! 961: }
! 962: break;
! 963: case O_STR://wname
! 964: wname=(STRING)BDY(arg);
! 965: sNo++;
! 966: break;
! 967: default:
! 968: break;
! 969: }
! 970: }
! 971: // formular check
! 972: if(!poly){
! 973: sprintf(ebuf,"%s : invalid plot argument",fn);
! 974: error(ebuf);
! 975: }
! 976: // vars check
! 977: get_vars_recursive((Obj)poly,&vl);
! 978: for(vl0=vl,vNo=0;vl0;vl0=NEXT(vl0)){
! 979: if(vl0->v->attr==(pointer)V_IND){
! 980: if(vNo>=2){
! 981: sprintf(ebuf,"%s : invalid plot argument",fn);
! 982: error(ebuf);
! 983: } else v[vNo++]=vl0->v;
! 984: }
! 985: }
! 986: //list check
! 987: xrange=yrange=zrange=geom=0;frst=sec=thr=0;
! 988: for(i=0;i<lNo;i++){
! 989: for(llen=0,n=(NODE)BDY(list[i]);n;llen++,n=NEXT(n));
! 990: if(llen>4){
! 991: sprintf(ebuf,"%s : invalid list length",fn);
! 992: error(ebuf);
! 993: }
! 994: if(OID(BDY(BDY(list[i])))!=O_P){
! 995: // First list value is number
! 996: for(len=0,n=(NODE)BDY(list[i]);n;len++,n=NEXT(n)){
! 997: if(len==0)frst=BDY(n);
! 998: else if(len==1)sec=BDY(n);
! 999: else thr=BDY(n);
! 1000: }
! 1001: switch(len){
! 1002: case 2:
! 1003: if(!strcmp(fn,CONPLOT)){
! 1004: if(thr==0)thr=(Obj)mxgc;
! 1005: MKNODE(n,thr,0);MKNODE(n1,sec,n);MKNODE(n2,frst,n1);MKLIST(zrange,n2);
! 1006: } else geom=list[i];
! 1007: break;
! 1008: case 3:
! 1009: zrange=list[i];
! 1010: break;
! 1011: case 0:
! 1012: case 1:
! 1013: default:
! 1014: sprintf(ebuf,"%s : invalid list length",fn);
! 1015: error(ebuf);
! 1016: break;
! 1017: }
! 1018: } else {
! 1019: //xrange,yrange
! 1020: av=VR((P)BDY(BDY(list[i])));
! 1021: if(v[0]==av)xrange=list[i];
! 1022: else if(v[1]==av)yrange=list[i];
! 1023: else {
! 1024: MKLIST(zrange,NEXT(BDY(list[i])));
! 1025: }
! 1026: }
! 1027: }
! 1028: //set default
! 1029: if(!xrange){
! 1030: MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n);
! 1031: }
! 1032: if(!yrange){
! 1033: MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n);
! 1034: }
! 1035: if(!geom){
! 1036: STOQ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n);
! 1037: }
! 1038: if(!(strcmp(fn,CONPLOTD)&strcmp(fn,CONPLOTQ)&strcmp(fn,CONPLOTB))&!zrange){
! 1039: MKNODE(n,mxgc,0);MKNODE(n1,m2,n);MKNODE(n2,m2,n1);MKLIST(zrange,n2);
! 1040: }
! 1041: /*new ifplot in ox_plot requires
! 1042: [s_id (Q),
! 1043: formula (Obj),
! 1044: color (Q),
! 1045: geom=[xsize,ysize] (LIST optional),
! 1046: xrange=[x,xmin,xmax] (LIST optional),
! 1047: yrange=[y,ymin,ymax] (LIST optional),
! 1048: zrange=[zmin,zmax,zstep] (LIST optional),
! 1049: wname=name (STRING optional)],
! 1050: itvstep (Q) if ITVIFPLOT */
! 1051: stream=validate_ox_plot_stream(stream);
! 1052: STOQ(stream,s_id);
! 1053: MKSTR(fname,fn);
! 1054: arg=mknode(9,s_id,fname,poly,color,xrange,yrange,zrange,geom,wname);
! 1055: Pox_rpc(arg,&t);
! 1056: *rp=(Obj)s_id;
1.24 saito 1057: }
1058:
1.26 saito 1059: void plotover_mainNG(NODE arg,char *fn,Obj *rp){
1.34 ! noro 1060: Q s_id,w_id,color;
! 1061: P poly;
! 1062: STRING fname;
! 1063: Obj t;
! 1064: int iNo,pfine,sfine;
! 1065: char ebuf[BUFSIZ];
! 1066:
! 1067: pfine=sfine=TRUE;
! 1068: iNo=0;poly=0;color=s_id=w_id=0;
! 1069: for(;arg;arg=NEXT(arg)){
! 1070: if(!BDY(arg)) iNo++;
! 1071: else switch(OID(BDY(arg))){
! 1072: case O_P://formular
! 1073: if(pfine){
! 1074: poly=(P)BDY(arg);
! 1075: pfine=FALSE;
! 1076: } else {
! 1077: sprintf(ebuf,"%s : to many plot arguments",fn);
! 1078: error(ebuf);
! 1079: }
! 1080: break;
! 1081: case O_N://color,s_id,w_id
! 1082: switch(iNo){
! 1083: case 0://color arg
! 1084: color=(Q)BDY(arg);
! 1085: iNo++;
! 1086: break;
! 1087: case 1://stream arg
! 1088: s_id=(Q)BDY(arg);
! 1089: iNo++;
! 1090: break;
! 1091: case 2://window arg
! 1092: w_id=(Q)BDY(arg);
! 1093: iNo++;
! 1094: break;
! 1095: default://error
! 1096: sprintf(ebuf,"%s : to many numbers",fn);
! 1097: error(ebuf);
! 1098: break;
! 1099: }
! 1100: break;
! 1101: default:
! 1102: sprintf(ebuf,"%s : arguments type miss match",fn);
! 1103: error(ebuf);
! 1104: }
! 1105: }
! 1106: MKSTR(fname,fn);
! 1107: //[s_id (Q), w_id (Q), formula (Obj), color (Q)]
! 1108: arg=mknode(5,s_id,fname,w_id,poly,color);
! 1109: Pox_rpc(arg,&t);
! 1110: *rp=(Obj)s_id;
1.1 noro 1111: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>