master ohmu/fastfetch-openbsd / src / common / windows / unicode.c
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}