/* $Id: addition.c,v 1.4 2003/09/28 09:03:00 jmuelmen Exp $ */ /* Addition, like the name says */ #include #include #include "act.h" void add (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: snprintf(ret->value.v_string, STRING_LIT_LEN, "%d%s", argv[0]->value.v_int, argv[1]->value.v_string); break; } break; case val_float: switch (argv[1]->val_type) { case val_int: ret->value.v_float = 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_float = argv[0]->value.v_float + argv[1]->value.v_period; break; case val_time: ret->value.v_float = argv[0]->value.v_float + argv[1]->value.v_time; break; case val_string: { char t[100]; conv_string(t, argv[0]); snprintf(ret->value.v_string, STRING_LIT_LEN, "%s%s", t, argv[1]->value.v_string); break; } } 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: { char t[100]; conv_string(t, argv[0]); snprintf(ret->value.v_string, STRING_LIT_LEN, "%s%s", t, argv[1]->value.v_string); break; } } 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: { char t[100]; conv_string(t, argv[0]); snprintf(ret->value.v_string, STRING_LIT_LEN, "%s%s", t, argv[1]->value.v_string); break; } } break; case val_string: switch (argv[1]->val_type) { case val_int: snprintf(ret->value.v_string, STRING_LIT_LEN, "%s%d", argv[0]->value.v_string, argv[1]->value.v_int); break; case val_float: case val_period: case val_time: { char t[100]; conv_string(t, argv[1]); snprintf(ret->value.v_string, STRING_LIT_LEN, "%s%s", argv[0]->value.v_string, t); break; } case val_string: snprintf(ret->value.v_string, STRING_LIT_LEN, "%s%s", argv[0]->value.v_string, argv[1]->value.v_string); break; } break; } } /* determine the type of the result of the addition; return non-0 if the types are incompatible. */ int typecheck_add (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: ret->val_type = val_string; break; 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: case val_time: case val_period: case val_float: ret->val_type = val_float; break; case val_string: ret->val_type = val_string; break; } break; case val_string: ret->val_type = val_string; break; 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: ret->val_type = val_string; break; } 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: ret->val_type = val_string; break; } break; } return 0; } void subtract (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_float = 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_float = argv[0]->value.v_float - argv[1]->value.v_period; break; case val_time: ret->value.v_float = 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_subtract (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: case val_time: case val_period: 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; }