/* $Id: relation.c,v 1.1 2003/03/30 12:08:03 wafer Exp $ */ #include "act.h" #include void less (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_int = argv[0]->value.v_int < argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_int < argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_float < argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_float < argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_time < argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_time < argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_time < argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_period < argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_period < argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_period < argv[1]->value.v_period; break; case val_time: ret->value.v_int = argv[0]->value.v_period < argv[1]->value.v_time; break; case val_string: return; } break; case val_string: if (argv[1]->val_type != val_string) return; ret->value.v_int = strncmp(argv[0]->value.v_string, argv[1]->value.v_string, STRING_LIT_LEN) < 0; break; } } void greater (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_int = argv[0]->value.v_int > argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_int > argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_float > argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_float > argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_time > argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_time > argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_time > argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_period > argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_period > argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_period > argv[1]->value.v_period; break; case val_time: ret->value.v_int = argv[0]->value.v_period > argv[1]->value.v_time; break; case val_string: return; } break; case val_string: if (argv[1]->val_type != val_string) return; ret->value.v_int = strncmp(argv[0]->value.v_string, argv[1]->value.v_string, STRING_LIT_LEN) > 0; break; } } void less_eq (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_int = argv[0]->value.v_int <= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_int <= argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_float <= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_float <= argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_time <= argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_time <= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_time <= argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_period <= argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_period <= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_period <= argv[1]->value.v_period; break; case val_time: ret->value.v_int = argv[0]->value.v_period <= argv[1]->value.v_time; break; case val_string: return; } break; case val_string: if (argv[1]->val_type != val_string) return; ret->value.v_int = strncmp(argv[0]->value.v_string, argv[1]->value.v_string, STRING_LIT_LEN) <= 0; break; } } void greater_eq (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_int = argv[0]->value.v_int >= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_int >= argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_float >= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_float >= argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_time >= argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_time >= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_time >= argv[1]->value.v_period; break; case val_time: ret->value.v_int = 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_int = argv[0]->value.v_period >= argv[1]->value.v_int; break; case val_float: ret->value.v_int = argv[0]->value.v_period >= argv[1]->value.v_float; break; case val_period: ret->value.v_int = argv[0]->value.v_period >= argv[1]->value.v_period; break; case val_time: ret->value.v_int = argv[0]->value.v_period >= argv[1]->value.v_time; break; case val_string: return; } break; case val_string: if (argv[1]->val_type != val_string) return; ret->value.v_int = strncmp(argv[0]->value.v_string, argv[1]->value.v_string, STRING_LIT_LEN) >= 0; break; } } /* relation typechecks */ int typecheck_less (value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: case val_float: case val_time: case val_period: if (argv[1]->val_type == val_string) return 1; break; case val_string: if (argv[1]->val_type != val_string) return 1; break; } ret->val_type = val_int; return 0; } int typecheck_greater (value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: case val_float: case val_time: case val_period: if (argv[1]->val_type == val_string) return 1; break; case val_string: if (argv[1]->val_type != val_string) return 1; break; } ret->val_type = val_int; return 0; } int typecheck_less_eq (value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: case val_float: case val_time: case val_period: if (argv[1]->val_type == val_string) return 1; break; case val_string: if (argv[1]->val_type != val_string) return 1; break; } ret->val_type = val_int; return 0; } int typecheck_greater_eq(value_t *ret, value_t **argv, int argc) { switch (argv[0]->val_type) { case val_int: case val_float: case val_time: case val_period: if (argv[1]->val_type == val_string) return 1; break; case val_string: if (argv[1]->val_type != val_string) return 1; break; } ret->val_type = val_int; return 0; }