[BACK]Return to plotf.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / plot

Annotation of OpenXM_contrib2/asir2000/plot/plotf.c, Revision 1.23

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.23    ! saito      48:  * $OpenXM: OpenXM_contrib2/asir2000/plot/plotf.c,v 1.22 2011/08/10 04:51:58 saito 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.22      saito      55: void Pifplot(NODE, Obj *), Pconplot(NODE, Obj *), Pplotover(NODE, Q *);
                     56: void Pplot(NODE, Obj *), Parrayplot(NODE, Q *), Pdrawcircle(NODE, Q *);
                     57: #if defined(INTERVAL)
                     58: void Pitvplot1(NODE, Obj *), itvplot_main1(NODE, Obj *); //NORMAL
                     59: void Pitvplot2(NODE, Obj *), itvplot_main2(NODE, Obj *); //TRANSFER
                     60: void Pitvplot3(NODE, Obj *), itvplot_main3(NODE, Obj *); //RECURSION
                     61: void Pitvplot4(NODE, Obj *), itvplot_main4(NODE, Obj *); //RECURSION+TRANSFER
                     62: void Pitvplot(NODE, Obj *), itvplot_main(NODE, Obj *); //NEWTYPE
                     63: void Pobj_cp(NODE, Obj *);
                     64: void Pineqn(NODE, Obj *), Pineqnor(NODE, Obj *), Pineqnand(NODE, Obj *);
                     65: void Pineqnxor(NODE, Obj *), Pmemory_ineqn(NODE, Obj *);
                     66: void ineqn_main(NODE, int, Obj *);
                     67: void ineqn_main_op(NODE, int, int, Obj *);
                     68: #endif
                     69: void Ppolarplot(NODE, Q *);
                     70: void Pmemory_ifplot(NODE, Obj *), Pmemory_conplot(NODE, Obj *);
                     71: void Pmemory_plot(NODE, Obj *);
                     72: void Popen_canvas(NODE, Q *), Pclear_canvas(NODE, Q *), Pdraw_obj(NODE, Q *);
                     73: void Pdraw_string(NODE, Q *);
                     74: void Pox_rpc(), Pox_cmo_rpc();
                     75: void ifplot_main(NODE, int, Obj *);
                     76: void conplot_main(NODE, int, Obj *);
                     77: void plot_main(NODE, int, Obj *);
1.1       noro       78:
                     79: struct ftab plot_tab[] = {
                     80:        {"ifplot",Pifplot,-7},
1.18      noro       81:        {"memory_ifplot",Pmemory_ifplot,-6},
1.22      saito      82: #if defined(INTERVAL)
                     83:        {"itvplot1",Pitvplot1,-7},
                     84:        {"itvplot2",Pitvplot2,-7},
                     85:        {"itvplot3",Pitvplot3,-7},
                     86:        {"itvplot4",Pitvplot4,-7},
                     87:        {"itvplot",Pitvplot,-7},
                     88:        {"ineqn",Pineqn,-8},
                     89:        {"ineqnor",Pineqnor,-7},
                     90:        {"ineqnand",Pineqnand,-7},
                     91:        {"ineqnxor",Pineqnxor,-7},
                     92:        {"memory_ineqn",Pmemory_ineqn,-6},
                     93:        {"obj_cp",Pobj_cp,4},
                     94: #endif
1.1       noro       95:        {"conplot",Pconplot,-8},
1.18      noro       96:        {"memory_conplot",Pmemory_conplot,-7},
1.1       noro       97:        {"plot",Pplot,-6},
1.18      noro       98:        {"memory_plot",Pmemory_plot,-5},
1.15      noro       99:        {"polarplot",Ppolarplot,-6},
1.17      noro      100:        {"plotover",Pplotover,-4},
1.19      saito     101:        {"drawcircle",Pdrawcircle,6},
1.6       noro      102:        {"open_canvas",Popen_canvas,-3},
                    103:        {"clear_canvas",Pclear_canvas,2},
1.7       noro      104:        {"draw_obj",Pdraw_obj,-4},
1.12      noro      105:        {"draw_string",Pdraw_string,-5},
1.1       noro      106:        {0,0,0},
                    107: };
                    108:
1.16      noro      109: void Popen_canvas(NODE arg,Q *rp)
1.6       noro      110: {
1.9       noro      111:        Q w300,s_id;
1.6       noro      112:        LIST geom;
1.11      noro      113:        int stream;
1.6       noro      114:        NODE n,n0;
                    115:        STRING fname,wname;
                    116:
                    117:        geom = 0; wname = 0; stream = -1;
                    118:        for ( ; arg; arg = NEXT(arg) )
                    119:                if ( !BDY(arg) )
                    120:                        stream = 0;
                    121:                else
                    122:                switch ( OID(BDY(arg)) ) {
1.22      saito     123:                case O_LIST:
                    124:                        geom = (LIST)BDY(arg);
                    125:                        break;
                    126:                case O_N:
                    127:                        stream = QTOS((Q)BDY(arg)); break;
                    128:                case O_STR:
                    129:                        wname = (STRING)BDY(arg); break;
                    130:                default:
                    131:                        error("open_canvas : invalid argument"); break;
1.6       noro      132:                }
1.13      noro      133:        stream = validate_ox_plot_stream(stream);
1.9       noro      134:        STOQ(stream,s_id);
1.6       noro      135:        if ( !geom ) {
                    136:                STOQ(300,w300);
                    137:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                    138:        }
                    139:        MKSTR(fname,"open_canvas");
1.9       noro      140:        arg = mknode(4,s_id,fname,geom,wname);
1.6       noro      141:        Pox_cmo_rpc(arg,rp);
1.16      noro      142:        *rp = s_id;
1.6       noro      143: }
                    144:
1.18      noro      145: void Pifplot(NODE arg,Obj *rp)
                    146: {
                    147:        ifplot_main(arg,0,rp);
                    148: }
                    149:
                    150: void Pmemory_ifplot(NODE arg,Obj *rp)
                    151: {
                    152:        ifplot_main(arg,1,rp);
                    153: }
                    154:
                    155: void ifplot_main(NODE arg,int is_memory, Obj *rp)
