SLVAL sl_string_concat(sl_vm_t* vm, SLVAL self, SLVAL other) { sl_string_t* a = sl_get_string(vm, self); sl_string_t* b = sl_get_string(vm, other); if(strcmp(a->encoding, b->encoding) != 0) { return sl_string_concat(vm, self, sl_string_encode(vm, other, a->encoding)); } uint8_t* buff = (uint8_t*)sl_alloc_buffer(vm->arena, a->buff_len + b->buff_len); memcpy(buff, a->buff, a->buff_len); memcpy(buff + a->buff_len, b->buff, b->buff_len); return sl_make_string(vm, buff, a->buff_len + b->buff_len); }
SLVAL sl_string_eq(sl_vm_t* vm, SLVAL self, SLVAL other) { if(!sl_is_a(vm, other, vm->lib.String)) { return vm->lib._false; } sl_string_t* a = sl_get_string(vm, self); sl_string_t* b = sl_get_string(vm, other); if(a->encoding == b->encoding) { if(str_cmp((sl_string_t*)sl_get_ptr(self), (sl_string_t*)sl_get_ptr(other)) == 0) { return vm->lib._true; } else { return vm->lib._false; } } sl_vm_frame_t frame; SLVAL err; volatile SLVAL retn; SL_TRY(frame, SL_UNWIND_EXCEPTION, { retn = sl_string_eq(vm, self, sl_string_encode(vm, other, a->encoding)); }, err, {
SLVAL sl_string_encode2(sl_vm_t* vm, SLVAL self, SLVAL encoding) { return sl_string_encode(vm, self, sl_to_cstr(vm, encoding)); }