/* * add two variables * result = a + b */ void v_add(var_t *result, var_t *a, var_t *b) { char tmpsb[64]; if (a->type == V_STR && b->type == V_STR) { result->type = V_STR; result->v.p.ptr = malloc(strlen(a->v.p.ptr) + strlen(b->v.p.ptr) + 1); strcpy(result->v.p.ptr, a->v.p.ptr); strcat(result->v.p.ptr, b->v.p.ptr); result->v.p.size = strlen(result->v.p.ptr) + 1; return; } else if (a->type == V_INT && b->type == V_INT) { result->type = V_INT; result->v.i = a->v.i + b->v.i; return; } else if (a->type == V_NUM && b->type == V_NUM) { result->type = V_NUM; result->v.n = a->v.n + b->v.n; return; } else if (a->type == V_NUM && b->type == V_INT) { result->type = V_NUM; result->v.n = a->v.n + b->v.i; return; } else if (a->type == V_INT && b->type == V_NUM) { result->type = V_NUM; result->v.n = a->v.i + b->v.n; return; } else if (a->type == V_STR && (b->type == V_INT || b->type == V_NUM)) { if (is_number(a->v.p.ptr)) { result->type = V_NUM; if (b->type == V_INT) { result->v.n = b->v.i + v_getval(a); } else { result->v.n = b->v.n + v_getval(a); } } else { result->type = V_STR; result->v.p.ptr = (char *)malloc(strlen(a->v.p.ptr) + 64); strcpy(result->v.p.ptr, a->v.p.ptr); if (b->type == V_INT) { ltostr(b->v.i, tmpsb); } else { ftostr(b->v.n, tmpsb); } strcat(result->v.p.ptr, tmpsb); result->v.p.size = strlen(result->v.p.ptr) + 1; } } else if ((a->type == V_INT || a->type == V_NUM) && b->type == V_STR) { if (is_number(b->v.p.ptr)) { result->type = V_NUM; if (a->type == V_INT) { result->v.n = a->v.i + v_getval(b); } else { result->v.n = a->v.n + v_getval(b); } } else { result->type = V_STR; result->v.p.ptr = (char *)malloc(strlen(b->v.p.ptr) + 64); if (a->type == V_INT) { ltostr(a->v.i, tmpsb); } else { ftostr(a->v.n, tmpsb); } strcpy(result->v.p.ptr, tmpsb); strcat(result->v.p.ptr, b->v.p.ptr); result->v.p.size = strlen(result->v.p.ptr) + 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; }
/* * 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; }
/* * add two variables * result = a + b */ void v_add(var_t *result, var_t *a, var_t *b) { char tmpsb[INT_STR_LEN]; if (a->type == V_STR && b->type == V_STR) { int length = strlen(a->v.p.ptr) + strlen(b->v.p.ptr); result->type = V_STR; result->v.p.ptr = malloc(length + 1); strcpy(result->v.p.ptr, a->v.p.ptr); strcat(result->v.p.ptr, b->v.p.ptr); result->v.p.ptr[length] = '\0'; result->v.p.length = length + 1; return; } else if (a->type == V_INT && b->type == V_INT) { result->type = V_INT; result->v.i = a->v.i + b->v.i; return; } else if (a->type == V_NUM && b->type == V_NUM) { result->type = V_NUM; result->v.n = a->v.n + b->v.n; return; } else if (a->type == V_NUM && b->type == V_INT) { result->type = V_NUM; result->v.n = a->v.n + b->v.i; return; } else if (a->type == V_INT && b->type == V_NUM) { result->type = V_NUM; result->v.n = a->v.i + b->v.n; return; } else if (a->type == V_STR && (b->type == V_INT || b->type == V_NUM)) { if (is_number(a->v.p.ptr)) { result->type = V_NUM; if (b->type == V_INT) { result->v.n = b->v.i + v_getval(a); } else { result->v.n = b->v.n + v_getval(a); } } else { result->type = V_STR; result->v.p.ptr = (char *)malloc(strlen(a->v.p.ptr) + INT_STR_LEN); strcpy(result->v.p.ptr, a->v.p.ptr); if (b->type == V_INT) { ltostr(b->v.i, tmpsb); } else { ftostr(b->v.n, tmpsb); } strcat(result->v.p.ptr, tmpsb); result->v.p.length = strlen(result->v.p.ptr) + 1; } } else if ((a->type == V_INT || a->type == V_NUM) && b->type == V_STR) { if (is_number(b->v.p.ptr)) { result->type = V_NUM; if (a->type == V_INT) { result->v.n = a->v.i + v_getval(b); } else { result->v.n = a->v.n + v_getval(b); } } else { result->type = V_STR; result->v.p.ptr = (char *)malloc(strlen(b->v.p.ptr) + INT_STR_LEN); if (a->type == V_INT) { ltostr(a->v.i, tmpsb); } else { ftostr(a->v.n, tmpsb); } strcpy(result->v.p.ptr, tmpsb); strcat(result->v.p.ptr, b->v.p.ptr); result->v.p.length = strlen(result->v.p.ptr) + 1; } } else if (b->type == V_MAP) { char *map = map_to_str(b); v_set(result, a); v_strcat(result, map); free(map); } }