1.1       noro      156: {
1.9       noro      157:        Q m2,p2,w300,s_id;
1.1       noro      158:        NODE defrange;
                    159:        LIST xrange,yrange,range[2],list,geom;
                    160:        VL vl,vl0;
                    161:        V v[2],av[2];
1.22      saito     162:        int stream,ri,i,sign;
                    163:        P poly;
                    164:        P var;
                    165:        NODE n,n0;
                    166:        STRING fname,wname;
                    167:        Obj t;
                    168:
                    169:        STOQ(-2,m2); STOQ(2,p2);
                    170:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    171:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
                    172:        v[0] = v[1] = 0;
                    173:        for ( ; arg; arg = NEXT(arg) )
                    174:                if ( !BDY(arg) ) stream = 0;
                    175:                else
                    176:                switch ( OID(BDY(arg)) ) {
                    177:                case O_P:
                    178:                        poly = (P)BDY(arg);
                    179:                        get_vars_recursive((Obj)poly,&vl);
                    180:                        for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
                    181:                                if ( vl0->v->attr == (pointer)V_IND )
                    182:                                        if ( i >= 2 ) error("ifplot : invalid argument");
                    183:                                        else v[i++] = vl0->v;
                    184:                        break;
                    185:                case O_LIST:
                    186:                        list = (LIST)BDY(arg);
                    187:                        if ( OID(BDY(BDY(list))) == O_P )
                    188:                                if ( ri > 1 ) error("ifplot : invalid argument");
                    189:                                else range[ri++] = list;
                    190:                        else geom = list;
                    191:                        break;
                    192:                case O_N:
                    193:                        stream = QTOS((Q)BDY(arg)); break;
                    194:                case O_STR:
                    195:                        wname = (STRING)BDY(arg); break;
                    196:                default:
                    197:                        error("ifplot : invalid argument"); break;
                    198:                }
                    199:        if ( !poly ) error("ifplot : invalid argument");
                    200:        switch ( ri ) {
                    201:        case 0:
                    202:                if ( !v[1] ) error("ifplot : please specify all variables");
                    203:                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    204:                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    205:                break;
                    206:        case 1:
                    207:                if ( !v[1] ) error("ifplot : please specify all variables");
                    208:                av[0] = VR((P)BDY(BDY(range[0])));
                    209:                if ( v[0] == av[0] ) {
                    210:                        xrange = range[0];
                    211:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    212:                } else if ( v[1] == av[0] ) {
                    213:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    214:                        yrange = range[0];
                    215:                } else error("ifplot : invalid argument");
                    216:                break;
                    217:        case 2:
                    218:                av[0] = VR((P)BDY(BDY(range[0])));
                    219:                av[1] = VR((P)BDY(BDY(range[1])));
                    220:                if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                    221:                        ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                    222:                        xrange = range[0]; yrange = range[1];
                    223:                } else error("ifplot : invalid argument");
                    224:                break;
                    225:        default:
                    226:                error("ifplot : cannot happen"); break;
                    227:        }
                    228:        /* ifplot in ox_plot requires
                    229:                [s_id (Q),
                    230:                formula (Obj),
                    231:                xrange=[x,xmin,xmax] (LIST),
                    232:                yrange=[y,ymin,ymax] (LIST),
                    233:                zrange=0,
                    234:                geom=[xsize,ysize] (LIST),
                    235:                wname=name (STRING)]
                    236:        */
                    237:
                    238:        stream = validate_ox_plot_stream(stream);
                    239:        STOQ(stream,s_id);
                    240:        if ( !geom ) {
                    241:                STOQ(300,w300);
                    242:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                    243:        }
                    244:        if ( is_memory ) {
                    245:                MKSTR(fname,"memory_plot");
                    246:                arg = mknode(8,s_id,fname,poly,xrange,yrange,0,geom);
                    247:                Pox_rpc(arg,&t);
                    248:                arg = mknode(1,s_id);
                    249:                Pox_pop_cmo(arg,rp);
                    250:        } else {
                    251:                MKSTR(fname,"plot");
                    252:                arg = mknode(8,s_id,fname,poly,xrange,yrange,0,geom,wname);
                    253:                Pox_rpc(arg,&t);
                    254:                *rp = (Obj)s_id;
                    255:        }
                    256: }
                    257:
                    258: #if defined(INTERVAL)
                    259: void Pitvplot(NODE arg, Obj *rp)
                    260: {
                    261:        itvplot_main(arg, rp);
                    262: }
                    263:
                    264: void itvplot_main(NODE arg, Obj *rp)
                    265: {
                    266:        Q m2,p2,w300,s_id, itvsize;
                    267:        NODE defrange;
                    268:        LIST xrange,yrange,range[2],list,geom;
                    269:        VL vl,vl0;
                    270:        V v[2],av[2];
                    271:        int stream,ri,i,sign;
                    272:        P poly;
                    273:        P var;
                    274:        NODE n,n0;
                    275:        STRING fname,wname;
                    276:        Obj t;
                    277:
                    278:        STOQ(-2,m2); STOQ(2,p2);
                    279:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    280:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
                    281:        v[0] = v[1] = 0;
                    282:        for ( ; arg; arg = NEXT(arg) )
                    283:                if ( !BDY(arg) ) stream = 0;
                    284:                else
                    285:                switch ( OID(BDY(arg)) ) {
                    286:                case O_P:
                    287:                        poly = (P)BDY(arg);
                    288:                        get_vars_recursive((Obj)poly,&vl);
                    289:                        for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
                    290:                                if ( vl0->v->attr == (pointer)V_IND )
                    291:                                        if ( i >= 2 ) error("itvplot : invalid argument");
                    292:                                        else v[i++] = vl0->v;
                    293:                        break;
                    294:                case O_LIST:
                    295:                        list = (LIST)BDY(arg);
                    296:                        if ( OID(BDY(BDY(list))) == O_P )
                    297:                                if ( ri > 1 ) error("itvplot : invalid argument");
                    298:                                else range[ri++] = list;
                    299:                        else geom = list;
                    300:                        break;
                    301:                case O_N:
                    302:                        stream = QTOS((Q)BDY(arg)); break;
                    303:                case O_STR:
                    304:                        wname = (STRING)BDY(arg); break;
                    305:                default:
                    306:                        error("itvplot : invalid argument"); break;
                    307:        }
                    308:        if ( !poly ) error("itvplot : invalid argument");
                    309:        switch ( ri ) {
                    310:        case 0:
                    311:                if ( !v[1] ) error("itvplot : please specify all variables");
                    312:                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    313:                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    314:                break;
                    315:        case 1:
                    316:                if ( !v[1] ) error("itvplot : please specify all variables");
                    317:                av[0] = VR((P)BDY(BDY(range[0])));
                    318:                if ( v[0] == av[0] ) {
                    319:                        xrange = range[0];
                    320:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    321:                } else if ( v[1] == av[0] ) {
                    322:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    323:                        yrange = range[0];
                    324:                } else error("itvplot : invalid argument");
                    325:                break;
                    326:        case 2:
                    327:                av[0] = VR((P)BDY(BDY(range[0])));
                    328:                av[1] = VR((P)BDY(BDY(range[1])));
                    329:                if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                    330:                        ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                    331:                        xrange = range[0]; yrange = range[1];
                    332:                } else error("itvplot : invalid argument");
                    333:                break;
                    334:        default:
                    335:                error("itvplot : cannot happen"); break;
                    336:        }
                    337:        /* itvplot in ox_plot requires
                    338:           [s_id (Q),
                    339:                formula (Obj),
                    340:                xrange=[x,xmin,xmax] (LIST),
                    341:                yrange=[y,ymin,ymax] (LIST),
                    342:                zrange=0,
                    343:                geom=[xsize,ysize] (LIST),
                    344:                wname=name (STRING)]
                    345:        */
                    346:        stream = validate_ox_plot_stream(stream);
                    347:        STOQ(stream,s_id);
                    348:        if ( !geom ) {
                    349:                STOQ(300,w300);
                    350:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                    351:        }
                    352:        MKSTR(fname,"itvifplot");
                    353:        STOQ(Itvplot, itvsize);
                    354:        arg = mknode(9,s_id,fname,poly,xrange,yrange,0,geom,wname,itvsize);
                    355:        Pox_rpc(arg,&t);
                    356:        *rp = (Obj)s_id;
                    357: }
                    358:
                    359: void Pitvplot1(NODE arg, Obj *rp)
                    360: {
                    361:        itvplot_main1(arg, rp);
                    362: }
                    363:
                    364: void Pitvplot2(NODE arg, Obj *rp)
                    365: {
                    366:        itvplot_main2(arg, rp);
                    367: }
                    368:
                    369: void Pitvplot3(NODE arg, Obj *rp)
                    370: {
                    371:        itvplot_main3(arg, rp);
                    372: }
                    373:
                    374: void Pitvplot4(NODE arg, Obj *rp)
                    375: {
                    376:        itvplot_main4(arg, rp);
                    377: }
                    378:
                    379: // NORMAL type
                    380: void itvplot_main1(NODE arg, Obj *rp)
                    381: {
                    382:        Q m2,p2,w300,s_id;
                    383:        NODE defrange;
                    384:        LIST xrange,yrange,range[2],list,geom;
                    385:        VL vl,vl0;
                    386:        V v[2],av[2];
                    387:        int stream,ri,i,sign;
                    388:        P poly;
                    389:        P var;
                    390:        NODE n,n0;
                    391:        STRING fname,wname;
                    392:        Obj t;
                    393:
                    394:        STOQ(-2,m2); STOQ(2,p2);
                    395:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    396:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
                    397:        v[0] = v[1] = 0;
                    398:        for ( ; arg; arg = NEXT(arg) )
                    399:                if ( !BDY(arg) ) stream = 0;
                    400:                else
                    401:                switch ( OID(BDY(arg)) ) {
                    402:                case O_P:
                    403:                        poly = (P)BDY(arg);
                    404:                        get_vars_recursive((Obj)poly,&vl);
                    405:                        for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
                    406:                                if ( vl0->v->attr == (pointer)V_IND )
                    407:                                        if ( i >= 2 ) error("itvplot : invalid argument");
                    408:                                        else v[i++] = vl0->v;
                    409:                        break;
                    410:                case O_LIST:
                    411:                        list = (LIST)BDY(arg);
                    412:                        if ( OID(BDY(BDY(list))) == O_P )
                    413:                                if ( ri > 1 ) error("itvplot : invalid argument");
                    414:                                else range[ri++] = list;
                    415:                        else geom = list;
                    416:                        break;
                    417:                case O_N:
                    418:                        stream = QTOS((Q)BDY(arg)); break;
                    419:                case O_STR:
                    420:                        wname = (STRING)BDY(arg); break;
                    421:                default:
                    422:                        error("itvplot : invalid argument"); break;
                    423:                }
                    424:        if ( !poly ) error("itvplot : invalid argument");
                    425:        switch ( ri ) {
                    426:        case 0:
                    427:                if ( !v[1] ) error("itvplot : please specify all variables");
                    428:                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    429:                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    430:                break;
                    431:        case 1:
                    432:                if ( !v[1] ) error("itvplot : please specify all variables");
                    433:                av[0] = VR((P)BDY(BDY(range[0])));
                    434:                if ( v[0] == av[0] ) {
                    435:                        xrange = range[0];
                    436:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    437:                } else if ( v[1] == av[0] ) {
                    438:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    439:                        yrange = range[0];
                    440:                } else error("itvplot : invalid argument");
                    441:                break;
                    442:        case 2:
                    443:                av[0] = VR((P)BDY(BDY(range[0])));
                    444:                av[1] = VR((P)BDY(BDY(range[1])));
                    445:                if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                    446:                        ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                    447:                        xrange = range[0]; yrange = range[1];
                    448:                } else error("itvplot : invalid argument");
                    449:                break;
                    450:        default:
                    451:                error("itvplot : cannot happen"); break;
                    452:        }
                    453:        stream = validate_ox_plot_stream(stream);
                    454:        STOQ(stream,s_id);
                    455:        if ( !geom ) {
                    456:                STOQ(300,w300);
                    457:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                    458:        }
                    459:        MKSTR(fname,"itvplot1");
                    460:        arg = mknode(8,s_id,fname,poly,xrange,yrange,0,geom,wname);
                    461:        Pox_rpc(arg,&t);
                    462:        *rp = (Obj)s_id;
                    463: }
                    464:
                    465: // TRANSFER TYPE
                    466: void itvplot_main2(NODE arg, Obj *rp)
                    467: {
                    468:        Q m2,p2,w300,s_id;
                    469:        NODE defrange;
                    470:        LIST xrange,yrange,range[2],list,geom;
                    471:        VL vl,vl0;
                    472:        V v[2],av[2];
                    473:        int stream,ri,i,sign;
                    474:        P poly;
                    475:        P var;
                    476:        NODE n,n0;
                    477:        STRING fname,wname;
                    478:        Obj t;
                    479:
                    480:        STOQ(-2,m2); STOQ(2,p2);
                    481:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    482:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
                    483:        v[0] = v[1] = 0;
                    484:        for ( ; arg; arg = NEXT(arg) )
                    485:                if ( !BDY(arg) )
                    486:                        stream = 0;
                    487:                else
                    488:                switch ( OID(BDY(arg)) ) {
                    489:                        case O_P:
                    490:                                poly = (P)BDY(arg);
                    491:                                get_vars_recursive((Obj)poly,&vl);
                    492:                                for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
                    493:                                        if ( vl0->v->attr == (pointer)V_IND )
                    494:                                                if ( i >= 2 )
                    495:                                                        error("itvplot : invalid argument");
                    496:                                                else
                    497:                                                        v[i++] = vl0->v;
                    498:                                break;
                    499:                        case O_LIST:
                    500:                                list = (LIST)BDY(arg);
                    501:                                if ( OID(BDY(BDY(list))) == O_P )
                    502:                                        if ( ri > 1 )
                    503:                                                error("itvplot : invalid argument");
                    504:                                        else
                    505:                                                range[ri++] = list;
                    506:                                else
                    507:                                        geom = list;
                    508:                                break;
                    509:                        case O_N:
                    510:                                stream = QTOS((Q)BDY(arg)); break;
                    511:                        case O_STR:
                    512:                                wname = (STRING)BDY(arg); break;
                    513:                        default:
                    514:                                error("itvplot : invalid argument"); break;
                    515:                }
                    516:        if ( !poly )
                    517:                error("itvplot : invalid argument");
                    518:        switch ( ri ) {
                    519:                case 0:
                    520:                        if ( !v[1] )
                    521:                                error("itvplot : please specify all variables");
                    522:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    523:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    524:                        break;
                    525:                case 1:
                    526:                        if ( !v[1] )
                    527:                                error("itvplot : please specify all variables");
                    528:                        av[0] = VR((P)BDY(BDY(range[0])));
                    529:                        if ( v[0] == av[0] ) {
                    530:                                xrange = range[0];
                    531:                                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    532:                        } else if ( v[1] == av[0] ) {
                    533:                                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    534:                                yrange = range[0];
                    535:                        } else
                    536:                                error("itvplot : invalid argument");
                    537:                        break;
                    538:                case 2:
                    539:                        av[0] = VR((P)BDY(BDY(range[0])));
                    540:                        av[1] = VR((P)BDY(BDY(range[1])));
                    541:                        if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                    542:                                 ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                    543:                                        xrange = range[0]; yrange = range[1];
                    544:                        } else
                    545:                                        error("itvplot : invalid argument");
                    546:                        break;
                    547:                default:
                    548:                        error("itvplot : cannot happen"); break;
                    549:        }
                    550:        stream = validate_ox_plot_stream(stream);
                    551:        STOQ(stream,s_id);
                    552:        if ( !geom ) {
                    553:                STOQ(300,w300);
                    554:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                    555:        }
                    556:        MKSTR(fname,"itvplot2");
                    557:        arg = mknode(8,s_id,fname,poly,xrange,yrange,0,geom,wname);
                    558:        Pox_rpc(arg,&t);
                    559:        *rp = (Obj)s_id;
                    560: }
                    561: // RECURSION TYPE
                    562: void itvplot_main3(NODE arg, Obj *rp)
                    563: {
                    564:        Q m2,p2,w300,s_id, itvsize;
                    565:        NODE defrange;
                    566:        LIST xrange,yrange,range[2],list,geom;
                    567:        VL vl,vl0;
                    568:        V v[2],av[2];
                    569:        int stream,ri,i,sign;
                    570:        P poly;
                    571:        P var;
                    572:        NODE n,n0;
                    573:        STRING fname,wname;
                    574:        Obj t;
                    575:
                    576:        STOQ(-2,m2); STOQ(2,p2);
                    577:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    578:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
                    579:        v[0] = v[1] = 0;
                    580:        for ( ; arg; arg = NEXT(arg) )
                    581:                if ( !BDY(arg) )
                    582:                        stream = 0;
                    583:                else
                    584:                switch ( OID(BDY(arg)) ) {
                    585:                        case O_P:
                    586:                                poly = (P)BDY(arg);
                    587:                                get_vars_recursive((Obj)poly,&vl);
                    588:                                for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
                    589:                                        if ( vl0->v->attr == (pointer)V_IND )
                    590:                                                if ( i >= 2 )
                    591:                                                        error("itvplot : invalid argument");
                    592:                                                else
                    593:                                                        v[i++] = vl0->v;
                    594:                                break;
                    595:                        case O_LIST:
                    596:                                list = (LIST)BDY(arg);
                    597:                                if ( OID(BDY(BDY(list))) == O_P )
                    598:                                        if ( ri > 1 )
                    599:                                                error("itvplot : invalid argument");
                    600:                                        else
                    601:                                                range[ri++] = list;
                    602:                                else
                    603:                                        geom = list;
                    604:                                break;
                    605:                        case O_N:
                    606:                                stream = QTOS((Q)BDY(arg)); break;
                    607:                        case O_STR:
                    608:                                wname = (STRING)BDY(arg); break;
                    609:                        default:
                    610:                                error("itvplot : invalid argument"); break;
                    611:                }
                    612:        if ( !poly )
                    613:                error("itvplot : invalid argument");
                    614:        switch ( ri ) {
                    615:                case 0:
                    616:                        if ( !v[1] )
                    617:                                error("itvplot : please specify all variables");
                    618:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    619:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    620:                        break;
                    621:                case 1:
                    622:                        if ( !v[1] )
                    623:                                error("itvplot : please specify all variables");
                    624:                        av[0] = VR((P)BDY(BDY(range[0])));
                    625:                        if ( v[0] == av[0] ) {
                    626:                                xrange = range[0];
                    627:                                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    628:                        } else if ( v[1] == av[0] ) {
                    629:                                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    630:                                yrange = range[0];
                    631:                        } else
                    632:                                error("itvplot : invalid argument");
                    633:                        break;
                    634:                case 2:
                    635:                        av[0] = VR((P)BDY(BDY(range[0])));
                    636:                        av[1] = VR((P)BDY(BDY(range[1])));
                    637:                        if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                    638:                                 ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                    639:                                        xrange = range[0]; yrange = range[1];
                    640:                        } else
                    641:                                        error("itvplot : invalid argument");
                    642:                        break;
                    643:                default:
                    644:                        error("itvplot : cannot happen"); break;
                    645:        }
                    646:        stream = validate_ox_plot_stream(stream);
                    647:        STOQ(stream,s_id);
                    648:        if ( !geom ) {
                    649:                STOQ(300,w300);
                    650:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                    651:        }
                    652:        MKSTR(fname,"itvplot3");
                    653:        STOQ(Itvplot, itvsize);
                    654:        arg = mknode(9,s_id,fname,poly,xrange,yrange,0,geom,wname,itvsize);
                    655:        Pox_rpc(arg,&t);
                    656:        *rp = (Obj)s_id;
                    657: }
                    658: // RECURSION and TRANSFER TYPE
                    659: void itvplot_main4(NODE arg, Obj *rp)
                    660: {
                    661:        Q m2,p2,w300,s_id,itvsize;
                    662:        NODE defrange;
                    663:        LIST xrange,yrange,range[2],list,geom;
                    664:        VL vl,vl0;
                    665:        V v[2],av[2];
                    666:        int stream,ri,i,sign;
1.1       noro      667:        P poly;
                    668:        P var;
                    669:        NODE n,n0;
                    670:        STRING fname,wname;
1.13      noro      671:        Obj t;
1.1       noro      672:
                    673:        STOQ(-2,m2); STOQ(2,p2);
                    674:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    675:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
1.14      noro      676:        v[0] = v[1] = 0;
1.1       noro      677:        for ( ; arg; arg = NEXT(arg) )
                    678:                if ( !BDY(arg) )
                    679:                        stream = 0;
                    680:                else
                    681:                switch ( OID(BDY(arg)) ) {
                    682:                        case O_P:
                    683:                                poly = (P)BDY(arg);
1.11      noro      684:                                get_vars_recursive((Obj)poly,&vl);
1.1       noro      685:                                for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
1.11      noro      686:                                        if ( vl0->v->attr == (pointer)V_IND )
1.1       noro      687:                                                if ( i >= 2 )
1.22      saito     688:                                                        error("itvplot : invalid argument");
1.1       noro      689:                                                else
                    690:                                                        v[i++] = vl0->v;
                    691:                                break;
                    692:                        case O_LIST:
                    693:                                list = (LIST)BDY(arg);
                    694:                                if ( OID(BDY(BDY(list))) == O_P )
                    695:                                        if ( ri > 1 )
1.22      saito     696:                                                error("itvplot : invalid argument");
1.1       noro      697:                                        else
                    698:                                                range[ri++] = list;
                    699:                                else
                    700:                                        geom = list;
                    701:                                break;
                    702:                        case O_N:
                    703:                                stream = QTOS((Q)BDY(arg)); break;
                    704:                        case O_STR:
                    705:                                wname = (STRING)BDY(arg); break;
                    706:                        default:
1.22      saito     707:                                error("itvplot : invalid argument"); break;
1.1       noro      708:                }
                    709:        if ( !poly )
1.22      saito     710:                error("itvplot : invalid argument");
1.1       noro      711:        switch ( ri ) {
                    712:                case 0:
                    713:                        if ( !v[1] )
1.22      saito     714:                                error("itvplot : please specify all variables");
1.1       noro      715:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    716:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    717:                        break;
                    718:                case 1:
                    719:                        if ( !v[1] )
1.22      saito     720:                                error("itvplot : please specify all variables");
1.1       noro      721:                        av[0] = VR((P)BDY(BDY(range[0])));
                    722:                        if ( v[0] == av[0] ) {
                    723:                                xrange = range[0];
                    724:                                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    725:                        } else if ( v[1] == av[0] ) {
                    726:                                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    727:                                yrange = range[0];
                    728:                        } else
1.22      saito     729:                                error("itvplot : invalid argument");
1.1       noro      730:                        break;
                    731:                case 2:
                    732:                        av[0] = VR((P)BDY(BDY(range[0])));
                    733:                        av[1] = VR((P)BDY(BDY(range[1])));
                    734:                        if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                    735:                                 ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                    736:                                        xrange = range[0]; yrange = range[1];
                    737:                        } else
1.22      saito     738:                                        error("itvplot : invalid argument");
1.1       noro      739:                        break;
                    740:                default:
1.22      saito     741:                        error("itvplot : cannot happen"); break;
1.1       noro      742:        }
1.22      saito     743:        /* itvplot in ox_plot requires
1.9       noro      744:           [s_id (Q),
1.1       noro      745:                formula (Obj),
                    746:                xrange=[x,xmin,xmax] (LIST),
                    747:                yrange=[y,ymin,ymax] (LIST),
                    748:                zrange=0,
                    749:                geom=[xsize,ysize] (LIST),
                    750:                wname=name (STRING)]
                    751:        */
                    752:
