diff options
Diffstat (limited to 'src/common/windows/unicode.c')
| -rw-r--r-- | src/common/windows/unicode.c | 44 |
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'; +} |