static int sexp_object_compare (sexp ctx, sexp a, sexp b) { int res; if (a == b) return 0; if (sexp_pointerp(a)) { if (sexp_pointerp(b)) { if (sexp_pointer_tag(a) != sexp_pointer_tag(b)) { res = sexp_pointer_tag(a) - sexp_pointer_tag(b); } else { switch (sexp_pointer_tag(a)) { case SEXP_FLONUM: res = sexp_flonum_value(a) - sexp_flonum_value(b); break; case SEXP_BIGNUM: res = sexp_bignum_compare(a, b); break; case SEXP_STRING: res = strcmp(sexp_string_data(a), sexp_string_data(b)); break; case SEXP_SYMBOL: res = strcmp(sexp_symbol_data(a), sexp_symbol_data(b)); break; default: res = 0; break; } } #if SEXP_USE_HUFF_SYMS } else if (sexp_lsymbolp(a) && sexp_isymbolp(b)) { res = strcmp(sexp_symbol_data(a), sexp_string_data(sexp_write_to_string(ctx, b))); #endif } else { res = 1; } } else if (sexp_pointerp(b)) { #if SEXP_USE_HUFF_SYMS if (sexp_isymbolp(a) && sexp_lsymbolp(b)) res = strcmp(sexp_string_data(sexp_write_to_string(ctx, a)), sexp_symbol_data(b)); else #endif res = -1; } else { #if SEXP_USE_HUFF_SYMS if (sexp_isymbolp(a) && sexp_isymbolp(b)) return sexp_isymbol_compare(ctx, a, b); else #endif res = (sexp_sint_t)a - (sexp_sint_t)b; } return res; }
void sexp_exits (sexp ctx, sexp self, sexp_sint_t n, sexp msg) { exits(sexp_string_data(sexp_stringp(msg) ? msg : sexp_write_to_string(ctx, msg))); }