1.13      noro      753:        stream = validate_ox_plot_stream(stream);
1.9       noro      754:        STOQ(stream,s_id);
1.1       noro      755:        if ( !geom ) {
                    756:                STOQ(300,w300);
                    757:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                    758:        }
1.22      saito     759:        MKSTR(fname,"itvplot4");
                    760:        STOQ(Itvplot, itvsize);
                    761:        arg = mknode(9,s_id,fname,poly,xrange,yrange,0,geom,wname,itvsize);
                    762:        Pox_rpc(arg,&t);
                    763:        *rp = (Obj)s_id;
                    764: }
                    765:
                    766: void Pineqn(NODE arg, Obj *rp)
                    767: {
                    768:        ineqn_main(arg, 1, rp);
                    769: }
                    770:
                    771: void ineqn_main(NODE arg,int is_memory, Obj *rp)
                    772: {
                    773:        Q s_id, m2, p2, w300, color;
                    774:        NODE defrange, n, n0;
                    775:        P poly, var;
                    776:        VL vl, vl0;
                    777:        V v[2], av[2];
                    778:        LIST xrange, yrange, range[2], list, geom;
                    779:        int stream, ri, i,sign;
                    780:        STRING fname,wname;
                    781:
                    782:        STOQ(-2,m2); STOQ(2,p2);
                    783:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    784:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
                    785:        v[0] = v[1] = 0;
                    786:        /* get polynomial */
                    787:        if ( !(OID(BDY(arg)) == O_P || (OID(BDY(arg)) ==O_R)) )
                    788:                error("ineqn : first argument must be a polynormial");
                    789:        else {
                    790:                poly = (P)BDY(arg);
                    791:                /* get vars */
                    792:                get_vars_recursive((Obj)poly,&vl);
                    793:                for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
                    794:                if ( vl0->v->attr == (pointer)V_IND )
                    795:                if ( i >= 2 )
                    796:                        error(
                    797:                                "ineqn : first argument must be a univariate or bivariate polynormial");
                    798:                else
                    799:                        v[i++] = vl0->v;
                    800:        }
                    801:        /* get color */
                    802:        arg = NEXT(arg);
                    803:        if ( OID(BDY(arg)) != O_N )
                    804:                error("ineqn : second argument must be color code");
                    805:        else
                    806:                color = (Q)BDY(arg);
                    807:        /* other argument is optional */
                    808:        arg = NEXT(arg);
                    809:        for ( ; arg; arg = NEXT(arg) )
                    810:                if ( !BDY(arg) )
                    811:                        stream = 0;
                    812:                else
                    813:                switch ( OID(BDY(arg)) ) {
                    814:                case O_LIST:
                    815:                        list = (LIST)BDY(arg);
                    816:                        if ( OID(BDY(BDY(list))) == O_P )
                    817:                                if ( ri > 1 )
                    818:                                        error("ineqn : invalid list argument");
                    819:                                else
                    820:                                        range[ri++] = list;
                    821:                        else
                    822:                        geom = list;
                    823:                        break;
                    824:                case O_N:
                    825:                        stream = QTOS((Q)BDY(arg)); break;
                    826:                case O_STR:
                    827:                        wname = (STRING)BDY(arg); break;
                    828:                default:
                    829:                        error("ineqn : invalid argument"); break;
                    830:        }
                    831:        switch ( ri ) {
                    832:        case 0:
                    833:                if ( !v[1] ) error("ineqn : please specify all variables");
                    834:                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    835:                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    836:                break;
                    837:        case 1:
                    838:                if ( !v[1] ) error("ineqn : please specify all variables");
                    839:                av[0] = VR((P)BDY(BDY(range[0])));
                    840:                if ( v[0] == av[0] ) {
                    841:                        xrange = range[0];
                    842:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    843:                } else if ( v[1] == av[0] ) {
                    844:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    845:                        yrange = range[0];
                    846:                } else error("ineqn : invalid argument");
                    847:                break;
                    848:        case 2:
                    849:                av[0] = VR((P)BDY(BDY(range[0])));
                    850:                av[1] = VR((P)BDY(BDY(range[1])));
                    851:                if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                    852:                                ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                    853:                        xrange = range[0]; yrange = range[1];
                    854:                } else error("ineqn : invalid argument");
                    855:                break;
                    856:        default:
                    857:                error("ineqn : cannot happen"); break;
                    858:        }
                    859:
                    860:        stream = validate_ox_plot_stream(stream);
                    861:        STOQ(stream,s_id);
                    862:        if ( !geom ) {
                    863:                STOQ(300,w300);
                    864:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
1.18      noro      865:        }
1.22      saito     866:        MKSTR(fname, "ineqn");
                    867:        arg = mknode(8, s_id, fname, poly, color, xrange, yrange, geom, wname);
                    868:        Pox_cmo_rpc(arg,rp);
