diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2025-06-16 14:43:16 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2025-06-16 20:12:27 +0200 |
| commit | eef07431ef9dcd97569044e1b9c8d0b723a73ba7 (patch) | |
| tree | 8fbeff5ca129c9c0f5151692f5d1769bc2e3044f /core/os | |
| parent | 1a2f83f1235039b6bad43d9e697cc4b2f0fb2b60 (diff) | |
Factor out buffered utf helper.
Diffstat (limited to 'core/os')
| -rw-r--r-- | core/os/env_windows.odin | 37 |
1 files changed, 7 insertions, 30 deletions
diff --git a/core/os/env_windows.odin b/core/os/env_windows.odin index 6c7759abe..a6b758bec 100644 --- a/core/os/env_windows.odin +++ b/core/os/env_windows.odin @@ -35,50 +35,27 @@ lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: @(require_results) lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) { key_buf: [513]u16 - n1 := win32.MultiByteToWideChar(win32.CP_UTF8, win32.MB_ERR_INVALID_CHARS, raw_data(key), i32(len(key)), nil, 0) - if n1 == 0 { - return "", nil - } - - n1 = win32.MultiByteToWideChar(win32.CP_UTF8, win32.MB_ERR_INVALID_CHARS, raw_data(key), i32(len(key)), raw_data(key_buf[:]), n1) - if n1 == 0 { - return "", nil + wkey := win32.utf8_to_wstring(key_buf[:], key) + if wkey == nil { + return "", .Buffer_Full } - n2 := win32.GetEnvironmentVariableW(raw_data(key_buf[:]), nil, 0) + n2 := win32.GetEnvironmentVariableW(wkey, nil, 0) if n2 == 0 && get_last_error() == ERROR_ENVVAR_NOT_FOUND { return "", .Env_Var_Not_Found } val_buf: [513]u16 - n2 = win32.GetEnvironmentVariableW(raw_data(key_buf[:]), raw_data(val_buf[:]), u32(len(val_buf[:]))) + n2 = win32.GetEnvironmentVariableW(wkey, raw_data(val_buf[:]), u32(len(val_buf[:]))) if n2 == 0 && get_last_error() == ERROR_ENVVAR_NOT_FOUND { return "", .Env_Var_Not_Found } else if int(n2) > len(buf) { return "", .Buffer_Full } - n3 := win32.WideCharToMultiByte(win32.CP_UTF8, win32.WC_ERR_INVALID_CHARS, raw_data(val_buf[:]), -1, nil, 0, nil, nil) - if n3 == 0 { - return - } else if int(n3) > len(buf) { - return "", .Buffer_Full - } - - n4 := win32.WideCharToMultiByte(win32.CP_UTF8, win32.WC_ERR_INVALID_CHARS, raw_data(val_buf[:]), -1, raw_data(buf), n3, nil, nil) - if n4 == 0 { - return - } else if int(n4) > len(buf) { - return "", .Buffer_Full - } + value = win32.utf16_to_utf8(buf, val_buf[:n2]) - for i in 0..<n3 { - if buf[i] == 0 { - n3 = i - break - } - } - return string(buf[:n3]), nil + return value, nil } lookup_env :: proc{lookup_env_alloc, lookup_env_buffer} |