- case O_COMMA:
- break;
-
- case O_ITOF:
- push(double, (double) r0);
- break;
-
- case O_ADD:
- push(long, r0+r1);
- break;
-
- case O_ADDF:
- push(double, fr0+fr1);
- break;
-
- case O_SUB:
- push(long, r0-r1);
- break;
-
- case O_SUBF:
- push(double, fr0-fr1);
- break;
-
- case O_NEG:
- push(long, -r0);
- break;
-
- case O_NEGF:
- push(double, -fr0);
- break;
-
- case O_MUL:
- push(long, r0*r1);
- break;
-
- case O_MULF:
- push(double, fr0*fr1);
- break;
-
- case O_DIVF:
- if (fr1 == 0) {
- error("error: division by 0");
- }
- push(double, fr0/fr1);
- break;
-
- case O_DIV:
- if (r1 == 0) {
- error("error: div by 0");
- }
- push(long, r0/r1);
- break;
-
- case O_MOD:
- if (r1 == 0) {
- error("error: mod by 0");
- }
- push(long, r0%r1);
- break;
-
- case O_LT:
- push(BOOLEAN, r0 < r1);
- break;
-
- case O_LTF:
- push(BOOLEAN, fr0 < fr1);
- break;
-
- case O_LE:
- push(BOOLEAN, r0 <= r1);
- break;
-
- case O_LEF:
- push(BOOLEAN, fr0 <= fr1);
- break;
-
- case O_GT:
- push(BOOLEAN, r0 > r1);
- break;
-
- case O_GTF:
- push(BOOLEAN, fr0 > fr1);
- break;
-
- case O_EQ:
- push(BOOLEAN, r0 == r1);
- break;
-
- case O_EQF:
- push(BOOLEAN, fr0 == fr1);
- break;
-
- case O_NE:
- push(BOOLEAN, r0 != r1);
- break;
-
- case O_NEF:
- push(BOOLEAN, fr0 != fr1);
- break;
-
- case O_AND:
- push(BOOLEAN, r0 && r1);
- break;
-
- case O_OR:
- push(BOOLEAN, r0 || r1);
- break;
-
- case O_ASSIGN:
- assign(p->left, p->right);
- break;
-
- case O_CHFILE:
- if (p->sconval == NIL) {
- printf("%s\n", cursource);
- } else {
- skimsource(p->sconval);
- }
- break;
-
- case O_CONT:
- cont();
- printnews();
- break;
-
- case O_LIST: {
- SYM *b;
-
- if (p->left->op == O_NAME) {
- b = p->left->nameval;
- if (!isblock(b)) {
- error("\"%s\" is not a procedure or function", name(b));
- }
- r0 = srcline(firstline(b));
- r1 = r0 + 5;
- if (r1 > lastlinenum) {
- r1 = lastlinenum;
- }
- r0 = r0 - 5;
- if (r0 < 1) {
- r0 = 1;
- }
- } else {
- eval(p->left->right);
- eval(p->left->left);
- r0 = pop(long);
- r1 = pop(long);
- }
- printlines((LINENO) r0, (LINENO) r1);
- break;
- }