String* Str_new_steal_utf8(char *utf8, size_t size) { if (!StrHelp_utf8_valid(utf8, size)) { DIE_INVALID_UTF8(utf8, size); } String *self = (String*)Class_Make_Obj(STRING); return Str_init_steal_trusted_utf8(self, utf8, size); }
String* Str_Cat_Trusted_Utf8_IMP(String *self, const char* ptr, size_t size) { size_t result_size = self->size + size; char *result_ptr = (char*)MALLOCATE(result_size + 1); memcpy(result_ptr, self->ptr, self->size); memcpy(result_ptr + self->size, ptr, size); result_ptr[result_size] = '\0'; String *result = (String*)Class_Make_Obj(STRING); return Str_init_steal_trusted_utf8(result, result_ptr, result_size); }
String* Freezer_deserialize_string(String *string, InStream *instream) { size_t size = InStream_Read_C32(instream); if (size == SIZE_MAX) { THROW(ERR, "Can't deserialize SIZE_MAX bytes"); } char *buf = (char*)MALLOCATE(size + 1); InStream_Read_Bytes(instream, buf, size); buf[size] = '\0'; if (!StrHelp_utf8_valid(buf, size)) { THROW(ERR, "Attempt to deserialize invalid UTF-8"); } return Str_init_steal_trusted_utf8(string, buf, size); }
String* Str_new_steal_trusted_utf8(char *utf8, size_t size) { String *self = (String*)Class_Make_Obj(STRING); return Str_init_steal_trusted_utf8(self, utf8, size); }