github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/runtime/env_posix.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package runtime 6 7 import "unsafe" 8 9 func gogetenv(key string) string { 10 env := environ() 11 if env == nil { 12 throw("getenv before env init") 13 } 14 for _, s := range env { 15 if len(s) > len(key) && s[len(key)] == '=' && envKeyEqual(s[:len(key)], key) { 16 return s[len(key)+1:] 17 } 18 } 19 return "" 20 } 21 22 // envKeyEqual reports whether a == b, with ASCII-only case insensitivity 23 // on Windows. The two strings must have the same length. 24 func envKeyEqual(a, b string) bool { 25 if GOOS == "windows" { // case insensitive 26 for i := 0; i < len(a); i++ { 27 ca, cb := a[i], b[i] 28 if ca == cb || lowerASCII(ca) == lowerASCII(cb) { 29 continue 30 } 31 return false 32 } 33 return true 34 } 35 return a == b 36 } 37 38 func lowerASCII(c byte) byte { 39 if 'A' <= c && c <= 'Z' { 40 return c + ('a' - 'A') 41 } 42 return c 43 } 44 45 var _cgo_setenv unsafe.Pointer // pointer to C function 46 var _cgo_unsetenv unsafe.Pointer // pointer to C function 47 48 // Update the C environment if cgo is loaded. 49 func setenv_c(k string, v string) { 50 if _cgo_setenv == nil { 51 return 52 } 53 arg := [2]unsafe.Pointer{cstring(k), cstring(v)} 54 asmcgocall(_cgo_setenv, unsafe.Pointer(&arg)) 55 } 56 57 // Update the C environment if cgo is loaded. 58 func unsetenv_c(k string) { 59 if _cgo_unsetenv == nil { 60 return 61 } 62 arg := [1]unsafe.Pointer{cstring(k)} 63 asmcgocall(_cgo_unsetenv, unsafe.Pointer(&arg)) 64 } 65 66 func cstring(s string) unsafe.Pointer { 67 p := make([]byte, len(s)+1) 68 copy(p, s) 69 return unsafe.Pointer(&p[0]) 70 }