env_windows.odin 2.0 KB

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