static int bstring_string_bin_op (int op, unsigned char a_type, VOID_STAR ap, unsigned int na, unsigned char b_type, VOID_STAR bp, unsigned int nb, VOID_STAR cp) { SLang_BString_Type **b; int ret; if (NULL == (b = make_n_bstrings (NULL, (char **)bp, nb, IS_NOT_TO_BE_FREED))) return -1; b_type = SLANG_BSTRING_TYPE; ret = bstring_bstring_bin_op (op, a_type, ap, na, b_type, (VOID_STAR) b, nb, cp); free_n_bstrings (b, nb); SLfree ((char *) b); return ret; }
static int string_bstring_bin_op (int op, SLtype a_type, VOID_STAR ap, SLuindex_Type na, SLtype b_type, VOID_STAR bp, SLuindex_Type nb, VOID_STAR cp) { SLang_BString_Type **a; int ret; if (NULL == (a = make_n_bstrings (NULL, (char **)ap, na, IS_NOT_TO_BE_FREED))) return -1; a_type = SLANG_BSTRING_TYPE; ret = bstring_bstring_bin_op (op, a_type, (VOID_STAR) a, na, b_type, bp, nb, cp); free_n_bstrings (a, na); SLfree ((char *) a); return ret; }
static int bstring_bstring_bin_op (int op, unsigned char a_type, VOID_STAR ap, unsigned int na, unsigned char b_type, VOID_STAR bp, unsigned int nb, VOID_STAR cp) { char *ic; SLang_BString_Type **a, **b, **c; unsigned int n, n_max; unsigned int da, db; (void) a_type; (void) b_type; if (na == 1) da = 0; else da = 1; if (nb == 1) db = 0; else db = 1; if (na > nb) n_max = na; else n_max = nb; a = (SLang_BString_Type **) ap; b = (SLang_BString_Type **) bp; for (n = 0; n < n_max; n++) { if ((*a == NULL) || (*b == NULL)) { SLang_verror (SL_VARIABLE_UNINITIALIZED, "Binary string element[%u] not initialized for binary operation", n); return -1; } a += da; b += db; } a = (SLang_BString_Type **) ap; b = (SLang_BString_Type **) bp; ic = (char *) cp; c = NULL; switch (op) { case SLANG_PLUS: /* Concat */ c = (SLang_BString_Type **) cp; for (n = 0; n < n_max; n++) { if (NULL == (c[n] = concat_bstrings (*a, *b))) goto return_error; a += da; b += db; } break; case SLANG_NE: for (n = 0; n < n_max; n++) { ic [n] = (0 != compare_bstrings (*a, *b)); a += da; b += db; } break; case SLANG_GT: for (n = 0; n < n_max; n++) { ic [n] = (compare_bstrings (*a, *b) > 0); a += da; b += db; } break; case SLANG_GE: for (n = 0; n < n_max; n++) { ic [n] = (compare_bstrings (*a, *b) >= 0); a += da; b += db; } break; case SLANG_LT: for (n = 0; n < n_max; n++) { ic [n] = (compare_bstrings (*a, *b) < 0); a += da; b += db; } break; case SLANG_LE: for (n = 0; n < n_max; n++) { ic [n] = (compare_bstrings (*a, *b) <= 0); a += da; b += db; } break; case SLANG_EQ: for (n = 0; n < n_max; n++) { ic [n] = (compare_bstrings (*a, *b) == 0); a += da; b += db; } break; } return 1; return_error: if (c != NULL) { free_n_bstrings (c, n); while (n < n_max) { c[n] = NULL; n++; } } return -1; }