mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
@@ -8,7 +8,7 @@ import "base:runtime"
|
|||||||
// Otherwise the returned value will be empty and the boolean will be false
|
// Otherwise the returned value will be empty and the boolean will be false
|
||||||
// NOTE: the value will be allocated with the supplied allocator
|
// NOTE: the value will be allocated with the supplied allocator
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
if key == "" {
|
if key == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -29,17 +29,54 @@ lookup_env :: proc(key: string, allocator := context.allocator) -> (value: strin
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This version of `lookup_env` doesn't allocate and instead requires the user to provide a buffer.
|
||||||
|
// Note that it is limited to environment names and values of 512 utf-16 values each
|
||||||
|
// due to the necessary utf-8 <> utf-16 conversion.
|
||||||
|
@(require_results)
|
||||||
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
key_buf: [513]u16
|
||||||
|
wkey := win32.utf8_to_wstring(key_buf[:], key)
|
||||||
|
if wkey == nil {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
}
|
||||||
|
|
||||||
|
n2 := win32.GetEnvironmentVariableW(wkey, nil, 0)
|
||||||
|
if n2 == 0 {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
}
|
||||||
|
|
||||||
|
val_buf: [513]u16
|
||||||
|
n2 = win32.GetEnvironmentVariableW(wkey, raw_data(val_buf[:]), u32(len(val_buf[:])))
|
||||||
|
if n2 == 0 {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else if int(n2) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
}
|
||||||
|
|
||||||
|
value = win32.utf16_to_utf8(buf, val_buf[:n2])
|
||||||
|
|
||||||
|
return value, nil
|
||||||
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
// get_env retrieves the value of the environment variable named by the key
|
// get_env retrieves the value of the environment variable named by the key
|
||||||
// It returns the value, which will be empty if the variable is not present
|
// It returns the value, which will be empty if the variable is not present
|
||||||
// To distinguish between an empty value and an unset value, use lookup_env
|
// To distinguish between an empty value and an unset value, use lookup_env
|
||||||
// NOTE: the value will be allocated with the supplied allocator
|
// NOTE: the value will be allocated with the supplied allocator
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
value, _ = lookup_env(key, allocator)
|
value, _ = lookup_env(key, allocator)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
|
|
||||||
// set_env sets the value of the environment variable named by the key
|
// set_env sets the value of the environment variable named by the key
|
||||||
set_env :: proc(key, value: string) -> Error {
|
set_env :: proc(key, value: string) -> Error {
|
||||||
k := win32.utf8_to_wstring(key)
|
k := win32.utf8_to_wstring(key)
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ General_Error :: enum u32 {
|
|||||||
|
|
||||||
File_Is_Pipe,
|
File_Is_Pipe,
|
||||||
Not_Dir,
|
Not_Dir,
|
||||||
|
|
||||||
|
// Environment variable not found.
|
||||||
|
Env_Var_Not_Found,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -82,6 +85,7 @@ error_string :: proc "contextless" (ferr: Error) -> string {
|
|||||||
case .Pattern_Has_Separator: return "pattern has separator"
|
case .Pattern_Has_Separator: return "pattern has separator"
|
||||||
case .File_Is_Pipe: return "file is pipe"
|
case .File_Is_Pipe: return "file is pipe"
|
||||||
case .Not_Dir: return "file is not directory"
|
case .Not_Dir: return "file is not directory"
|
||||||
|
case .Env_Var_Not_Found: return "environment variable not found"
|
||||||
}
|
}
|
||||||
case io.Error:
|
case io.Error:
|
||||||
switch e {
|
switch e {
|
||||||
|
|||||||
+27
-5
@@ -3,25 +3,47 @@ package os2
|
|||||||
import "base:runtime"
|
import "base:runtime"
|
||||||
import "core:strings"
|
import "core:strings"
|
||||||
|
|
||||||
// get_env retrieves the value of the environment variable named by the key
|
// `get_env` retrieves the value of the environment variable named by the key
|
||||||
// It returns the value, which will be empty if the variable is not present
|
// It returns the value, which will be empty if the variable is not present
|
||||||
// To distinguish between an empty value and an unset value, use lookup_env
|
// To distinguish between an empty value and an unset value, use lookup_env
|
||||||
// NOTE: the value will be allocated with the supplied allocator
|
// NOTE: the value will be allocated with the supplied allocator
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator: runtime.Allocator) -> string {
|
get_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> string {
|
||||||
value, _ := lookup_env(key, allocator)
|
value, _ := lookup_env(key, allocator)
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
// lookup_env gets the value of the environment variable named by the key
|
// `get_env` retrieves the value of the environment variable named by the key
|
||||||
|
// It returns the value, which will be empty if the variable is not present
|
||||||
|
// To distinguish between an empty value and an unset value, use lookup_env
|
||||||
|
// NOTE: this version takes a backing buffer for the string value
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> string {
|
||||||
|
value, _ := lookup_env(buf, key)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
|
// `lookup_env` gets the value of the environment variable named by the key
|
||||||
// If the variable is found in the environment the value (which can be empty) is returned and the boolean is true
|
// If the variable is found in the environment the value (which can be empty) is returned and the boolean is true
|
||||||
// Otherwise the returned value will be empty and the boolean will be false
|
// Otherwise the returned value will be empty and the boolean will be false
|
||||||
// NOTE: the value will be allocated with the supplied allocator
|
// NOTE: the value will be allocated with the supplied allocator
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
||||||
return _lookup_env(key, allocator)
|
return _lookup_env_alloc(key, allocator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This version of `lookup_env` doesn't allocate and instead requires the user to provide a buffer.
|
||||||
|
// Note that it is limited to environment names and values of 512 utf-16 values each
|
||||||
|
// due to the necessary utf-8 <> utf-16 conversion.
|
||||||
|
@(require_results)
|
||||||
|
lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
return _lookup_env_buf(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buf}
|
||||||
|
|
||||||
// set_env sets the value of the environment variable named by the key
|
// set_env sets the value of the environment variable named by the key
|
||||||
// Returns Error on failure
|
// Returns Error on failure
|
||||||
set_env :: proc(key, value: string) -> Error {
|
set_env :: proc(key, value: string) -> Error {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ _lookup :: proc(key: string) -> (value: string, idx: int) {
|
|||||||
return "", -1
|
return "", -1
|
||||||
}
|
}
|
||||||
|
|
||||||
_lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
_lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
||||||
if intrinsics.atomic_load_explicit(&_org_env_begin, .Acquire) == 0 {
|
if intrinsics.atomic_load_explicit(&_org_env_begin, .Acquire) == 0 {
|
||||||
_build_env()
|
_build_env()
|
||||||
}
|
}
|
||||||
@@ -53,6 +53,23 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
if intrinsics.atomic_load_explicit(&_org_env_begin, .Acquire) == 0 {
|
||||||
|
_build_env()
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, idx := _lookup(key); idx != -1 {
|
||||||
|
if len(buf) >= len(v) {
|
||||||
|
copy(buf, v)
|
||||||
|
return string(buf[:len(v)]), nil
|
||||||
|
}
|
||||||
|
return "", .Buffer_Full
|
||||||
|
}
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
}
|
||||||
|
|
||||||
|
_lookup_env :: proc{_lookup_env_alloc, _lookup_env_buf}
|
||||||
|
|
||||||
_set_env :: proc(key, v_new: string) -> Error {
|
_set_env :: proc(key, v_new: string) -> Error {
|
||||||
if intrinsics.atomic_load_explicit(&_org_env_begin, .Acquire) == 0 {
|
if intrinsics.atomic_load_explicit(&_org_env_begin, .Acquire) == 0 {
|
||||||
_build_env()
|
_build_env()
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import "base:runtime"
|
|||||||
import "core:strings"
|
import "core:strings"
|
||||||
import "core:sys/posix"
|
import "core:sys/posix"
|
||||||
|
|
||||||
_lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
_lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
||||||
if key == "" {
|
if key == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -26,6 +26,36 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, error: Error) {
|
||||||
|
if key == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
cval := posix.getenv(cstring(raw_data(buf)))
|
||||||
|
if cval == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if value = string(cval); value == "" {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(value) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, value)
|
||||||
|
return string(buf[:len(value)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_lookup_env :: proc{_lookup_env_alloc, _lookup_env_buf}
|
||||||
|
|
||||||
_set_env :: proc(key, value: string) -> (err: Error) {
|
_set_env :: proc(key, value: string) -> (err: Error) {
|
||||||
temp_allocator := TEMP_ALLOCATOR_GUARD({})
|
temp_allocator := TEMP_ALLOCATOR_GUARD({})
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ delete_string_if_not_original :: proc(str: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
_lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
_lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
||||||
if err := build_env(); err != nil {
|
if err := build_env(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -79,6 +79,34 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, error: Error) {
|
||||||
|
if key == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
sync.shared_guard(&g_env_mutex)
|
||||||
|
|
||||||
|
val, ok := g_env[key]
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(val) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, val)
|
||||||
|
return string(buf[:len(val)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_lookup_env :: proc{_lookup_env_alloc, _lookup_env_buf}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
_set_env :: proc(key, value: string) -> (err: Error) {
|
_set_env :: proc(key, value: string) -> (err: Error) {
|
||||||
build_env() or_return
|
build_env() or_return
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ package os2
|
|||||||
import win32 "core:sys/windows"
|
import win32 "core:sys/windows"
|
||||||
import "base:runtime"
|
import "base:runtime"
|
||||||
|
|
||||||
_lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
_lookup_env_alloc :: proc(key: string, allocator: runtime.Allocator) -> (value: string, found: bool) {
|
||||||
if key == "" {
|
if key == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -36,6 +36,36 @@ _lookup_env :: proc(key: string, allocator: runtime.Allocator) -> (value: string
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This version of `lookup_env` doesn't allocate and instead requires the user to provide a buffer.
|
||||||
|
// Note that it is limited to environment names and values of 512 utf-16 values each
|
||||||
|
// due to the necessary utf-8 <> utf-16 conversion.
|
||||||
|
@(require_results)
|
||||||
|
_lookup_env_buf :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
key_buf: [513]u16
|
||||||
|
wkey := win32.utf8_to_wstring(key_buf[:], key)
|
||||||
|
if wkey == nil {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
}
|
||||||
|
|
||||||
|
n2 := win32.GetEnvironmentVariableW(wkey, nil, 0)
|
||||||
|
if n2 == 0 {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
}
|
||||||
|
|
||||||
|
val_buf: [513]u16
|
||||||
|
n2 = win32.GetEnvironmentVariableW(wkey, raw_data(val_buf[:]), u32(len(val_buf[:])))
|
||||||
|
if n2 == 0 {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else if int(n2) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
}
|
||||||
|
|
||||||
|
value = win32.utf16_to_utf8(buf, val_buf[:n2])
|
||||||
|
|
||||||
|
return value, nil
|
||||||
|
}
|
||||||
|
_lookup_env :: proc{_lookup_env_alloc, _lookup_env_buf}
|
||||||
|
|
||||||
_set_env :: proc(key, value: string) -> Error {
|
_set_env :: proc(key, value: string) -> Error {
|
||||||
temp_allocator := TEMP_ALLOCATOR_GUARD({})
|
temp_allocator := TEMP_ALLOCATOR_GUARD({})
|
||||||
k := win32_utf8_to_wstring(key, temp_allocator) or_return
|
k := win32_utf8_to_wstring(key, temp_allocator) or_return
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ General_Error :: enum u32 {
|
|||||||
Pattern_Has_Separator,
|
Pattern_Has_Separator,
|
||||||
|
|
||||||
No_HOME_Variable,
|
No_HOME_Variable,
|
||||||
Wordexp_Failed,
|
Env_Var_Not_Found,
|
||||||
|
|
||||||
Unsupported,
|
Unsupported,
|
||||||
}
|
}
|
||||||
@@ -77,7 +77,7 @@ error_string :: proc(ferr: Error) -> string {
|
|||||||
case .Unsupported: return "unsupported"
|
case .Unsupported: return "unsupported"
|
||||||
case .Pattern_Has_Separator: return "pattern has separator"
|
case .Pattern_Has_Separator: return "pattern has separator"
|
||||||
case .No_HOME_Variable: return "no $HOME variable"
|
case .No_HOME_Variable: return "no $HOME variable"
|
||||||
case .Wordexp_Failed: return "posix.wordexp was unable to expand"
|
case .Env_Var_Not_Found: return "environment variable not found"
|
||||||
}
|
}
|
||||||
case io.Error:
|
case io.Error:
|
||||||
switch e {
|
switch e {
|
||||||
|
|||||||
+31
-2
@@ -1055,9 +1055,10 @@ flush :: proc(fd: Handle) -> Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
||||||
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
|
// NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults.
|
||||||
cstr := _unix_getenv(path_str)
|
cstr := _unix_getenv(path_str)
|
||||||
if cstr == nil {
|
if cstr == nil {
|
||||||
return "", false
|
return "", false
|
||||||
@@ -1066,11 +1067,39 @@ lookup_env :: proc(key: string, allocator := context.allocator) -> (value: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(value) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, value)
|
||||||
|
return string(buf[:len(value)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
value, _ = lookup_env(key, allocator)
|
value, _ = lookup_env(key, allocator)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
set_env :: proc(key, value: string) -> Error {
|
set_env :: proc(key, value: string) -> Error {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD()
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD()
|
||||||
key_cstring := strings.clone_to_cstring(key, context.temp_allocator)
|
key_cstring := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
|
|||||||
+31
-3
@@ -827,10 +827,10 @@ access :: proc(path: string, mask: int) -> (bool, Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
||||||
|
|
||||||
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
|
// NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults.
|
||||||
cstr := _unix_getenv(path_str)
|
cstr := _unix_getenv(path_str)
|
||||||
if cstr == nil {
|
if cstr == nil {
|
||||||
return "", false
|
return "", false
|
||||||
@@ -839,11 +839,39 @@ lookup_env :: proc(key: string, allocator := context.allocator) -> (value: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(value) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, value)
|
||||||
|
return string(buf[:len(value)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
value, _ = lookup_env(key, allocator)
|
value, _ = lookup_env(key, allocator)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_current_directory :: proc(allocator := context.allocator) -> string {
|
get_current_directory :: proc(allocator := context.allocator) -> string {
|
||||||
context.allocator = allocator
|
context.allocator = allocator
|
||||||
|
|||||||
+32
-2
@@ -463,9 +463,10 @@ access :: proc(path: string, mask: int) -> (bool, Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
||||||
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
|
// NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults.
|
||||||
cstr := _unix_getenv(path_str)
|
cstr := _unix_getenv(path_str)
|
||||||
if cstr == nil {
|
if cstr == nil {
|
||||||
return "", false
|
return "", false
|
||||||
@@ -474,11 +475,40 @@ lookup_env :: proc(key: string, allocator := context.allocator) -> (value: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(value) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, value)
|
||||||
|
return string(buf[:len(value)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
value, _ = lookup_env(key, allocator)
|
value, _ = lookup_env(key, allocator)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
|
|
||||||
@(private, require_results)
|
@(private, require_results)
|
||||||
_processor_core_count :: proc() -> int {
|
_processor_core_count :: proc() -> int {
|
||||||
info: haiku.system_info
|
info: haiku.system_info
|
||||||
|
|||||||
+20
-5
@@ -250,11 +250,26 @@ current_thread_id :: proc "contextless" () -> int {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
@(require_results)
|
||||||
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
|
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> string {
|
@(require_results)
|
||||||
value, _ := lookup_env(key, allocator)
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
return value
|
return "", .Env_Var_Not_Found
|
||||||
}
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
|
value, _ = lookup_env(key, allocator)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
+30
-2
@@ -946,7 +946,7 @@ access :: proc(path: string, mask: int) -> (bool, Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
||||||
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
// NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults.
|
// NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults.
|
||||||
@@ -958,11 +958,39 @@ lookup_env :: proc(key: string, allocator := context.allocator) -> (value: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(value) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, value)
|
||||||
|
return string(buf[:len(value)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
value, _ = lookup_env(key, allocator)
|
value, _ = lookup_env(key, allocator)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
set_env :: proc(key, value: string) -> Error {
|
set_env :: proc(key, value: string) -> Error {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD()
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD()
|
||||||
key_cstring := strings.clone_to_cstring(key, context.temp_allocator)
|
key_cstring := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
|
|||||||
+31
-3
@@ -874,10 +874,10 @@ access :: proc(path: string, mask: int) -> (bool, Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
||||||
|
|
||||||
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
|
// NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults.
|
||||||
cstr := _unix_getenv(path_str)
|
cstr := _unix_getenv(path_str)
|
||||||
if cstr == nil {
|
if cstr == nil {
|
||||||
return "", false
|
return "", false
|
||||||
@@ -886,11 +886,39 @@ lookup_env :: proc(key: string, allocator := context.allocator) -> (value: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(value) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, value)
|
||||||
|
return string(buf[:len(value)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
value, _ = lookup_env(key, allocator)
|
value, _ = lookup_env(key, allocator)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_current_directory :: proc(allocator := context.allocator) -> string {
|
get_current_directory :: proc(allocator := context.allocator) -> string {
|
||||||
context.allocator = allocator
|
context.allocator = allocator
|
||||||
|
|||||||
+31
-2
@@ -787,9 +787,10 @@ access :: proc(path: string, mask: int) -> (bool, Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator)
|
||||||
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
path_str := strings.clone_to_cstring(key, context.temp_allocator)
|
||||||
|
// NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults.
|
||||||
cstr := _unix_getenv(path_str)
|
cstr := _unix_getenv(path_str)
|
||||||
if cstr == nil {
|
if cstr == nil {
|
||||||
return "", false
|
return "", false
|
||||||
@@ -798,11 +799,39 @@ lookup_env :: proc(key: string, allocator := context.allocator) -> (value: strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
|
if len(key) + 1 > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" {
|
||||||
|
return "", .Env_Var_Not_Found
|
||||||
|
} else {
|
||||||
|
if len(value) > len(buf) {
|
||||||
|
return "", .Buffer_Full
|
||||||
|
} else {
|
||||||
|
copy(buf, value)
|
||||||
|
return string(buf[:len(value)]), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
value, _ = lookup_env(key, allocator)
|
value, _ = lookup_env(key, allocator)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
|
|
||||||
@(require_results)
|
@(require_results)
|
||||||
get_current_directory :: proc(allocator := context.allocator) -> string {
|
get_current_directory :: proc(allocator := context.allocator) -> string {
|
||||||
context.allocator = allocator
|
context.allocator = allocator
|
||||||
|
|||||||
+20
-5
@@ -240,11 +240,26 @@ exit :: proc "contextless" (code: int) -> ! {
|
|||||||
wasi.proc_exit(wasi.exitcode_t(code))
|
wasi.proc_exit(wasi.exitcode_t(code))
|
||||||
}
|
}
|
||||||
|
|
||||||
lookup_env :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
@(require_results)
|
||||||
|
lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) {
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
|
|
||||||
get_env :: proc(key: string, allocator := context.allocator) -> string {
|
@(require_results)
|
||||||
value, _ := lookup_env(key, allocator)
|
lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) {
|
||||||
return value
|
return "", .Env_Var_Not_Found
|
||||||
}
|
}
|
||||||
|
lookup_env :: proc{lookup_env_alloc, lookup_env_buffer}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) {
|
||||||
|
value, _ = lookup_env(key, allocator)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
@(require_results)
|
||||||
|
get_env_buf :: proc(buf: []u8, key: string) -> (value: string) {
|
||||||
|
value, _ = lookup_env(buf, key)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
get_env :: proc{get_env_alloc, get_env_buf}
|
||||||
@@ -75,7 +75,7 @@ LANGIDFROMLCID :: #force_inline proc "contextless" (lcid: LCID) -> LANGID {
|
|||||||
return LANGID(lcid)
|
return LANGID(lcid)
|
||||||
}
|
}
|
||||||
|
|
||||||
utf8_to_utf16 :: proc(s: string, allocator := context.temp_allocator) -> []u16 {
|
utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> []u16 {
|
||||||
if len(s) < 1 {
|
if len(s) < 1 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -101,14 +101,42 @@ utf8_to_utf16 :: proc(s: string, allocator := context.temp_allocator) -> []u16 {
|
|||||||
}
|
}
|
||||||
return text[:n]
|
return text[:n]
|
||||||
}
|
}
|
||||||
utf8_to_wstring :: proc(s: string, allocator := context.temp_allocator) -> wstring {
|
|
||||||
|
utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 {
|
||||||
|
n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), i32(len(s)), nil, 0)
|
||||||
|
if n1 == 0 {
|
||||||
|
return nil
|
||||||
|
} else if int(n1) > len(buf) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
n1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), i32(len(s)), raw_data(buf[:]), n1)
|
||||||
|
if n1 == 0 {
|
||||||
|
return nil
|
||||||
|
} else if int(n1) > len(buf) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return buf[:n1]
|
||||||
|
}
|
||||||
|
utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf}
|
||||||
|
|
||||||
|
utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> wstring {
|
||||||
if res := utf8_to_utf16(s, allocator); len(res) > 0 {
|
if res := utf8_to_utf16(s, allocator); len(res) > 0 {
|
||||||
return raw_data(res)
|
return raw_data(res)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring_to_utf8 :: proc(s: wstring, N: int, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) {
|
utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring {
|
||||||
|
if res := utf8_to_utf16(buf, s); len(res) > 0 {
|
||||||
|
return raw_data(res)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf}
|
||||||
|
|
||||||
|
wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) {
|
||||||
context.allocator = allocator
|
context.allocator = allocator
|
||||||
|
|
||||||
if N == 0 {
|
if N == 0 {
|
||||||
@@ -142,13 +170,49 @@ wstring_to_utf8 :: proc(s: wstring, N: int, allocator := context.temp_allocator)
|
|||||||
return string(text[:n]), nil
|
return string(text[:n]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
utf16_to_utf8 :: proc(s: []u16, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) {
|
wstring_to_utf8_buf :: proc(buf: []u8, s: wstring) -> (res: string) {
|
||||||
|
n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, -1, nil, 0, nil, nil)
|
||||||
|
if n == 0 {
|
||||||
|
return
|
||||||
|
} else if int(n) > len(buf) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
n2 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, -1, raw_data(buf), n, nil, nil)
|
||||||
|
if n2 == 0 {
|
||||||
|
return
|
||||||
|
} else if int(n2) > len(buf) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in 0..<n2 {
|
||||||
|
if buf[i] == 0 {
|
||||||
|
n2 = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string(buf[:n2])
|
||||||
|
}
|
||||||
|
|
||||||
|
wstring_to_utf8 :: proc{wstring_to_utf8_alloc, wstring_to_utf8_buf}
|
||||||
|
|
||||||
|
utf16_to_utf8_alloc :: proc(s: []u16, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) {
|
||||||
if len(s) == 0 {
|
if len(s) == 0 {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
return wstring_to_utf8(raw_data(s), len(s), allocator)
|
return wstring_to_utf8(raw_data(s), len(s), allocator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
utf16_to_utf8_buf :: proc(buf: []u8, s: []u16) -> (res: string) {
|
||||||
|
if len(s) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return wstring_to_utf8(buf, raw_data(s))
|
||||||
|
}
|
||||||
|
|
||||||
|
utf16_to_utf8 :: proc{utf16_to_utf8_alloc, utf16_to_utf8_buf}
|
||||||
|
|
||||||
|
|
||||||
// AdvAPI32, NetAPI32 and UserENV helpers.
|
// AdvAPI32, NetAPI32 and UserENV helpers.
|
||||||
|
|
||||||
allowed_username :: proc(username: string) -> bool {
|
allowed_username :: proc(username: string) -> bool {
|
||||||
|
|||||||
@@ -11,17 +11,17 @@ import "core:strings"
|
|||||||
// - [[ https://invisible-island.net/ncurses/terminfo.src.html ]]
|
// - [[ https://invisible-island.net/ncurses/terminfo.src.html ]]
|
||||||
|
|
||||||
get_no_color :: proc() -> bool {
|
get_no_color :: proc() -> bool {
|
||||||
if no_color, ok := os.lookup_env("NO_COLOR"); ok {
|
buf: [128]u8
|
||||||
defer delete(no_color)
|
if no_color, err := os.lookup_env(buf[:], "NO_COLOR"); err == nil {
|
||||||
return no_color != ""
|
return no_color != ""
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
get_environment_color :: proc() -> Color_Depth {
|
get_environment_color :: proc() -> Color_Depth {
|
||||||
|
buf: [128]u8
|
||||||
// `COLORTERM` is non-standard but widespread and unambiguous.
|
// `COLORTERM` is non-standard but widespread and unambiguous.
|
||||||
if colorterm, ok := os.lookup_env("COLORTERM"); ok {
|
if colorterm, err := os.lookup_env(buf[:], "COLORTERM"); err == nil {
|
||||||
defer delete(colorterm)
|
|
||||||
// These are the only values that are typically advertised that have
|
// These are the only values that are typically advertised that have
|
||||||
// anything to do with color depth.
|
// anything to do with color depth.
|
||||||
if colorterm == "truecolor" || colorterm == "24bit" {
|
if colorterm == "truecolor" || colorterm == "24bit" {
|
||||||
@@ -29,8 +29,7 @@ get_environment_color :: proc() -> Color_Depth {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if term, ok := os.lookup_env("TERM"); ok {
|
if term, err := os.lookup_env(buf[:], "TERM"); err == nil {
|
||||||
defer delete(term)
|
|
||||||
if strings.contains(term, "-truecolor") {
|
if strings.contains(term, "-truecolor") {
|
||||||
return .True_Color
|
return .True_Color
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user