summaryrefslogtreecommitdiffstats
path: root/src/common/windows/unicode.c
diff options
context:
space:
mode:
authorsumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
committersumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
commit76424950e373d3b04ac3dd13019151bfba3e8423 (patch)
tree4c3cfdbda039e592b9186be3e28f8d7cfd439e8a /src/common/windows/unicode.c
Add the files
Diffstat (limited to 'src/common/windows/unicode.c')
-rw-r--r--src/common/windows/unicode.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/common/windows/unicode.c b/src/common/windows/unicode.c
new file mode 100644
index 0000000..06008ba
--- /dev/null
+++ b/src/common/windows/unicode.c
@@ -0,0 +1,44 @@
+#include "unicode.h"
+
+#include "common/windows/nt.h"
+
+void ffStrbufSetNWS(FFstrbuf* result, uint32_t length, const wchar_t* source) {
+ if (!length) {
+ ffStrbufClear(result);
+ return;
+ }
+
+ ULONG size_needed = 0;
+ NTSTATUS status = RtlUnicodeToUTF8N(NULL, 0, &size_needed, source, length * sizeof(wchar_t));
+
+ if (size_needed == 0) {
+ ffStrbufSetF(result, "RtlUnicodeToUTF8N failed: %X", (unsigned) status);
+ return;
+ }
+
+ ffStrbufEnsureFixedLengthFree(result, size_needed);
+ RtlUnicodeToUTF8N(result->chars, size_needed, &size_needed, source, length * sizeof(wchar_t));
+
+ result->length = size_needed;
+ result->chars[size_needed] = '\0';
+}
+
+void ffStrbufAppendNWS(FFstrbuf* result, uint32_t length, const wchar_t* source) {
+ if (!length) {
+ return;
+ }
+
+ ULONG size_needed = 0;
+ NTSTATUS status = RtlUnicodeToUTF8N(NULL, 0, &size_needed, source, length * sizeof(wchar_t));
+
+ if (size_needed == 0) {
+ ffStrbufAppendF(result, "RtlUnicodeToUTF8N failed: %X", (unsigned) status);
+ return;
+ }
+
+ ffStrbufEnsureFree(result, size_needed);
+ RtlUnicodeToUTF8N(result->chars + result->length, size_needed, &size_needed, source, length * sizeof(wchar_t));
+
+ result->length += size_needed;
+ result->chars[result->length] = '\0';
+}