From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Wasabi/bfc/string/encodedstr.cpp | 156 +++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 Src/Wasabi/bfc/string/encodedstr.cpp (limited to 'Src/Wasabi/bfc/string/encodedstr.cpp') diff --git a/Src/Wasabi/bfc/string/encodedstr.cpp b/Src/Wasabi/bfc/string/encodedstr.cpp new file mode 100644 index 00000000..eddba7da --- /dev/null +++ b/Src/Wasabi/bfc/string/encodedstr.cpp @@ -0,0 +1,156 @@ +#include "precomp_wasabi_bfc.h" +// someday, there will be a file here. +#include +#include "encodedstr.h" +#include +#include +#include +EncodedStr::EncodedStr(FOURCC encodingType, void *encodedBuffer, int bufferSize, int deleteIt) { + encoding_type = encodingType; + encoded_buffer = encodedBuffer; + buffer_size = bufferSize; + delete_it = deleteIt; +} + +EncodedStr::~EncodedStr() { + if (delete_it && (encoded_buffer != NULL)) { +#ifdef WASABI_COMPILE_MEMMGR + WASABI_API_MEMMGR->sysFree(encoded_buffer); +#else + free(encoded_buffer); +#endif + } +} + +void EncodedStr::resetBuffer(FOURCC encodingType, void *encodedBuffer, int bufferSize, int deleteIt) { + // if there's someone already there, toss them. + if (delete_it && (encoded_buffer != NULL)) { +#ifdef WASABI_COMPILE_MEMMGR + WASABI_API_MEMMGR->sysFree(encoded_buffer); +#else + free(encoded_buffer); +#endif + } + encoding_type = encodingType; + encoded_buffer = encodedBuffer; + buffer_size = bufferSize; + delete_it = deleteIt; +} + +int EncodedStr::convertToUTF8(String &output_str) { + int retval = 0; + StringConverterEnum myServiceEnum(encoding_type); + svc_stringConverter *myConv = myServiceEnum.getFirst(); + if (myConv != NULL) { + + void *in_buffer = encoded_buffer; + int size_in_bytes = buffer_size; + + if (encoded_buffer != NULL) { + // Preflight + int u8size = myConv->preflightToUTF8(encoding_type, in_buffer, size_in_bytes); + // Alloc +#ifdef WASABI_COMPILE_MEMMGR + char *u8str = reinterpret_cast(WASABI_API_MEMMGR->sysMalloc(u8size)); +#else + char *u8str = reinterpret_cast(MALLOC(u8size)); +#endif + if (u8str != NULL) { + // Convert + retval = myConv->convertToUTF8(encoding_type, in_buffer, size_in_bytes, u8str, u8size); + if (retval < 0) { + // Clear on error. +#ifdef WASABI_COMPILE_MEMMGR + WASABI_API_MEMMGR->sysFree(u8str); +#else + free(encoded_buffer); +#endif + u8str = NULL; + } + } else { + ASSERTPR(u8str != NULL, "Malloc failed in string converter\n"); + } + // And call the method to inject the pointer into our string (cleared on error). + output_str.setValue(u8str); + } + + // Once we use our service, release our locked instance of it. + myServiceEnum.release(myConv); + } else { + // Clear the string on error. + retval = SvcStrCnv::ERROR_UNAVAILABLE; + output_str.setValue(NULL); + } + return retval; +} + +int EncodedStr::convertFromUTF8(FOURCC encodingType, const String &inputStr) { + int retval = 0; + int written = 0; + void *buffer = NULL; + StringConverterEnum myServiceEnum(encodingType); + svc_stringConverter *myConv = myServiceEnum.getFirst(); + + if (myConv != NULL) { + if (inputStr != NULL) { + const char *val = inputStr.getValue(); + int valsize = STRLEN(val) + 1; // count the null char in your size-in-bytes! + // Preflight + int size = myConv->preflightFromUTF8(encodingType, val, valsize); + if (size > 0) { + // Alloc +#ifdef WASABI_COMPILE_MEMMGR + buffer = WASABI_API_MEMMGR->sysMalloc(size); +#else + buffer = MALLOC(size); +#endif + if (buffer != NULL) { + // Convert + written = myConv->convertFromUTF8(encodingType, val, valsize, buffer, size); + if (written > 0) { + retval = written; + } else { + // Clear on error. +#ifdef WASABI_COMPILE_MEMMGR + WASABI_API_MEMMGR->sysFree(buffer); +#else + free(buffer); +#endif + buffer = NULL; + retval = written; + written = 0; + } + } else { + ASSERTPR(buffer != NULL, "Malloc failed in string converter\n"); + } + } else { + // Clear on error. + buffer = NULL; + retval = size; + written = 0; + } + } + // Once we use our service, release our locked instance of it. + myServiceEnum.release(myConv); + } else { + // On error locking down a service, all the default values are errors and called through resetBuffer. + retval = SvcStrCnv::ERROR_UNAVAILABLE; + } + resetBuffer(encodingType, buffer, written); + return retval; +} + +// This is for debugging. +int EncodedStr::operator ==(const EncodedStr &in_string) { + if (encoding_type == in_string.encoding_type) { + switch (encoding_type) { + case SvcStrCnv::OSNATIVE: + return (STRCMP(reinterpret_cast(encoded_buffer), reinterpret_cast(in_string.encoded_buffer)) == 0); + break; + default: + return 0; + break; + } + } + return 0; +} -- cgit