env_windows.odin 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //+private
  2. package os2
  3. import win32 "core:sys/windows"
  4. import "core:runtime"
  5. _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
  6. if key == "" {
  7. return
  8. }
  9. wkey := win32.utf8_to_wstring(key)
  10. n := win32.GetEnvironmentVariableW(wkey, nil, 0)
  11. if n == 0 {
  12. err := win32.GetLastError()
  13. if err == win32.ERROR_ENVVAR_NOT_FOUND {
  14. return "", false
  15. }
  16. return "", true
  17. }
  18. b := make([]u16, n+1, _temp_allocator())
  19. n = win32.GetEnvironmentVariableW(wkey, raw_data(b), u32(len(b)))
  20. if n == 0 {
  21. err := win32.GetLastError()
  22. if err == win32.ERROR_ENVVAR_NOT_FOUND {
  23. return "", false
  24. }
  25. return "", false
  26. }
  27. value = win32.utf16_to_utf8(b[:n], allocator) or_else ""
  28. found = true
  29. return
  30. }
  31. _set_env :: proc(key, value: string) -> bool {
  32. k := win32.utf8_to_wstring(key)
  33. v := win32.utf8_to_wstring(value)
  34. return bool(win32.SetEnvironmentVariableW(k, v))
  35. }
  36. _unset_env :: proc(key: string) -> bool {
  37. k := win32.utf8_to_wstring(key)
  38. return bool(win32.SetEnvironmentVariableW(k, nil))
  39. }
  40. _clear_env :: proc() {
  41. envs := environ(_temp_allocator())
  42. for env in envs {
  43. for j in 1..<len(env) {
  44. if env[j] == '=' {
  45. unset_env(env[0:j])
  46. break
  47. }
  48. }
  49. }
  50. }
  51. _environ :: proc(allocator: runtime.Allocator) -> []string {
  52. envs := win32.GetEnvironmentStringsW()
  53. if envs == nil {
  54. return nil
  55. }
  56. defer win32.FreeEnvironmentStringsW(envs)
  57. n := 0
  58. for from, i, p := 0, 0, envs; true; i += 1 {
  59. c := ([^]u16)(p)[i]
  60. if c == 0 {
  61. if i <= from {
  62. break
  63. }
  64. n += 1
  65. from = i + 1
  66. }
  67. }
  68. r := make([dynamic]string, 0, n, allocator)
  69. for from, i, p := 0, 0, envs; true; i += 1 {
  70. c := ([^]u16)(p)[i]
  71. if c == 0 {
  72. if i <= from {
  73. break
  74. }
  75. w := ([^]u16)(p)[from:i]
  76. append(&r, win32.utf16_to_utf8(w, allocator) or_else "")
  77. from = i + 1
  78. }
  79. }
  80. return r[:]
  81. }