ohmu
·
2026-10-15
1#include "unicode.h"
2
3#include "common/windows/nt.h"
4
5void ffStrbufSetNWS(FFstrbuf* result, uint32_t length, const wchar_t* source) {
6 if (!length) {
7 ffStrbufClear(result);
8 return;
9 }
10
11 ULONG size_needed = 0;
12 NTSTATUS status = RtlUnicodeToUTF8N(nullptr, 0, &size_needed, source, length * sizeof(wchar_t));
13
14 if (size_needed == 0) {
15 ffStrbufSetF(result, "RtlUnicodeToUTF8N failed: %X", (unsigned) status);
16 return;
17 }
18
19 ffStrbufEnsureFixedLengthFree(result, size_needed);
20 RtlUnicodeToUTF8N(result->chars, size_needed, &size_needed, source, length * sizeof(wchar_t));
21
22 result->length = size_needed;
23 result->chars[size_needed] = '\0';
24}
25
26void ffStrbufAppendNWS(FFstrbuf* result, uint32_t length, const wchar_t* source) {
27 if (!length) {
28 return;
29 }
30
31 ULONG size_needed = 0;
32 NTSTATUS status = RtlUnicodeToUTF8N(nullptr, 0, &size_needed, source, length * sizeof(wchar_t));
33
34 if (size_needed == 0) {
35 ffStrbufAppendF(result, "RtlUnicodeToUTF8N failed: %X", (unsigned) status);
36 return;
37 }
38
39 ffStrbufEnsureFree(result, size_needed);
40 RtlUnicodeToUTF8N(result->chars + result->length, size_needed, &size_needed, source, length * sizeof(wchar_t));
41
42 result->length += size_needed;
43 result->chars[result->length] = '\0';
44}