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

Annotation of OpenXM_contrib2/asir2000/plot/ox_plot.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/plot/ox_plot.c,v 1.3 1999/11/19 05:51:24 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4: #include "ox.h"
        !             5: #include "ifplot.h"
        !             6: #include "version.h"
        !             7:
        !             8: void ox_usr1_handler();
        !             9:
        !            10: extern jmp_buf environnement;
        !            11:
        !            12: extern int do_message;
        !            13: extern int ox_flushing;
        !            14: extern jmp_buf ox_env;
        !            15: extern MATHCAP my_mathcap;
        !            16:
        !            17: static int plot_OperandStackSize;
        !            18: static Obj *plot_OperandStack;
        !            19: static int plot_OperandStackPtr = -1;
        !            20:
        !            21: static void create_error(ERR *,unsigned int ,char *);
        !            22: static void process_ox();
        !            23: static void ox_io_init();
        !            24: static void ox_asir_init(int,char **);
        !            25: static Obj asir_pop_one();
        !            26: static void asir_push_one(Obj);
        !            27: static void asir_end_flush();
        !            28: static void asir_executeFunction();
        !            29: static int asir_executeString();
        !            30: static void asir_evalName(unsigned int);
        !            31: static void asir_setName(unsigned int);
        !            32: static void asir_pops();
        !            33: static void asir_popString();
        !            34: static void asir_popCMO(unsigned int);
        !            35: static void asir_popSerializedLocalObject();
        !            36: static char *name_of_cmd(unsigned int);
        !            37: static char *name_of_id(int);
        !            38: static void asir_do_cmd(unsigned int,unsigned int);
        !            39:
        !            40: static void create_error(ERR *err,unsigned int serial,char *msg)
        !            41: {
        !            42:        USINT ui;
        !            43:        NODE n,n1;
        !            44:        LIST list;
        !            45:        STRING errmsg;
        !            46:
        !            47:        MKUSINT(ui,serial);
        !            48:        MKSTR(errmsg,msg);
        !            49:        MKNODE(n1,errmsg,0); MKNODE(n,ui,n1); MKLIST(list,n);
        !            50:        MKERR(*err,list);
        !            51: }
        !            52:
        !            53: void ox_plot_main(int argc,char **argv) {
        !            54:        int ds;
        !            55:        fd_set r;
        !            56:        int n;
        !            57:
        !            58:        ox_asir_init(argc,argv);
        !            59:        init_plot_display(argc,argv);
        !            60:        ds = ConnectionNumber(display);
        !            61:        if ( do_message )
        !            62:                fprintf(stderr,"I'm an ox_plot, Version %d.\n",ASIR_VERSION);
        !            63:
        !            64:        if ( setjmp(ox_env) ) {
        !            65:                while ( NEXT(asir_infile) )
        !            66:                        closecurrentinput();
        !            67:                reset_current_computation();
        !            68:                ox_send_sync(0);
        !            69:        }
        !            70:        while ( 1 ) {
        !            71:                if ( ox_data_is_available(0) )
        !            72:                        process_ox();
        !            73:                else {
        !            74:                        FD_ZERO(&r);
        !            75:                        FD_SET(3,&r); FD_SET(ds,&r);
        !            76:                        select(FD_SETSIZE,&r,NULL,NULL,NULL);
        !            77:                        if ( FD_ISSET(3,&r) )
        !            78:                                process_ox();
        !            79:                        else if ( FD_ISSET(ds,&r) )
        !            80:                                process_xevent();
        !            81:                }
        !            82:        }
        !            83: }
        !            84:
        !            85: static void process_ox()
        !            86: {
        !            87:        int id;
        !            88:        unsigned int cmd;
        !            89:        Obj obj;
        !            90:        ERR err;
        !            91:        unsigned int serial;
        !            92:        int ret;
        !            93:        extern char LastError[];
        !            94:
        !            95:        serial = ox_recv(0,&id,&obj);
        !            96:        if ( do_message )
        !            97:                fprintf(stderr,"#%d Got %s",serial,name_of_id(id));
        !            98:        switch ( id ) {
        !            99:                case OX_COMMAND:
        !           100:                        cmd = ((USINT)obj)->body;
        !           101:                        if ( ox_flushing )
        !           102:                                break;
        !           103:                        if ( do_message )
        !           104:                                fprintf(stderr," %s\n",name_of_cmd(cmd));
        !           105:                        if ( ret = setjmp(env) ) {
        !           106:                                if ( ret == 1 ) {
        !           107:                                        create_error(&err,serial,LastError);
        !           108:                                        asir_push_one((Obj)err);
        !           109:                                }
        !           110:                                break;
        !           111:                        }
        !           112:                        asir_do_cmd(cmd,serial);
        !           113:                        break;
        !           114:                case OX_DATA:
        !           115:                case OX_LOCAL_OBJECT_ASIR:
        !           116:                        if ( ox_flushing )
        !           117:                                break;
        !           118:                        if ( do_message )
        !           119:                                fprintf(stderr," -> data pushed");
        !           120:                        asir_push_one(obj);
        !           121:                        break;
        !           122:                case OX_SYNC_BALL:
        !           123:                                asir_end_flush();
        !           124:                        break;
        !           125:                default:
        !           126:                        break;
        !           127:        }
        !           128:        if ( do_message )
        !           129:                fprintf(stderr,"\n");
        !           130: }
        !           131:
        !           132: static void asir_do_cmd(unsigned int cmd,unsigned int serial)
        !           133: {
        !           134:        MATHCAP client_mathcap;
        !           135:
        !           136:        switch ( cmd ) {
        !           137:                case SM_popSerializedLocalObject:
        !           138:                        asir_popSerializedLocalObject();
        !           139:                        break;
        !           140:                case SM_popCMO:
        !           141:                        asir_popCMO(serial);
        !           142:                        break;
        !           143:                case SM_popString:
        !           144:                        asir_popString();
        !           145:                        break;
        !           146:                case SM_setName:
        !           147:                        asir_setName(serial);
        !           148:                        break;
        !           149:                case SM_evalName:
        !           150:                        asir_evalName(serial);
        !           151:                        break;
        !           152:                case SM_executeStringByLocalParser:
        !           153:                        asir_executeString();
        !           154:                        break;
        !           155:                case SM_executeFunction:
        !           156:                        asir_executeFunction();
        !           157:                        break;
        !           158:                case SM_shutdown:
        !           159:                        asir_terminate(2);
        !           160:                        break;
        !           161:                case SM_pops:
        !           162:                        asir_pops();
        !           163:                        break;
        !           164:                case SM_mathcap:
        !           165:                        asir_push_one((Obj)my_mathcap);
        !           166:                        break;
        !           167:                case SM_setMathcap:
        !           168:                        client_mathcap = (MATHCAP)asir_pop_one();
        !           169:                        store_remote_mathcap(0,client_mathcap);
        !           170:                        break;
        !           171:                default:
        !           172:                        break;
        !           173:        }
        !           174: }
        !           175:
        !           176: static char *name_of_id(int id)
        !           177: {
        !           178:        switch ( id ) {
        !           179:                case OX_COMMAND:
        !           180:                        return "OX_COMMAND";
        !           181:                        break;
        !           182:                case OX_DATA:
        !           183:                        return "OX_DATA";
        !           184:                        break;
        !           185:                case OX_LOCAL_OBJECT_ASIR:
        !           186:                        return "OX_LOCAL_OBJECT_ASIR";
        !           187:                        break;
        !           188:                case OX_SYNC_BALL:
        !           189:                        return "OX_SYNC_BALL";
        !           190:                        break;
        !           191:                default:
        !           192:                        return "Unknown id";
        !           193:                        break;
        !           194:        }
        !           195: }
        !           196:
        !           197: static char *name_of_cmd(unsigned cmd)
        !           198: {
        !           199:        switch ( cmd ) {
        !           200:                case SM_popSerializedLocalObject:
        !           201:                        return "SM_popSerializedLocalObject";
        !           202:                        break;
        !           203:                case SM_popCMO:
        !           204:                        return "SM_popCMO";
        !           205:                        break;
        !           206:                case SM_popString:
        !           207:                        return "SM_popString";
        !           208:                        break;
        !           209:                case SM_pops:
        !           210:                        return "SM_pops";
        !           211:                        break;
        !           212:                case SM_setName:
        !           213:                        return "SM_setName";
        !           214:                        break;
        !           215:                case SM_evalName:
        !           216:                        return "SM_evalName";
        !           217:                        break;
        !           218:                case SM_executeStringByLocalParser:
        !           219:                        return "SM_executeString";
        !           220:                        break;
        !           221:                case SM_executeFunction:
        !           222:                        return "SM_executeFunction";
        !           223:                        break;
        !           224:                case SM_shutdown:
        !           225:                        return "SM_shutdown";
        !           226:                        break;
        !           227:                case SM_beginBlock:
        !           228:                        return "SM_beginBlock";
        !           229:                        break;
        !           230:                case SM_endBlock:
        !           231:                        return "SM_endBlock";
        !           232:                        break;
        !           233:                case SM_mathcap:
        !           234:                        return "SM_mathcap";
        !           235:                        break;
        !           236:                case SM_setMathcap:
        !           237:                        return "SM_setMathcap";
        !           238:                        break;
        !           239:                default:
        !           240:                        return "Unknown cmd";
        !           241:                        break;
        !           242:        }
        !           243: }
        !           244:
        !           245: static void asir_popSerializedLocalObject()
        !           246: {
        !           247:        Obj obj;
        !           248:        VL t,vl;
        !           249:
        !           250:        obj = asir_pop_one();
        !           251:        get_vars(obj,&vl);
        !           252:        for ( t = vl; t; t = NEXT(t) )
        !           253:                if ( t->v->attr == (pointer)V_UC || t->v->attr == (pointer)V_PF )
        !           254:                        error("bsave : not implemented");
        !           255:        ox_send_cmd(0,SM_beginBlock);
        !           256:        ox_send_local_ring(0,vl);
        !           257:        ox_send_local_data(0,obj);
        !           258:        ox_send_cmd(0,SM_endBlock);
        !           259: }
        !           260:
        !           261: static void asir_popCMO(unsigned int serial)
        !           262: {
        !           263:        Obj obj;
        !           264:        ERR err;
        !           265:
        !           266:        obj = asir_pop_one();
        !           267:        if ( valid_as_cmo(obj) )
        !           268:                ox_send_data(0,obj);
        !           269:        else {
        !           270:                create_error(&err,serial,"cannot convert to CMO object");
        !           271:                ox_send_data(0,err);
        !           272:                asir_push_one(obj);
        !           273:        }
        !           274: }
        !           275:
        !           276: static void asir_popString()
        !           277: {
        !           278:        Obj val;
        !           279:        char *buf,*obuf;
        !           280:        int l;
        !           281:        STRING str;
        !           282:
        !           283:        val = asir_pop_one();
        !           284:        if ( !val )
        !           285:                obuf = 0;
        !           286:        else {
        !           287:                l = estimate_length(CO,val);
        !           288:                buf = (char *)ALLOCA(l+1);
        !           289:                soutput_init(buf);
        !           290:                sprintexpr(CO,val);
        !           291:                l = strlen(buf);
        !           292:                obuf = (char *)MALLOC(l+1);
        !           293:                strcpy(obuf,buf);
        !           294:        }
        !           295:        MKSTR(str,obuf);
        !           296:        ox_send_data(0,str);
        !           297: }
        !           298:
        !           299: static void asir_pops()
        !           300: {
        !           301:        int n;
        !           302:
        !           303:        n = (int)(((USINT)asir_pop_one())->body);
        !           304:        plot_OperandStackPtr = MAX(plot_OperandStackPtr-n,-1);
        !           305: }
        !           306:
        !           307: static void asir_setName(unsigned int serial)
        !           308: {
        !           309:        char *name;
        !           310:        int l,n;
        !           311:        char *dummy = "=0;";
        !           312:        SNODE snode;
        !           313:        ERR err;
        !           314:
        !           315:        name = ((STRING)asir_pop_one())->body;
        !           316:        l = strlen(name);
        !           317:        n = l+strlen(dummy)+1;
        !           318:        parse_strp = (char *)ALLOCA(n);
        !           319:        sprintf(parse_strp,"%s%s",name,dummy);
        !           320:        if ( mainparse(&snode) ) {
        !           321:                create_error(&err,serial,"cannot set to variable");
        !           322:                asir_push_one((Obj)err);
        !           323:        } else {
        !           324:                FA1((FNODE)FA0(snode)) = (pointer)mkfnode(1,I_FORMULA,asir_pop_one());
        !           325:                evalstat(snode);
        !           326:        }
        !           327: }
        !           328:
        !           329: static void asir_evalName(unsigned int serial)
        !           330: {
        !           331:        char *name;
        !           332:        int l,n;
        !           333:        SNODE snode;
        !           334:        ERR err;
        !           335:        pointer val;
        !           336:
        !           337:        name = ((STRING)asir_pop_one())->body;
        !           338:        l = strlen(name);
        !           339:        n = l+2;
        !           340:        parse_strp = (char *)ALLOCA(n);
        !           341:        sprintf(parse_strp,"%s;",name);
        !           342:        if ( mainparse(&snode) ) {
        !           343:                create_error(&err,serial,"no such variable");
        !           344:                val = (pointer)err;
        !           345:        } else
        !           346:                val = evalstat(snode);
        !           347:        asir_push_one(val);
        !           348: }
        !           349:
        !           350: static int asir_executeString()
        !           351: {
        !           352:        SNODE snode;
        !           353:        pointer val;
        !           354:        char *cmd;
        !           355: #if PARI
        !           356:        recover(0);
        !           357:        if ( setjmp(environnement) ) {
        !           358:                avma = top; recover(1);
        !           359:                resetenv("");
        !           360:        }
        !           361: #endif
        !           362:        cmd = ((STRING)asir_pop_one())->body;
        !           363:        parse_strp = cmd;
        !           364:        if ( mainparse(&snode) ) {
        !           365:                return -1;
        !           366:        }
        !           367:        val = evalstat(snode);
        !           368:        if ( NEXT(asir_infile) ) {
        !           369:                while ( NEXT(asir_infile) ) {
        !           370:                        if ( mainparse(&snode) ) {
        !           371:                                asir_push_one(val);
        !           372:                                return -1;
        !           373:                        }
        !           374:                        nextbp = 0;
        !           375:                        val = evalstat(snode);
        !           376:                }
        !           377:        }
        !           378:        asir_push_one(val);
        !           379:        return 0;
        !           380: }
        !           381:
        !           382: static void asir_executeFunction()
        !           383: {
        !           384:        char *func;
        !           385:        int argc;
        !           386:        int id;
        !           387:        FUNC f;
        !           388:        Q ret;
        !           389:        VL vl;
        !           390:        NODE n,n1;
        !           391:
        !           392:        func = ((STRING)asir_pop_one())->body;
        !           393:        argc = (int)(((USINT)asir_pop_one())->body);
        !           394:
        !           395:        for ( n = 0; argc; argc-- ) {
        !           396:                NEXTNODE(n,n1);
        !           397:                BDY(n1) = (pointer)asir_pop_one();
        !           398:        }
        !           399:        if ( n )
        !           400:                NEXT(n1) = 0;
        !           401:        id = -1;
        !           402:        if ( !strcmp(func,"plot") )
        !           403:                id = plot(n);
        !           404:        else if ( !strcmp(func,"arrayplot") )
        !           405:                id = arrayplot(n);
        !           406:        else if ( !strcmp(func,"plotover") )
        !           407:                id = plotover(n);
        !           408:        else if ( !strcmp(func,"drawcircle") )
        !           409:                id = drawcircle(n);
        !           410:        STOQ(id,ret);
        !           411: #if 0
        !           412:        asir_push_one((Obj)ret);
        !           413: #endif
        !           414: }
        !           415:
        !           416: static void asir_end_flush()
        !           417: {
        !           418:        ox_flushing = 0;
        !           419: }
        !           420:
        !           421: static void asir_push_one(Obj obj)
        !           422: {
        !           423:        if ( !obj || OID(obj) != O_VOID ) {
        !           424:                plot_OperandStackPtr++;
        !           425:                if ( plot_OperandStackPtr >= plot_OperandStackSize ) {
        !           426:                        plot_OperandStackSize += BUFSIZ;
        !           427:                        plot_OperandStack
        !           428:                                = (Obj *)REALLOC(plot_OperandStack,
        !           429:                                        plot_OperandStackSize*sizeof(Obj));
        !           430:                }
        !           431:                plot_OperandStack[plot_OperandStackPtr] = obj;
        !           432:        }
        !           433: }
        !           434:
        !           435: static Obj asir_pop_one() {
        !           436:        if ( plot_OperandStackPtr < 0 ) {
        !           437:                if ( do_message )
        !           438:                        fprintf(stderr,"OperandStack underflow");
        !           439:                return 0;
        !           440:        } else {
        !           441:                if ( do_message )
        !           442:                        fprintf(stderr,"pop at %d\n",plot_OperandStackPtr);
        !           443:                return plot_OperandStack[plot_OperandStackPtr--];
        !           444:        }
        !           445: }
        !           446:
        !           447: static void ox_asir_init(int argc,char **argv)
        !           448: {
        !           449:        int tmp;
        !           450:        char ifname[BUFSIZ];
        !           451:        extern int GC_dont_gc;
        !           452:        extern int read_exec_file;
        !           453:        extern int do_asirrc;
        !           454:        extern int do_server_in_X11;
        !           455:        char *getenv();
        !           456:        static ox_asir_initialized = 0;
        !           457:        FILE *ifp;
        !           458:
        !           459:        do_server_in_X11 = 1; /* XXX */
        !           460:        asir_save_handler();
        !           461: #if PARI
        !           462:        risa_pari_init();
        !           463: #endif
        !           464:        srandom((int)get_current_time());
        !           465:
        !           466: #if defined(THINK_C)
        !           467:        param_init();
        !           468: #endif
        !           469:        StackBottom = &tmp + 1; /* XXX */
        !           470:        rtime_init();
        !           471:        env_init();
        !           472:        endian_init();
        !           473: #if !defined(VISUAL) && !defined(THINK_C)
        !           474: /*     check_key(); */
        !           475: #endif
        !           476:        GC_init();
        !           477:        process_args(--argc,++argv);
        !           478: #if 0
        !           479:        copyright();
        !           480: #endif
        !           481:        output_init();
        !           482:        arf_init();
        !           483:        nglob_init();
        !           484:        glob_init();
        !           485:        sig_init();
        !           486:        tty_init();
        !           487:        debug_init();
        !           488:        pf_init();
        !           489:        sysf_init();
        !           490:        parif_init();
        !           491: #if defined(VISUAL)
        !           492:        init_socket();
        !           493: #endif
        !           494: #if defined(UINIT)
        !           495:        reg_sysf();
        !           496: #endif
        !           497: #if defined(THINK_C)
        !           498:        sprintf(ifname,"asirrc");
        !           499: #else
        !           500:        sprintf(ifname,"%s/.asirrc",getenv("HOME"));
        !           501: #endif
        !           502:        if ( do_asirrc && (ifp = fopen(ifname,"r")) ) {
        !           503:                input_init(ifp,ifname);
        !           504:                if ( !setjmp(env) ) {
        !           505:                        read_exec_file = 1;
        !           506:                        read_eval_loop();
        !           507:                        read_exec_file = 0;
        !           508:                }
        !           509:                fclose(ifp);
        !           510:        }
        !           511:        input_init(0,"string");
        !           512:        ox_io_init();
        !           513:        create_my_mathcap("ox_plot");
        !           514: }
        !           515:
        !           516: static void ox_io_init() {
        !           517:        unsigned char c,rc;
        !           518:        extern int little_endian;
        !           519:
        !           520:        endian_init();
        !           521:        iofp[0].in = fdopen(3,"r");
        !           522:        iofp[0].out = fdopen(4,"w");
        !           523:        setbuffer(iofp[0].in,(char *)malloc(LBUFSIZ),LBUFSIZ);
        !           524:        setbuffer(iofp[0].out,(char *)malloc(LBUFSIZ),LBUFSIZ);
        !           525:        plot_OperandStackSize = BUFSIZ;
        !           526:        plot_OperandStack = (Obj *)CALLOC(plot_OperandStackSize,sizeof(Obj));
        !           527:        plot_OperandStackPtr = -1;
        !           528:        signal(SIGUSR1,ox_usr1_handler);
        !           529:        if ( little_endian )
        !           530:                c = 1;
        !           531:        else
        !           532:                c = 0xff;
        !           533:        write_char(iofp[0].out,&c); ox_flush_stream(0);
        !           534:        read_char(iofp[0].in,&rc);
        !           535:        iofp[0].conv = c == rc ? 0 : 1;
        !           536: }

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