1.23    ! saito     869:        *rp = (Obj)s_id;
1.22      saito     870: }
                    871:
                    872: void Pineqnor(NODE arg, Obj *rp)
                    873: {
                    874:        ineqn_main_op(arg, 7, 0, rp);
1.10      noro      875: }
                    876:
1.22      saito     877: void Pineqnand(NODE arg, Obj *rp)
                    878: {
                    879:        ineqn_main_op(arg, 1, 0, rp);
                    880: }
                    881:
                    882: void Pineqnxor(NODE arg, Obj *rp)
                    883: {
                    884:        ineqn_main_op(arg, 6, 0, rp);
                    885: }
                    886:
                    887: void Pmemory_ineqn(NODE arg, Obj *rp)
                    888: {
                    889:        ineqn_main(arg, 1, rp);
                    890: }
                    891:
                    892: void ineqn_main_op(NODE arg, int op, int is_memory, Obj *rp)
                    893: {
                    894:        Q s_id, index, color, op_code;
                    895:        P poly;
                    896:        STRING fname;
                    897:        Obj t;
                    898:
                    899:        poly  = (P)ARG0(arg);
                    900:        color = (Q)ARG1(arg);
                    901:        s_id  = (Q)ARG2(arg);
                    902:        index = (Q)ARG3(arg);
                    903:        STOQ( op, op_code);
                    904:        MKSTR(fname, "ineqnover");
                    905:        arg = mknode(6, s_id, fname, index, poly, color, op_code);
                    906:        Pox_rpc(arg, &t);
                    907:        *rp = (Obj)s_id;
                    908: }
                    909:
                    910: void Pobj_cp(NODE arg, Obj *rp)
                    911: {
                    912:        Q sysid, index_A, index_B, op_code;
                    913:        STRING fname;
                    914:        Obj t;
                    915:
                    916:        sysid = (Q)ARG0(arg);
                    917:        index_A = (Q)ARG1(arg);
                    918:        index_B = (Q)ARG2(arg);
                    919:        op_code = (Q)ARG3(arg);
                    920:        MKSTR(fname, "objcp");
                    921:        arg = mknode(5, sysid, fname, index_A, index_B, op_code);
                    922:        Pox_rpc(arg, &t);
                    923:        *rp = (Obj)sysid;
                    924: }
                    925: #endif
