os: cleanup os.environ implementation

pull/9617/head
Delyan Angelov 2021-04-06 18:00:42 +03:00
parent 1e2a92945c
commit db84d5e221
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
2 changed files with 14 additions and 12 deletions

View File

@ -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'
)

View File

@ -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