From db84d5e22178cf512bcfb111ee9e590a6de6e511 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Tue, 6 Apr 2021 18:00:42 +0300 Subject: [PATCH] os: cleanup os.environ implementation --- vlib/builtin/int.v | 4 ++++ vlib/os/environment.c.v | 22 ++++++++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/vlib/builtin/int.v b/vlib/builtin/int.v index 69a31d5cf7..fbfdb59220 100644 --- a/vlib/builtin/int.v +++ b/vlib/builtin/int.v @@ -52,6 +52,10 @@ pub fn ptr_str(ptr voidptr) string { return buf1 } +pub fn (cptr &char) str() string { + return u64(cptr).hex() +} + const ( digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999' ) diff --git a/vlib/os/environment.c.v b/vlib/os/environment.c.v index 9c45f3a0bc..1b65a27920 100644 --- a/vlib/os/environment.c.v +++ b/vlib/os/environment.c.v @@ -66,11 +66,10 @@ pub fn unsetenv(name string) int { // See: https://linux.die.net/man/5/environ for unix platforms. // See: https://docs.microsoft.com/bg-bg/windows/win32/api/processenv/nf-processenv-getenvironmentstrings // os.environ returns a map of all the current environment variables -type PChar = &char -type PPChar = &&char -fn deref_ppchar(x &PChar) &char { - return &char(*x) +fn unix_environ() &&char { + // TODO: remove this helper function, when `&&char(C.environ)` works properly + return voidptr(C.environ) } pub fn environ() map[string]string { @@ -90,20 +89,19 @@ pub fn environ() map[string]string { } C.FreeEnvironmentStringsW(estrings) } $else { - e := unsafe { PPChar(voidptr(C.environ)) } - size_of_pchar := int(sizeof(PChar)) - for i := 0; true; i++ { - z := voidptr(unsafe { &byte(voidptr(e)) + size_of_pchar * i }) - current_ptr := &PChar(z) - derefed := deref_ppchar(current_ptr) - if isnil(derefed) { + start := unix_environ() + mut i := 0 + for { + x := unsafe { start[i] } + if x == 0 { break } - eline := unsafe { cstring_to_vstring(derefed) } + eline := unsafe { cstring_to_vstring(x) } eq_index := eline.index_byte(`=`) if eq_index > 0 { res[eline[0..eq_index]] = eline[eq_index + 1..] } + i++ } } return res