1.18      noro      926:
                    927: void Pconplot(NODE arg,Obj *rp)
1.10      noro      928: {
1.22      saito     929:        conplot_main(arg, 0, rp);
1.18      noro      930: }
1.10      noro      931:
1.18      noro      932: void Pmemory_conplot(NODE arg,Obj *rp)
                    933: {
                    934:        conplot_main(arg,1,rp);
1.1       noro      935: }
                    936:
1.18      noro      937: void conplot_main(NODE arg,int is_memory,Obj *rp)
1.1       noro      938: {
1.9       noro      939:        Q m2,p2,w300,s_id;
1.1       noro      940:        NODE defrange;
                    941:        LIST xrange,yrange,zrange,range[3],list,geom;
                    942:        VL vl,vl0;
                    943:        V v[2],av[2];
1.11      noro      944:        int stream,ri,i;
1.1       noro      945:        P poly;
                    946:        P var;
                    947:        NODE n,n0;
                    948:        STRING fname,wname;
1.13      noro      949:        Obj t;
1.1       noro      950:
                    951:        STOQ(-2,m2); STOQ(2,p2);
                    952:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                    953:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
1.14      noro      954:        v[0] = v[1] = 0;
1.1       noro      955:        for ( ; arg; arg = NEXT(arg) )
                    956:                if ( !BDY(arg) )
                    957:                        stream = 0;
                    958:                else
                    959:                switch ( OID(BDY(arg)) ) {
                    960:                        case O_P:
                    961:                                poly = (P)BDY(arg);
1.11      noro      962:                                get_vars_recursive((Obj)poly,&vl);
1.1       noro      963:                                for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
1.11      noro      964:                                        if ( vl0->v->attr == (pointer)V_IND )
1.1       noro      965:                                                if ( i >= 2 )
                    966:                                                        error("ifplot : invalid argument");
                    967:                                                else
                    968:                                                        v[i++] = vl0->v;
                    969:                                break;
                    970:                        case O_LIST:
                    971:                                list = (LIST)BDY(arg);
                    972:                                if ( OID(BDY(BDY(list))) == O_P )
                    973:                                        if ( ri > 2 )
                    974:                                                error("ifplot : invalid argument");
                    975:                                        else
                    976:                                                range[ri++] = list;
                    977:                                else
                    978:                                        geom = list;
                    979:                                break;
                    980:                        case O_N:
                    981:                                stream = QTOS((Q)BDY(arg)); break;
                    982:                        case O_STR:
                    983:                                wname = (STRING)BDY(arg); break;
                    984:                        default:
                    985:                                error("ifplot : invalid argument"); break;
                    986:                }
                    987:        if ( !poly )
                    988:                error("ifplot : invalid argument");
                    989:        switch ( ri ) {
                    990:                case 0:
                    991:                        if ( !v[1] )
                    992:                                error("ifplot : please specify all variables");
                    993:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                    994:                        MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                    995:                        MKNODE(n,0,defrange); MKLIST(zrange,n);
                    996:                        break;
                    997:                case 1:
                    998:                        if ( !v[1] )
                    999:                                error("ifplot : please specify all variables");
                   1000:                        av[0] = VR((P)BDY(BDY(range[0])));
                   1001:                        if ( v[0] == av[0] ) {
                   1002:                                xrange = range[0];
                   1003:                                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                   1004:                                MKNODE(n,0,defrange); MKLIST(zrange,n);
                   1005:                        } else if ( v[1] == av[0] ) {
                   1006:                                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                   1007:                                yrange = range[0];
                   1008:                                MKNODE(n,0,defrange); MKLIST(zrange,n);
                   1009:                        } else {
                   1010:                                MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                   1011:                                MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n);
                   1012:                                zrange = range[0];
                   1013:                        }
                   1014:                        break;
                   1015:                case 2: case 3:
                   1016:                        av[0] = VR((P)BDY(BDY(range[0])));
                   1017:                        av[1] = VR((P)BDY(BDY(range[1])));
                   1018:                        if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) ||
                   1019:                                 ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) {
                   1020:                                xrange = range[0]; yrange = range[1];
                   1021:                                if ( ri == 3 )
                   1022:                                        zrange = range[2];
                   1023:                                else {
                   1024:                                        MKNODE(n,0,defrange); MKLIST(zrange,n);
                   1025:                                }
                   1026:                        } else
                   1027:                                error("ifplot : invalid argument");
                   1028:                        break;
                   1029:                default:
                   1030:                        error("ifplot : cannot happen"); break;
                   1031:        }
                   1032:        /* conplot in ox_plot requires
1.9       noro     1033:           [s_id (Q),
1.1       noro     1034:                formula (Obj),
                   1035:                xrange=[x,xmin,xmax] (LIST),
                   1036:                yrange=[y,ymin,ymax] (LIST),
                   1037:                zrange=[z,zmin,zmax] (LIST),
                   1038:                geom=[xsize,ysize] (LIST),
                   1039:                wname=name (STRING)]
                   1040:        */
                   1041:
