utfconv: add functions that use arena_allocator

This commit is contained in:
takase1121 2024-07-09 18:04:37 +08:00 committed by Guldoman
parent 9293a317cd
commit 1f0533482b
1 changed files with 26 additions and 0 deletions

View File

@ -12,8 +12,34 @@
#include <stdlib.h> #include <stdlib.h>
#include <windows.h> #include <windows.h>
#include "arena_allocator.h"
#define UTFCONV_ERROR_INVALID_CONVERSION "Input contains invalid byte sequences." #define UTFCONV_ERROR_INVALID_CONVERSION "Input contains invalid byte sequences."
#define utfconv_fromutf8(A, str) utfconv_fromlutf8(A, str, -1)
static UNUSED LPWSTR utfconv_fromlutf8(lxl_arena *A, const char *str, int len) {
int output_len = MultiByteToWideChar(CP_UTF8, 0, str, len, NULL, 0);
if (!output_len) return NULL;
LPWSTR output = lxl_arena_malloc(A, sizeof(WCHAR) * output_len);
if (!output) return NULL;
output_len = MultiByteToWideChar(CP_UTF8, 0, str, len, output, output_len);
if (!output_len) return (lxl_arena_free(A, output), NULL);
return output;
}
#define utfconv_fromwstr(A, str) utfconv_fromlwstr(A, str, -1)
static UNUSED const char *utfconv_fromlwstr(lxl_arena *A, LPWSTR str, int len) {
int output_len = WideCharToMultiByte(CP_UTF8, 0, str, len, NULL, 0, NULL, NULL);
if (!output_len) return NULL;
char *output = lxl_arena_malloc(A, sizeof(char) * output_len);
if (!output) return NULL;
output_len = WideCharToMultiByte(CP_UTF8, 0, str, len, output, output_len, NULL, NULL);
if (!output_len) return (lxl_arena_free(A, output), NULL);
return (const char *) output;
}
static UNUSED LPWSTR utfconv_utf8towc(const char *str) { static UNUSED LPWSTR utfconv_utf8towc(const char *str) {
LPWSTR output; LPWSTR output;
int len; int len;