Annotation of coherent/d/bin/bc/interp.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <setjmp.h>
        !             3: #include <assert.h>
        !             4: #include "bc.h"
        !             5: 
        !             6: 
        !             7: /*
        !             8:  *     The jump buffer bcmenv is used to hold the environment of
        !             9:  *     the bc-machine interpreter.  If some error is detected while
        !            10:  *     executing some bc-machine code, after an error message is
        !            11:  *     printed, return is to the environment saved here.
        !            12:  */
        !            13: 
        !            14: static jmp_buf bcmenv;
        !            15: 
        !            16: 
        !            17: /*
        !            18:  *     Interp is the routine which interprets bc-machine code.
        !            19:  */
        !            20: 
        !            21: interp()
        !            22: {
        !            23:        stkent          stack[MAXSTACK];
        !            24:        register stkent *tos = &stack[-1];
        !            25:        register code   *pc = cstream;
        !            26:        register rvalue *temp;
        !            27:        stkent          *frame;
        !            28:        func            *fnc;
        !            29: 
        !            30:        if (setjmp(bcmenv)) {
        !            31:                /* One might wonder if things on the stack
        !            32:                 * should be cleaned up?
        !            33:                 */
        !            34:                return;
        !            35:        }
        !            36:        for (;;) {
        !            37:                if (tos >= &stack[MAXSTACK - 1])
        !            38:                        bcmerr("Out of runtime stack");
        !            39:                switch (pc++->opcode) {
        !            40:                case LOAD:
        !            41:                        temp = tos->lvalue;
        !            42:                        minit(&tos->rvalue.mantissa);
        !            43:                        mcopy(&temp->mantissa, &tos->rvalue.mantissa);
        !            44:                        tos->rvalue.scale = temp->scale;
        !            45:                        break;
        !            46:                case LIBASE:
        !            47:                        minit(&(++tos)->rvalue.mantissa);
        !            48:                        mitom(ibase, &tos->rvalue.mantissa);
        !            49:                        tos->rvalue.scale = 0;
        !            50:                        break;
        !            51:                case LOBASE:
        !            52:                        minit(&(++tos)->rvalue.mantissa);
        !            53:                        mcopy(&outbase, &tos->rvalue.mantissa);
        !            54:                        tos->rvalue.scale = 0;
        !            55:                        break;
        !            56:                case LSCALE:
        !            57:                        minit(&(++tos)->rvalue.mantissa);
        !            58:                        mitom(scale, &tos->rvalue.mantissa);
        !            59:                        tos->rvalue.scale = 0;
        !            60:                        break;
        !            61:                case STORE:
        !            62:                        temp = (--tos)->lvalue;
        !            63:                        *tos = tos[1];
        !            64:                        mcopy(&tos->rvalue.mantissa, &temp->mantissa);
        !            65:                        temp->scale = tos->rvalue.scale;
        !            66:                        break;
        !            67:                case SIBASE:
        !            68:                        sibase(&tos->rvalue);
        !            69:                        break;
        !            70:                case SOBASE:
        !            71:                        sobase(&tos->rvalue);
        !            72:                        break;
        !            73:                case SSCALE:
        !            74:                        sscale(&tos->rvalue);
        !            75:                        break;
        !            76:                case POP:
        !            77:                        mvfree(&tos--->rvalue.mantissa);
        !            78:                        break;
        !            79:                case PRVAL:
        !            80:                        temp = tos++->lvalue;
        !            81:                        minit(&tos->rvalue.mantissa);
        !            82:                        mcopy(&temp->mantissa, &tos->rvalue.mantissa);
        !            83:                        tos->rvalue.scale = temp->scale;
        !            84:                        break;
        !            85:                case PGLSC:
        !            86:                case PLISC:
        !            87:                        (++tos)->lvalue = pc++->lvalue;
        !            88:                        break;
        !            89:                case PLOSC:
        !            90:                        (++tos)->lvalue = &frame[pc++->ivalue].rvalue;
        !            91:                        break;
        !            92:                case PGLAE:
        !            93:                        temp = select(pc++->alvalue, rtoint(&tos->rvalue));
        !            94:                        mvfree(&tos->rvalue.mantissa);
        !            95:                        tos->lvalue = temp;
        !            96:                        break;
        !            97:                case PLOAE:
        !            98:                        temp = select(frame[pc++->ivalue].alvalue,
        !            99:                                rtoint(&tos->rvalue));
        !           100:                        mvfree(&tos->rvalue.mantissa);
        !           101:                        tos->lvalue = temp;
        !           102:                        break;
        !           103:                case PGLAR:
        !           104:                        (++tos)->alvalue = pc++->alvalue;
        !           105:                        break;
        !           106:                case PLOAR:
        !           107:                        (++tos)->alvalue = frame[pc++->ivalue].alvalue;
        !           108:                        break;
        !           109:                case STOP:
        !           110:                        return;
        !           111:                case CALL:
        !           112:                        chkcall(pc[0].dvalue, pc[1].ivalue);
        !           113:                        fnc = &pc->dvalue->globalv.fvalue;
        !           114:                        tos = pauto(fnc, tos, &stack[MAXSTACK-1]);
        !           115:                        tos->bcstate.spc = pc + 2;
        !           116:                        tos->bcstate.sfp = frame;
        !           117:                        tos->bcstate.stos = frame = newframe(fnc, tos);
        !           118:                        pc = fnc->body;
        !           119:                        break;
        !           120:                case RETURN:
        !           121:                        temp = &tos->rvalue;
        !           122:                        bcclean(&pc->dvalue->globalv.fvalue, tos - 2);
        !           123:                        pc = tos[-1].bcstate.spc;
        !           124:                        frame = tos[-1].bcstate.sfp;
        !           125:                        tos = tos[-1].bcstate.stos;
        !           126:                        tos->rvalue = *temp;
        !           127:                        break;
        !           128:                case INC:
        !           129:                        madd(&tos->rvalue.mantissa, pow10(tos->rvalue.scale),
        !           130:                                &tos->rvalue.mantissa);
        !           131:                        break;
        !           132:                case DEC:
        !           133:                        msub(&tos->rvalue.mantissa, pow10(tos->rvalue.scale),
        !           134:                                &tos->rvalue.mantissa);
        !           135:                        break;
        !           136:                case PRNUM:
        !           137:                        putnum(&tos->rvalue);
        !           138:                        mvfree(&dot.mantissa);
        !           139:                        dot = tos->rvalue;
        !           140:                        --tos;
        !           141:                        break;
        !           142:                case PRSTR:
        !           143:                        pstring(pc++->svalue, 0);
        !           144:                        break;
        !           145:                case PRNL:
        !           146:                        pnewln();
        !           147:                        break;
        !           148:                case LENGTH:
        !           149:                        mitom(tos->rvalue.mantissa.len, &tos->rvalue.mantissa);
        !           150:                        tos->rvalue.scale = 0;
        !           151:                        break;
        !           152:                case SCALE:
        !           153:                        mitom(tos->rvalue.scale, &tos->rvalue.mantissa);
        !           154:                        tos->rvalue.scale = 0;
        !           155:                        break;
        !           156:                case SQRT:
        !           157:                        bcsqrt(&tos->rvalue);
        !           158:                        break;
        !           159:                case ADD:
        !           160:                        bcadd(&tos[0].rvalue, &tos[-1].rvalue);
        !           161:                        --tos;
        !           162:                        break;
        !           163:                case SUB:
        !           164:                        mneg(&tos[0].rvalue.mantissa,
        !           165:                                &tos[0].rvalue.mantissa);
        !           166:                        bcadd(&tos[0].rvalue, &tos[-1].rvalue);
        !           167:                        --tos;
        !           168:                        break;
        !           169:                case MUL:
        !           170:                        bcmul(&tos[0].rvalue, &tos[-1].rvalue);
        !           171:                        --tos;
        !           172:                        break;
        !           173:                case DIV:
        !           174:                        bcdiv(&tos[0].rvalue, &tos[-1].rvalue);
        !           175:                        --tos;
        !           176:                        break;
        !           177:                case REM:
        !           178:                        bcrem(&tos[0].rvalue, &tos[-1].rvalue);
        !           179:                        --tos;
        !           180:                        break;
        !           181:                case EXP:
        !           182:                        bcexp(&tos[0].rvalue, &tos[-1].rvalue);
        !           183:                        --tos;
        !           184:                        break;
        !           185:                case NEG:
        !           186:                        mneg(&tos[0].rvalue.mantissa, &tos[0].rvalue.mantissa);
        !           187:                        break;
        !           188:                case BRALW:
        !           189:                        pc += pc->address;
        !           190:                        break;
        !           191:                case BRNEV:
        !           192:                        pc += 2;
        !           193:                        break;
        !           194:                case BRLT:
        !           195:                        if (bccmp(&tos[0].rvalue, &tos[-1].rvalue) < 0)
        !           196:                                pc += pc->address;
        !           197:                        else
        !           198:                                ++pc;
        !           199:                        tos -= 2;
        !           200:                        break;
        !           201:                case BRLE:
        !           202:                        if (bccmp(&tos[0].rvalue, &tos[-1].rvalue) <= 0)
        !           203:                                pc += pc->address;
        !           204:                        else
        !           205:                                ++pc;
        !           206:                        tos -= 2;
        !           207:                        break;
        !           208:                case BREQ:
        !           209:                        if (bccmp(&tos[0].rvalue, &tos[-1].rvalue) == 0)
        !           210:                                pc += pc->address;
        !           211:                        else
        !           212:                                ++pc;
        !           213:                        tos -= 2;
        !           214:                        break;
        !           215:                case BRGE:
        !           216:                        if (bccmp(&tos[0].rvalue, &tos[-1].rvalue) >= 0)
        !           217:                                pc += pc->address;
        !           218:                        else
        !           219:                                ++pc;
        !           220:                        tos -= 2;
        !           221:                        break;
        !           222:                case BRGT:
        !           223:                        if (bccmp(&tos[0].rvalue, &tos[-1].rvalue) > 0)
        !           224:                                pc += pc->address;
        !           225:                        else
        !           226:                                ++pc;
        !           227:                        tos -= 2;
        !           228:                        break;
        !           229:                case BRNE:
        !           230:                        if (bccmp(&tos[0].rvalue, &tos[-1].rvalue) != 0)
        !           231:                                pc += pc->address;
        !           232:                        else
        !           233:                                ++pc;
        !           234:                        tos -= 2;
        !           235:                        break;
        !           236:                case EXIT:
        !           237:                        exit(0);
        !           238:                        break;
        !           239:                default:
        !           240:                        assert(FALSE);
        !           241:                }
        !           242:        }
        !           243: }
        !           244: 
        !           245: /*
        !           246:  *     Bcmerr is called when any bc-machine error occurrs.
        !           247:  *     It prints out an error message and causes interp to
        !           248:  *     return.
        !           249:  */
        !           250: 
        !           251: bcmerr(str)
        !           252: char   *str;
        !           253: {
        !           254:        fprintf(stderr, "%r\n", &str);
        !           255:        longjmp(bcmenv, TRUE);
        !           256: }

unix.superglobalmegacorp.com

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