1.13      noro     1042:        stream = validate_ox_plot_stream(stream);
1.9       noro     1043:        STOQ(stream,s_id);
1.1       noro     1044:        if ( !geom ) {
                   1045:                STOQ(300,w300);
                   1046:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                   1047:        }
1.18      noro     1048:        if ( is_memory ) {
                   1049:                MKSTR(fname,"memory_plot");
                   1050:                arg = mknode(7,s_id,fname,poly,xrange,yrange,zrange,geom);
                   1051:                Pox_rpc(arg,&t);
                   1052:                arg = mknode(1,s_id);
                   1053:                Pox_pop_cmo(arg,rp);
                   1054:        } else {
                   1055:                MKSTR(fname,"plot");
                   1056:                arg = mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname);
                   1057:                Pox_rpc(arg,&t);
                   1058:                *rp = (Obj)s_id;
                   1059:        }
                   1060: }
                   1061:
                   1062: void Pplot(NODE arg,Obj *rp)
                   1063: {
                   1064:        plot_main(arg,0,rp);
                   1065: }
                   1066:
                   1067: void Pmemory_plot(NODE arg,Obj *rp)
                   1068: {
                   1069:        plot_main(arg,1,rp);
1.1       noro     1070: }
                   1071:
1.18      noro     1072: void plot_main(NODE arg,int is_memory,Obj *rp)
1.1       noro     1073: {
1.9       noro     1074:        Q m2,p2,w300,s_id;
1.1       noro     1075:        NODE defrange;
                   1076:        LIST xrange,range[1],list,geom;
                   1077:        VL vl,vl0;
                   1078:        V v[1],av[1];
1.11      noro     1079:        int stream,ri,i;
1.1       noro     1080:        P poly;
                   1081:        P var;
                   1082:        NODE n,n0;
                   1083:        STRING fname,wname;
1.13      noro     1084:        Obj t;
1.1       noro     1085:
                   1086:        STOQ(-2,m2); STOQ(2,p2);
                   1087:        MKNODE(n,p2,0); MKNODE(defrange,m2,n);
                   1088:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
1.14      noro     1089:        v[0] = 0;
1.1       noro     1090:        for ( ; arg; arg = NEXT(arg) )
                   1091:                if ( !BDY(arg) )
                   1092:                        stream = 0;
                   1093:                else
                   1094:                switch ( OID(BDY(arg)) ) {
                   1095:                        case O_P: case O_R:
                   1096:                                poly = (P)BDY(arg);
1.11      noro     1097:                                get_vars_recursive((Obj)poly,&vl);
1.1       noro     1098:                                for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
1.11      noro     1099:                                        if ( vl0->v->attr == (pointer)V_IND )
1.1       noro     1100:                                                if ( i >= 1 )
                   1101:                                                        error("ifplot : invalid argument");
                   1102:                                                else
                   1103:                                                        v[i++] = vl0->v;
1.8       noro     1104:                                if ( i != 1 )
                   1105:                                        error("ifplot : invalid argument");
1.1       noro     1106:                                break;
                   1107:                        case O_LIST:
                   1108:                                list = (LIST)BDY(arg);
                   1109:                                if ( OID(BDY(BDY(list))) == O_P )
                   1110:                                        if ( ri > 0 )
                   1111:                                                error("plot : invalid argument");
                   1112:                                        else
                   1113:                                                range[ri++] = list;
                   1114:                                else
                   1115:                                        geom = list;
                   1116:                                break;
                   1117:                        case O_N:
                   1118:                                stream = QTOS((Q)BDY(arg)); break;
                   1119:                        case O_STR:
                   1120:                                wname = (STRING)BDY(arg); break;
                   1121:                        default:
                   1122:                                error("plot : invalid argument"); break;
                   1123:                }
                   1124:        if ( !poly )
                   1125:                error("plot : invalid argument");
                   1126:        switch ( ri ) {
                   1127:                case 0:
                   1128:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n);
                   1129:                        break;
                   1130:                case 1:
                   1131:                        av[0] = VR((P)BDY(BDY(range[0])));
                   1132:                        if ( v[0] == av[0] )
                   1133:                                xrange = range[0];
                   1134:                        else
                   1135:                                error("plot : invalid argument");
                   1136:                        break;
                   1137:                default:
                   1138:                        error("plot : cannot happen"); break;
                   1139:        }
                   1140:        /* conplot in ox_plot requires
1.9       noro     1141:           [s_id (Q),
1.1       noro     1142:                formula (Obj),
                   1143:                xrange=[x,xmin,xmax] (LIST),
                   1144:                yrange=0,
                   1145:                zrange=0,
                   1146:                geom=[xsize,ysize] (LIST),
                   1147:                wname=name (STRING)]
                   1148:        */
