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

Annotation of OpenXM_contrib2/asir2000/parse/asir_sm.c, Revision 1.1.1.1

1.1       noro        1: /* $OpenXM: OpenXM/src/asir99/parse/asir_sm.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
                      2: #include "ca.h"
                      3: #include "parse.h"
                      4: #if defined(THINK_C)
                      5: #include <console.h>
                      6: #endif
                      7:
                      8: #if PARI
                      9: #include "genpari.h"
                     10:
                     11: extern jmp_buf environnement;
                     12: #endif
                     13:
                     14: extern jmp_buf env;
                     15: extern int *StackBottom;
                     16: extern int ox_do_copy, ox_do_count, ox_count_length;
                     17: extern char *ox_copy_bptr;
                     18:
                     19: Obj Asir_OperandStack[BUFSIZ];
                     20: char *Asir_DebugStack[BUFSIZ];
                     21: int Asir_OperandStackPtr;
                     22: int Asir_DebugStackPtr;
                     23:
                     24: Asir_Start()
                     25: {
                     26:        int tmp;
                     27:        FILE *ifp;
                     28:        char ifname[BUFSIZ];
                     29:        extern int GC_dont_gc;
                     30:        extern int read_exec_file;
                     31:        extern int do_asirrc;
                     32:        char *getenv();
                     33:        static ox_asir_initialized = 0;
                     34:
                     35:        asir_save_handler();
                     36:        if ( ox_asir_initialized )
                     37:                return;
                     38:        ox_asir_initialized = 1;
                     39:        ox_do_copy = 1;
                     40: #if defined(THINK_C)
                     41:        param_init();
                     42: #endif
                     43:        StackBottom = &tmp + 1; /* XXX */
                     44:        rtime_init();
                     45:        env_init();
                     46:        endian_init();
                     47: #if !defined(TOWNS) && !defined(THINK_C)
                     48: /*     check_key(); */
                     49: #endif
                     50: #if defined(TOWNS) && !defined(GO32) && !defined(__WIN32__)
                     51:        disable_ctrl_c();
                     52: #endif
                     53:        GC_init();
                     54: /*     process_args(argc,argv); */
                     55: #if 0
                     56:        copyright();
                     57: #endif
                     58:        output_init();
                     59:        arf_init();
                     60:        nglob_init();
                     61:        glob_init();
                     62:        sig_init();
                     63:        tty_init();
                     64:        debug_init();
                     65:        pf_init();
                     66:        sysf_init();
                     67:        parif_init();
                     68: #if defined(UINIT)
                     69:        reg_sysf();
                     70: #endif
                     71: #if defined(THINK_C) || defined(TOWNS)
                     72:        sprintf(ifname,"asirrc");
                     73: #else
                     74:        sprintf(ifname,"%s/.asirrc",getenv("HOME"));
                     75: #endif
                     76:        asir_set_handler();
                     77:        if ( do_asirrc && (ifp = fopen(ifname,"r")) ) {
                     78:                input_init(ifp,ifname);
                     79:                if ( !setjmp(env) ) {
                     80:                        read_exec_file = 1;
                     81:                        read_eval_loop();
                     82:                }
                     83:                fclose(ifp);
                     84:        }
                     85:        asir_reset_handler();
                     86:        input_init(0,"string");
                     87:        Asir_OperandStackPtr = Asir_DebugStackPtr = -1;
                     88: }
                     89:
                     90: char *Asir_PopBinary();
                     91: char *Asir_PopString();
                     92: Obj asir_pop_obj();
                     93:
                     94: extern char *parse_strp;
                     95: extern int ox_do_copy;
                     96:
                     97: int Asir_ExecuteString(s)
                     98: char *s;
                     99: {
                    100:        SNODE snode;
                    101:        pointer val;
                    102: #if PARI
                    103:        static long tloc,listloc;
                    104:        extern long avloc;
                    105:
                    106:        Asir_Start();
                    107:        asir_set_handler();
                    108:        avloc = avma; tloc = tglobal; listloc = marklist();
                    109:        if ( setjmp(environnement) ) {
                    110:                avma = avloc; tglobal = tloc; recover(listloc);
                    111:                resetenv("");
                    112:        }
                    113: #endif
                    114:        if ( setjmp(env) ) {
                    115:                asir_reset_handler();
                    116:                return -1;
                    117:        }
                    118:        parse_strp = s;
                    119:        if ( mainparse(&snode) ) {
                    120:                asir_reset_handler();
                    121:                return -1;
                    122:        }
                    123:        val = evalstat(snode);
                    124:        if ( NEXT(asir_infile) ) {
                    125:                while ( NEXT(asir_infile) ) {
                    126:                        if ( mainparse(&snode) ) {
                    127:                                asir_push_obj(val);
                    128:                                asir_reset_handler();
                    129:                                return -1;
                    130:                        }
                    131:                        nextbp = 0;
                    132:                        val = evalstat(snode);
                    133:                }
                    134:        }
                    135:        asir_push_obj(val);
                    136:        asir_reset_handler();
                    137:        return 0;
                    138: }
                    139:
                    140: char *Asir_PopString()
                    141: {
                    142:        Obj val;
                    143:        char *buf,*obuf;
                    144:        int l;
                    145:
                    146:        Asir_Start();
                    147:        val = asir_pop_obj();
                    148:        if ( !val )
                    149:                return 0;
                    150:        else {
                    151:                l = estimate_length(CO,val);
                    152:                buf = (char *)ALLOCA(l+1);
                    153:                soutput_init(buf);
                    154:                sprintexpr(CO,val);
                    155:                l = strlen(buf);
                    156:                obuf = (char *)GC_malloc(l+1);
                    157:                strcpy(obuf,buf);
                    158:                return obuf;
                    159:        }
                    160: }
                    161:
                    162: int Asir_Set(name)
                    163: char *name;
                    164: {
                    165:        int l,n;
                    166:        char *dummy = "=0;";
                    167:        SNODE snode;
                    168:
                    169:        Asir_Start();
                    170:        l = strlen(name);
                    171:        n = l+strlen(dummy)+1;
                    172:        parse_strp = (char *)ALLOCA(n);
                    173:        sprintf(parse_strp,"%s%s",name,dummy);
                    174:        if ( mainparse(&snode) )
                    175:                return -1;
                    176:        FA1((FNODE)FA0(snode)) = (pointer)mkfnode(1,I_FORMULA,asir_pop_obj());
                    177:        evalstat(snode);
                    178:        return 0;
                    179: }
                    180:
                    181: int Asir_PushBinary(size,data)
                    182: int size;
                    183: char *data;
                    184: {
                    185:        Obj val;
                    186:
                    187:        Asir_Start();
                    188:        ox_copy_bptr = data;
                    189:        loadvl(0);
                    190:        loadobj(0,&val);
                    191:        asir_push_obj(val);
                    192:        ox_copy_bptr = 0;
                    193: }
                    194:
                    195: char *Asir_PopBinary(size)
                    196: int *size;
                    197: {
                    198:        Obj val;
                    199:        char *buf;
                    200:        VL vl,t;
                    201:
                    202:        Asir_Start();
                    203:        val = asir_pop_obj();
                    204:        get_vars(val,&vl);
                    205:        for ( t = vl; t; t = NEXT(t) )
                    206:                if ( t->v->attr == (pointer)V_UC || t->v->attr == (pointer)V_PF )
                    207:                        error("bsave : not implemented");
                    208:        ox_count_length = 0; ox_do_count = 1;
                    209:        savevl(0,vl);
                    210:        saveobj(0,val);
                    211:        *size = ox_count_length;
                    212:        ox_count_length = 0; ox_do_count = 0;
                    213:        ox_copy_bptr = buf = (char *)GC_malloc(*size);
                    214:        savevl(0,vl);
                    215:        saveobj(0,val);
                    216:        ox_copy_bptr = 0;
                    217:        return buf;
                    218: }
                    219:
                    220: asir_push_obj(obj)
                    221: Obj obj;
                    222: {
                    223:        Asir_OperandStack[++Asir_OperandStackPtr] = obj;
                    224: }
                    225:
                    226: Obj asir_pop_obj() {
                    227:        if ( Asir_OperandStackPtr < 0 )
                    228:                return 0;
                    229:        else
                    230:                return Asir_OperandStack[Asir_OperandStackPtr--];
                    231: }

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