Annotation of researchv10no/cmd/basic/bas/def.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "ctype.h"
        !             3: #include "typedef.h"
        !             4: #include "basic.h"
        !             5: #include "tokens.h"
        !             6: 
        !             7: Symptr getvar();
        !             8: Stkptr nextframe();
        !             9: 
        !            10: 
        !            11: /*
        !            12:  * def --- define a function (just save input pointer for now)
        !            13:  */
        !            14: 
        !            15: def()
        !            16: {
        !            17:        register Symptr v;
        !            18:        int             type;
        !            19: 
        !            20:        if (*inptr != FN)
        !            21:                badsyn();
        !            22:        v = getvar(&type, NO);
        !            23:        v->v_un.v_fn.fn_curline = curline;
        !            24:        v->v_un.v_fn.fn_inptr = inptr;
        !            25:        while (!endtest())
        !            26:                ++inptr;
        !            27: }
        !            28: 
        !            29: 
        !            30: /*
        !            31:  * fn --- invoke a previously defined function
        !            32:  */
        !            33: 
        !            34: fn()
        !            35: {
        !            36:        register Symptr f;
        !            37:        register char   *s;
        !            38:        Stkfr           var;
        !            39:        int             type, vtype, i, n;
        !            40:        char            *base, *v, *saveptr;
        !            41:        Linep           saveline;
        !            42: 
        !            43:        base = stkptr;
        !            44:        f = getvar(&type, NO);
        !            45:        if (f->v_un.v_fn.fn_inptr == NULL)
        !            46:                err("function undefined");
        !            47:        expectc(LPAR);
        !            48:        for (n = 0; !endtest(); ) {
        !            49:                expr();
        !            50:                ++n;
        !            51:                if (*inptr == RPAR)
        !            52:                        break;
        !            53:                expectc(COMMA);
        !            54:                }
        !            55:        expectc(RPAR);
        !            56:        s = stkptr;
        !            57: 
        !            58:        saveline = curline;
        !            59:        saveptr = inptr;
        !            60:        curline = f->v_un.v_fn.fn_curline;
        !            61:        inptr = f->v_un.v_fn.fn_inptr;
        !            62:        expectc(LPAR);
        !            63:        for (i = 1; i <= n; ++i) {
        !            64:                var.k_un.k_symp = getvar(&vtype, NO);
        !            65:                var.k_type = vtype;
        !            66:                var.k_len = VARFRLEN;
        !            67:                push(&var);
        !            68:                if (i < n)
        !            69:                        expectc(COMMA);
        !            70:                }
        !            71:        expectc(RPAR);
        !            72:        expectc(EQ);
        !            73:        v = stkptr;             /* variables on stack */
        !            74:        exchange(s, v, n);
        !            75:        expr();
        !            76:        endchk();
        !            77:        exchange(s, v, n);
        !            78:        s = stkptr;             /* the current expression */
        !            79:        stkptr = base;          /* restore the original stack */
        !            80:        push((Stkptr)s);        /* push the result onto the stack */
        !            81:        curline = saveline;
        !            82:        inptr = saveptr;
        !            83: }
        !            84: 
        !            85: 
        !            86: /*
        !            87:  * exchange --- swap n contiguous stack frames pointed to by sp and vp
        !            88:  */
        !            89: 
        !            90: exchange(sp, vp, n)
        !            91: char   *sp, *vp;
        !            92: {
        !            93:        register Stkptr s, v;
        !            94:        register Symptr p;
        !            95:        int             i, len;
        !            96:        char            *ptr;
        !            97:        double          f;
        !            98: 
        !            99:        s = (Stkptr)sp;
        !           100:        v = (Stkptr)vp;
        !           101:        for (i = 0; i < n; ++i) {
        !           102:                p = v->k_un.k_symp;             /* pointer to variable */
        !           103:                if (s->k_type != v->k_type + EXPR)
        !           104:                        err("types don't match");
        !           105:                if (tflg)
        !           106:                        fprintf(stderr, "exchange value %.2s ", p->v_name);
        !           107:                switch(v->k_type) {
        !           108:                case FLOAT:
        !           109:                        if (tflg) {
        !           110:                                f = (SINGLE)? p->v_un.v_float : p->v_un.v_double;
        !           111:                                fprintf(stderr, " %.6f <==> %.6f\n",
        !           112:                                                f, s->k_un.k_dbl);
        !           113:                                }
        !           114:                        f = s->k_un.k_dbl;
        !           115:                        if (SINGLE) {
        !           116:                                s->k_un.k_dbl = p->v_un.v_float;
        !           117:                                p->v_un.v_float = f;
        !           118:                                }
        !           119:                        else {
        !           120:                                s->k_un.k_dbl = p->v_un.v_double;
        !           121:                                p->v_un.v_double = f;
        !           122:                                }
        !           123:                        break;
        !           124:                case INT:
        !           125:                        if (tflg)
        !           126:                                fprintf(stderr, " %d <==> %d\n",
        !           127:                                        p->v_un.v_int, (int)s->k_un.k_dbl);
        !           128:                        f = s->k_un.k_dbl;
        !           129:                        s->k_un.k_dbl = p->v_un.v_int;
        !           130:                        p->v_un.v_int = f;
        !           131:                        break;
        !           132:                case STRING:
        !           133:                        ptr = s->k_un.k_str.s_ptr;
        !           134:                        len = s->k_un.k_str.s_len;
        !           135:                        s->k_un.k_str.s_ptr = p->v_un.v_str.s_ptr;
        !           136:                        s->k_un.k_str.s_len = p->v_un.v_str.s_len;
        !           137:                        p->v_un.v_str.s_ptr = ptr;
        !           138:                        p->v_un.v_str.s_len = len;
        !           139:                        break;
        !           140:                        }
        !           141:                s = nextframe(s);
        !           142:                v = nextframe(v);
        !           143:                }
        !           144: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.