1.13      noro     1149:        stream = validate_ox_plot_stream(stream);
1.9       noro     1150:        STOQ(stream,s_id);
1.1       noro     1151:        if ( !geom ) {
                   1152:                STOQ(300,w300);
                   1153:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                   1154:        }
1.18      noro     1155:        if ( is_memory ) {
                   1156:                MKSTR(fname,"memory_plot");
1.21      noro     1157:                arg = mknode(7,s_id,fname,poly,xrange,NULLP,NULLP,geom);
1.18      noro     1158:                Pox_rpc(arg,&t);
                   1159:                arg = mknode(1,s_id);
                   1160:                Pox_pop_cmo(arg,rp);
                   1161:        } else {
                   1162:                MKSTR(fname,"plot");
1.21      noro     1163:                arg = mknode(8,s_id,fname,poly,xrange,NULLP,NULLP,geom,wname);
1.18      noro     1164:                Pox_rpc(arg,&t);
                   1165:                *rp = (Obj)s_id;
                   1166:        }
1.15      noro     1167: }
                   1168:
                   1169: #define Pi 3.14159265358979323846264
                   1170:
                   1171: void Ppolarplot(NODE arg,Q *rp)
                   1172: {
                   1173:        Q m2,p2,w300,s_id;
                   1174:        NODE defrange;
                   1175:        LIST zrange,range[1],list,geom;
                   1176:        VL vl,vl0;
                   1177:        V v[1],av[1];
                   1178:        int stream,ri,i;
                   1179:        P poly;
                   1180:        P var;
                   1181:        NODE n,n0;
                   1182:        STRING fname,wname;
                   1183:        Real pi2;
                   1184:        Obj t;
                   1185:
                   1186:        MKReal(2*Pi,pi2);
                   1187:        MKNODE(n,pi2,0); MKNODE(defrange,0,n);
                   1188:        poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0;
                   1189:        v[0] = 0;
                   1190:        for ( ; arg; arg = NEXT(arg) )
                   1191:                if ( !BDY(arg) )
                   1192:                        stream = 0;
                   1193:                else
                   1194:                switch ( OID(BDY(arg)) ) {
                   1195:                        case O_P: case O_R:
                   1196:                                poly = (P)BDY(arg);
                   1197:                                get_vars_recursive((Obj)poly,&vl);
                   1198:                                for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) )
                   1199:                                        if ( vl0->v->attr == (pointer)V_IND )
                   1200:                                                if ( i >= 1 )
                   1201:                                                        error("polarplot : invalid argument");
                   1202:                                                else
                   1203:                                                        v[i++] = vl0->v;
                   1204:                                if ( i != 1 )
                   1205:                                        error("polarplot : invalid argument");
                   1206:                                break;
                   1207:                        case O_LIST:
                   1208:                                list = (LIST)BDY(arg);
                   1209:                                if ( OID(BDY(BDY(list))) == O_P )
                   1210:                                        if ( ri > 0 )
                   1211:                                                error("polarplot : invalid argument");
                   1212:                                        else
                   1213:                                                range[ri++] = list;
                   1214:                                else
                   1215:                                        geom = list;
                   1216:                                break;
                   1217:                        case O_N:
                   1218:                                stream = QTOS((Q)BDY(arg)); break;
                   1219:                        case O_STR:
                   1220:                                wname = (STRING)BDY(arg); break;
                   1221:                        default:
                   1222:                                error("polarplot : invalid argument"); break;
                   1223:                }
                   1224:        if ( !poly )
                   1225:                error("polarplot : invalid argument");
                   1226:        switch ( ri ) {
                   1227:                case 0:
                   1228:                        MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(zrange,n);
                   1229:                        break;
                   1230:                case 1:
                   1231:                        av[0] = VR((P)BDY(BDY(range[0])));
                   1232:                        if ( v[0] == av[0] )
                   1233:                                zrange = range[0];
                   1234:                        else
                   1235:                                error("polarplot : invalid argument");
                   1236:                        break;
                   1237:                default:
                   1238:                        error("polarplot : cannot happen"); break;
                   1239:        }
                   1240:        stream = validate_ox_plot_stream(stream);
                   1241:        STOQ(stream,s_id);
                   1242:        if ( !geom ) {
                   1243:                STOQ(300,w300);
                   1244:                MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n);
                   1245:        }
                   1246:        MKSTR(fname,"plot");
