void process_line(longint_t vars[], char *line) { int varnum, optype, status; longint_t second_value; /* determine the LHS variable, it * must be first character in line */ varnum = to_varnum(line[0]); if (varnum==ERROR) { printf("Invalid LHS variable\n"); return; } /* more testing for validity */ if (strlen(line)<2) { printf("No operator supplied\n"); return; } /* determine the operation to be performed, it * must be second character in line */ optype = line[1]; if (strchr(ALLOPS, optype) == NULL) { printf("Unknown operator\n"); return; } /* determine the RHS argument (if one is required), * it must start in third character of line */ if (optype != PRINT) { if (strlen(line)<3) { printf("No RHS supplied\n"); return; } status = get_second_value(vars, line+2, &second_value); if (status==ERROR) { printf("RHS argument is invalid\n"); return; } } /* finally, do the actual operation */ if (optype == PRINT) { do_print(vars+varnum); } else if (optype == ASSIGN) { do_assign(vars+varnum, &second_value); } else if (optype == PLUS) { do_plus(vars+varnum, &second_value); } else if (optype == MULT) { do_mult(vars+varnum, &second_value); } else if (optype == POWER) { do_power(vars+varnum, &second_value); } return; }
void do_mult(longint_t *var1, longint_t *var2) { longint_t product = LONG_ZERO; longint_t oneterm; int i; for (i=var2->ndig-1; i>=0; i--) { /* process one digit from var2 */ oneterm = *var1; mult_one_digit(&oneterm, to_int(var2->digs[i])); mult_ten(&product); do_plus(&product, &oneterm); } /* now sort out the sign */ product.nega = var1->nega != var2->nega; *var1 = product; return; }
int main(int argc, char *argv[]) { int type; int op; char s[1024]; push('='); while ((type = getop(s)) != EOF) { switch (type) { case '(': do_left_bracket(type); break; case ')': do_right_bracket(type); break; case NUMBER: fprintf(stdout, " %s ", s); break; case '-': do_sub(type); break; case '+': do_plus(type); break; case '*': do_mul(type); break; case '/': do_div(type); break; case '\n': while ((op = pop()) != '=') fprintf(stdout, " %c ", op); push(op); fprintf(stdout, "\n"); break; default: fprintf(stderr, "unknow type: %d\n", type); break; } } exit(0); }
void run_scu_operation(machinecode *program, int *pc, int *convert, union bit *reg) { switch(program[*pc].opcode) { case 0: /* set reg */ reg_set(reg, program[*pc].dr, reg_ref(reg,program[*pc].sr2,convert), convert); (*pc)++; break; case (0 + IMD_SIZE): /* set imd */ reg_set(reg, program[*pc].dr, program[*pc].imd, convert); (*pc)++; break; case 1: /* + reg */ reg_set(reg, program[*pc].dr, do_plus(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert); (*pc)++; break; case (1 + IMD_SIZE): /* + imd */ reg_set(reg, program[*pc].dr, do_plus(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert); (*pc)++; break; case 2: /* - reg */ reg_set(reg, program[*pc].dr, do_minus(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert); (*pc)++; break; case (2 + IMD_SIZE): /* - imd */ reg_set(reg, program[*pc].dr, do_minus(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert); (*pc)++; break; case 3: /* xor reg */ reg_set(reg, program[*pc].dr, do_xor(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert); (*pc)++; break; case (3 + IMD_SIZE): /* xor imd */ reg_set(reg, program[*pc].dr, do_xor(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert); (*pc)++; break; case 4: /* or reg */ reg_set(reg, program[*pc].dr, do_or(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert); (*pc)++; break; case (4 + IMD_SIZE): /* or imd */ reg_set(reg, program[*pc].dr, do_or(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert); (*pc)++; break; case 5: /* and reg */ reg_set(reg, program[*pc].dr, do_and(reg_ref(reg,program[*pc].sr1,convert),reg_ref(reg,program[*pc].sr2,convert)), convert); (*pc)++; break; case (5 + IMD_SIZE): /* adn imd */ reg_set(reg, program[*pc].dr, do_and(reg_ref(reg,program[*pc].sr1,convert),program[*pc].imd), convert); (*pc)++; break; case 6: /* not reg */ reg_set(reg, program[*pc].dr, do_not(reg_ref(reg,program[*pc].sr2,convert)), convert); (*pc)++; break; case (6 + IMD_SIZE): /* not imd */ reg_set(reg, program[*pc].dr, do_not(program[*pc].imd), convert); (*pc)++; break; default: fprintf(stderr, "%2x : unknown instruction\n", (program[*pc].info)+(program[*pc].opcode)); exit(EXIT_FAILURE); } }