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