1.21      noro     1247:        arg = mknode(8,s_id,fname,poly,NULLP,NULLP,zrange,geom,wname);
1.13      noro     1248:        Pox_rpc(arg,&t);
                   1249:        *rp = s_id;
1.1       noro     1250: }
                   1251:
1.13      noro     1252: void Pplotover(NODE arg,Q *rp)
1.1       noro     1253: {
1.9       noro     1254:        Q s_id,index;
1.1       noro     1255:        P poly;
                   1256:        STRING fname;
1.13      noro     1257:        Obj t;
1.1       noro     1258:
                   1259:        poly = (P)ARG0(arg);
1.9       noro     1260:        s_id = (Q)ARG1(arg);
1.1       noro     1261:        index = (Q)ARG2(arg);
                   1262:        MKSTR(fname,"plotover");
1.17      noro     1263:        if ( argc(arg) == 4 )
                   1264:                arg = mknode(5,s_id,fname,index,poly,(Q)ARG3(arg));
                   1265:        else
                   1266:                arg = mknode(4,s_id,fname,index,poly);
1.13      noro     1267:        Pox_rpc(arg,&t);
                   1268:        *rp = s_id;
1.1       noro     1269: }
                   1270:
1.22      saito    1271: /* arg = [x,y,r,s_id,index] */
1.1       noro     1272:
1.13      noro     1273: void Pdrawcircle(NODE arg,Q *rp)
1.1       noro     1274: {
1.9       noro     1275:        Q s_id,index;
1.20      noro     1276:        Obj x,y,r,c;
1.1       noro     1277:        STRING fname;
                   1278:        NODE n;
                   1279:        LIST pos;
1.13      noro     1280:        Obj t;
1.1       noro     1281:
                   1282:        x = (Obj)ARG0(arg);
                   1283:        y = (Obj)ARG1(arg);
                   1284:        r = (Obj)ARG2(arg);
1.19      saito    1285:        c = (Obj)ARG3(arg);
                   1286:        s_id = (Q)ARG4(arg);
                   1287:        index = (Q)ARG5(arg);
1.1       noro     1288:        MKSTR(fname,"drawcircle");
1.22      saito    1289:        n = mknode(3,x,y,r,c); MKLIST(pos,n);
1.19      saito    1290:        arg = mknode(5,s_id,fname,index,pos,c);
1.13      noro     1291:        Pox_rpc(arg,&t);
                   1292:        *rp = s_id;
1.6       noro     1293: }
                   1294:
1.9       noro     1295: /* draw_obj(s_id,cindex,point|line); point = [x,y], line = [xa,ya,xb,yb] */
1.13      noro     1296: void Pdraw_obj(NODE arg,Q *rp)
1.6       noro     1297: {
                   1298:        static STRING fname;
1.9       noro     1299:        Q s_id,index;
1.6       noro     1300:        LIST obj;
1.13      noro     1301:        Obj t;
1.6       noro     1302:
                   1303:        if ( !fname ) {
                   1304:                MKSTR(fname,"draw_obj");
                   1305:        }
1.9       noro     1306:        s_id = (Q)ARG0(arg);
1.6       noro     1307:        index = (Q)ARG1(arg);
                   1308:        obj = (LIST)ARG2(arg);
1.7       noro     1309:        /* ARG3(arg) = color */
                   1310:        if ( argc(arg) == 4 )
1.9       noro     1311:                arg = mknode(5,s_id,fname,index,obj,ARG3(arg));
1.7       noro     1312:        else
1.9       noro     1313:                arg = mknode(4,s_id,fname,index,obj);
1.13      noro     1314:        Pox_cmo_rpc(arg,&t);
                   1315:        *rp = s_id;
1.12      noro     1316: }
                   1317:
                   1318: /* draw_string(s_id,cindex,pos,string,[,color]); pos=[x,y] */
1.13      noro     1319: void Pdraw_string(NODE arg,Q *rp)
1.12      noro     1320: {
                   1321:        static STRING fname;
                   1322:        STRING str;
                   1323:        Q s_id,index;
                   1324:        LIST pos;
1.13      noro     1325:        Obj t;
1.12      noro     1326:
                   1327:        if ( !fname ) {
                   1328:                MKSTR(fname,"draw_string");
                   1329:        }
                   1330:        s_id = (Q)ARG0(arg);
                   1331:        index = (Q)ARG1(arg);
                   1332:        pos = (LIST)ARG2(arg);
                   1333:        str = (STRING)ARG3(arg);
                   1334:        /* ARG4(arg) = color */
                   1335:        if ( argc(arg) == 5 )
                   1336:                arg = mknode(6,s_id,fname,index,pos,str,ARG4(arg));
                   1337:        else
                   1338:                arg = mknode(5,s_id,fname,index,pos,str);
1.13      noro     1339:        Pox_cmo_rpc(arg,&t);
                   1340:        *rp = s_id;
1.6       noro     1341: }
                   1342:
1.13      noro     1343: void Pclear_canvas(NODE arg,Q *rp)
1.6       noro     1344: {
                   1345:        static STRING fname;
1.9       noro     1346:        Q s_id,index;
1.13      noro     1347:        Obj t;
1.6       noro     1348:
                   1349:        if ( !fname ) {
                   1350:                MKSTR(fname,"clear_canvas");
                   1351:        }
1.9       noro     1352:        s_id = (Q)ARG0(arg);
1.6       noro     1353:        index = (Q)ARG1(arg);
1.9       noro     1354:        arg = mknode(3,s_id,fname,index);
1.13      noro     1355:        Pox_cmo_rpc(arg,&t);
                   1356:        *rp = s_id;
1.1       noro     1357: }
                   1358:
                   1359: #if 0
1.11      noro     1360: void Parrayplot(NODE arg,Obj *rp)
1.1       noro     1361: {
                   1362:        int s;
                   1363:        int id;
                   1364:
                   1365:        if ( ID((Obj)ARG0(arg)) == O_VECT && ID((Obj)ARG1(arg)) == O_LIST ) {
                   1366:                s = current_s;
                   1367:                gensend(s,C_APLOT,0);
                   1368:                gensend(s,C_OBJ,ARG0(arg)); gensend(s,C_OBJ,ARG1(arg)); genflush(s);
                   1369:        }
                   1370:        genrecv(s,&id,rp);
                   1371: }
                   1372: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>