/* $Id: division.c,v 1.1 2003/03/30 10:32:39 wafer Exp $ */ #include "act.h" void divide (value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: switch (argv[1]->val_type) { case val_int: ret->value.v_int = argv[0]->value.v_int / argv[1]->value.v_int; break; case val_float: ret->value.v_float = argv[0]->value.v_int / argv[1]->value.v_float; break; case val_period: ret->value.v_period = argv[0]->value.v_int / argv[1]->value.v_period; break; case val_time: ret->value.v_time = argv[0]->value.v_int / argv[1]->value.v_time; break; case val_string: return; } break; case val_float: switch (argv[1]->val_type) { case val_int: ret->value.v_int = argv[0]->value.v_float / argv[1]->value.v_int; break; case val_float: ret->value.v_float = argv[0]->value.v_float / argv[1]->value.v_float; break; case val_period: ret->value.v_period = argv[0]->value.v_float / argv[1]->value.v_period; break; case val_time: ret->value.v_time = argv[0]->value.v_float / argv[1]->value.v_time; break; case val_string: return; } break; case val_time: switch (argv[1]->val_type) { case val_int: ret->value.v_time = argv[0]->value.v_time / argv[1]->value.v_int; break; case val_float: ret->value.v_float = argv[0]->value.v_time / argv[1]->value.v_float; break; case val_period: ret->value.v_time = argv[0]->value.v_time / argv[1]->value.v_period; break; case val_time: ret->value.v_time = argv[0]->value.v_time / argv[1]->value.v_time; break; case val_string: return; } break; case val_period: switch (argv[1]->val_type) { case val_int: ret->value.v_period = argv[0]->value.v_period / argv[1]->value.v_int; break; case val_float: ret->value.v_float = argv[0]->value.v_period / argv[1]->value.v_float; break; case val_period: ret->value.v_period = argv[0]->value.v_period / argv[1]->value.v_period; break; case val_time: ret->value.v_time = argv[0]->value.v_period / argv[1]->value.v_time; break; case val_string: return; } break; case val_string: return; } } int typecheck_divide (value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: switch (argv[1]->val_type) { case val_int: ret->val_type = val_int; break; case val_float: ret->val_type = val_float; break; case val_string: return 1; case val_period: ret->val_type = val_period; break; case val_time: ret->val_type = val_time; break; } break; case val_float: switch (argv[1]->val_type) { case val_int: ret->val_type = val_int; break; case val_time: ret->val_type = val_time; break; case val_period: ret->val_type = val_period; break; case val_float: ret->val_type = val_float; break; case val_string: return 1; } break; case val_string: return 1; case val_time: switch (argv[1]->val_type) { case val_int: case val_time: case val_period: ret->val_type = val_time; break; case val_float: ret->val_type = val_float; break; case val_string: return 1; } break; case val_period: switch (argv[1]->val_type) { case val_int: case val_period: ret->val_type = val_period; break; case val_time: ret->val_type = val_time; break; case val_float: ret->val_type = val_float; break; case val_string: return 1; } break; } return 0; } void modulus (value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: switch (argv[1]->val_type) { case val_int: ret->value.v_int = argv[0]->value.v_int % argv[1]->value.v_int; break; case val_period: ret->value.v_period = argv[0]->value.v_int % argv[1]->value.v_period; break; case val_time: ret->value.v_time = argv[0]->value.v_int % argv[1]->value.v_time; break; case val_float: case val_string: return; } break; case val_float: return; case val_time: switch (argv[1]->val_type) { case val_int: ret->value.v_time = argv[0]->value.v_time % argv[1]->value.v_int; break; case val_period: ret->value.v_time = argv[0]->value.v_time % argv[1]->value.v_period; break; case val_time: ret->value.v_time = argv[0]->value.v_time % argv[1]->value.v_time; break; case val_float: case val_string: return; } break; case val_period: switch (argv[1]->val_type) { case val_int: ret->value.v_period = argv[0]->value.v_period % argv[1]->value.v_int; break; case val_period: ret->value.v_period = argv[0]->value.v_period % argv[1]->value.v_period; break; case val_time: ret->value.v_time = argv[0]->value.v_period % argv[1]->value.v_time; break; case val_float: case val_string: return; } break; case val_string: return; } } int typecheck_modulus (value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: switch (argv[1]->val_type) { case val_int: ret->val_type = val_int; break; case val_float: case val_string: return 1; case val_period: ret->val_type = val_period; break; case val_time: ret->val_type = val_time; break; } break; case val_float: return 1; case val_string: return 1; case val_time: switch (argv[1]->val_type) { case val_int: case val_time: case val_period: ret->val_type = val_time; break; case val_float: case val_string: return 1; } break; case val_period: switch (argv[1]->val_type) { case val_int: case val_period: ret->val_type = val_period; break; case val_time: ret->val_type = val_time; break; case val_float: case val_string: return 1; } break; } return 0; }