static eval_error mult_term (eval_token et, eval_t *v1) { eval_token op; eval_t v2; eval_error er; if ((er = exp_term (et, v1)) != NO_ERROR) return er; while ((op = eval_lex (&v2)) == TIMES || op == DIVIDE || op == MODULO) { et = eval_lex (&v2); if (et == ERROR) return UNKNOWN_INPUT; if ((er = exp_term (et, &v2)) != NO_ERROR) return er; switch (op) { case TIMES: *v1 = *v1 * v2; break; case DIVIDE: if (v2 == 0) return DIVIDE_ZERO; else *v1 = *v1 / v2; break; case MODULO: if (v2 == 0) return MODULO_ZERO; else *v1 = *v1 % v2; break; default: M4ERROR ((warning_status, 0, "INTERNAL ERROR: Bad operator in mult_term ()")); abort (); } } if (op == ERROR) return UNKNOWN_INPUT; eval_undo (); return NO_ERROR; }
static eval_error exp_term (eval_token et, eval_t *v1) { register eval_t result; eval_t v2; eval_error er; if ((er = unary_term (et, v1)) != NO_ERROR) return er; result = *v1; while ((et = eval_lex (&v2)) == EXPONENT) { et = eval_lex (&v2); if (et == ERROR) return UNKNOWN_INPUT; if ((er = exp_term (et, &v2)) != NO_ERROR) return er; result = 1; while (v2-- > 0) result *= *v1; *v1 = result; } if (et == ERROR) return UNKNOWN_INPUT; eval_undo (); return NO_ERROR; }
void TConsole::exp_del(TExperiment* ex) { cflog<<"("<<ex->name<<", "<<ex->P_string["name"]<<" ) deleted"<<endl; if(!ex->st_term) { exp_term(ex); } Experiments.del(ex->name); delete ex; }
void TConsole::cmd_term(string) { exp_term(check_cur_exp()); }