/* * returns the integer value of the variable v */ var_int_t v_igetval(var_t *v) { if (v == 0) { err_evsyntax(); } else { switch (v->type) { case V_UDS: return uds_to_int(v); case V_HASH: return hash_to_int(v); case V_PTR: return v->v.ap.p; case V_INT: return v->v.i; case V_NUM: return v->v.n; case V_STR: return numexpr_strtol((char *) v->v.p.ptr); default: err_varisarray(); } } return 0; }
/* * compare the variable a with the variable b * returns * -1 a < b * +1 a > b * 0 a = b */ int v_compare(var_t *a, var_t *b) { var_num_t dt; var_int_t di; if (a == 0 || b == 0) { err_evsyntax(); return 0; } if (a->type == V_INT && b->type == V_INT) { di = (a->v.i - b->v.i); return (di < 0 ? -1 : di > 0 ? 1 : 0); } else if ((a->type == V_INT || a->type == V_NUM) && (b->type == V_INT || b->type == V_NUM)) { var_num_t left = (a->type == V_NUM) ? a->v.n : a->v.i; var_num_t right = (b->type == V_NUM) ? b->v.n : b->v.i; dt = (left - right); return (dt < 0.0 ? -1 : dt < 0.0000000000000000001f ? 0 : 1); } if ((a->type == V_STR) && (b->type == V_STR)) { return strcmp(a->v.p.ptr, b->v.p.ptr); } if ((a->type == V_STR) && (b->type == V_NUM)) { if (a->v.p.ptr[0] == '\0' || is_number(a->v.p.ptr)) { // compare nums dt = v_getval(a); return (dt < b->v.n) ? -1 : ((dt == b->v.n) ? 0 : 1); } return 1; } if ((a->type == V_NUM) && (b->type == V_STR)) { if (b->v.p.ptr[0] == '\0' || is_number(b->v.p.ptr)) { // compare nums dt = v_getval(b); return (dt < a->v.n) ? 1 : ((dt == a->v.n) ? 0 : -1); } return - 1; } if ((a->type == V_STR) && (b->type == V_INT)) { if (a->v.p.ptr[0] == '\0' || is_number(a->v.p.ptr)) { // compare nums di = v_igetval(a); return (di < b->v.i) ? -1 : ((di == b->v.i) ? 0 : 1); } return 1; } if ((a->type == V_INT) && (b->type == V_STR)) { if (b->v.p.ptr[0] == '\0' || is_number(b->v.p.ptr)) { // compare nums di = v_igetval(b); return (di < a->v.i) ? 1 : ((di == a->v.i) ? 0 : -1); } return - 1; } if ((a->type == V_ARRAY) && (b->type == V_ARRAY)) { // check size if (a->v.a.size != b->v.a.size) { if (a->v.a.size < b->v.a.size) { return -1; } return 1; } // check every element int i, ci; for (i = 0; i < a->v.a.size; i++) { var_t *ea = (var_t *)(a->v.a.ptr + sizeof(var_t) * i); var_t *eb = (var_t *)(b->v.a.ptr + sizeof(var_t) * i); if ((ci = v_compare(ea, eb)) != 0) { return ci; } } // equal return 0; } if (a->type == V_MAP && b->type == V_MAP) { return map_compare(a, b); } err_evtype(); return 1; }
/* * compare the variable a with the variable b * returns * -1 a < b * +1 a > b * 0 a = b */ int v_compare(var_t *a, var_t *b) { var_num_t dt; var_int_t di; int i, ci; var_t *ea, *eb; if (a == 0 || b == 0) { err_evsyntax(); return 0; } if (a->type == V_INT && b->type == V_INT) { di = (a->v.i - b->v.i); i = di < 0 ? -1 : di > 0 ? 1 : 0; return i; } else if ((a->type == V_INT || a->type == V_NUM) && (b->type == V_INT || b->type == V_NUM)) { var_num_t left = (a->type == V_NUM) ? a->v.n : a->v.i; var_num_t right = (b->type == V_NUM) ? b->v.n : b->v.i; dt = (left - right); i = dt < 0.0 ? -1 : dt > 0.0 ? 1 : 0; return i; } if ((a->type == V_STR) && (b->type == V_STR)) { return strcmp(a->v.p.ptr, b->v.p.ptr); } if ((a->type == V_STR) && (b->type == V_NUM)) { if (a->v.p.ptr[0] == '\0' || is_number((char *) a->v.p.ptr)) { // compare // nums dt = v_getval(a); return (dt < b->v.n) ? -1 : ((dt == b->v.n) ? 0 : 1);} return 1; } if ((a->type == V_NUM) && (b->type == V_STR)) { if (b->v.p.ptr[0] == '\0' || is_number((char *) b->v.p.ptr)) { // compare // nums dt = v_getval(b); return (dt < a->v.n) ? 1 : ((dt == a->v.n) ? 0 : -1);}return - 1; } if ((a->type == V_STR) && (b->type == V_INT)) { if (a->v.p.ptr[0] == '\0' || is_number((char *) a->v.p.ptr)) { // compare // nums di = v_igetval(a); return (di < b->v.i) ? -1 : ((di == b->v.i) ? 0 : 1);} return 1; } if ((a->type == V_INT) && (b->type == V_STR)) { if (b->v.p.ptr[0] == '\0' || is_number((char *) b->v.p.ptr)) { // compare // nums di = v_igetval(b); return (di < a->v.i) ? 1 : ((di == a->v.i) ? 0 : -1);}return - 1; } if ((a->type == V_ARRAY) && (b->type == V_ARRAY)) { // check size if (a->v.a.size != b->v.a.size) { if (a->v.a.size < b->v.a.size) { return -1; } return 1; } // check every element for (i = 0; i < a->v.a.size; i++) { ea = (var_t *) (a->v.a.ptr + sizeof(var_t) * i); eb = (var_t *) (b->v.a.ptr + sizeof(var_t) * i); if ((ci = v_compare(ea, eb)) != 0) { return ci; } } return 0; // equal } if (a->type == V_UDS && b->type == V_UDS) { return uds_compare(a, b); } if (a->type == V_HASH && b->type == V_HASH) { return hash_compare(a, b); } err_evtype(); // ndc 01/08/2001 return 1; }