1
1
# # core libc calls ##
2
2
3
- hasenv (s:: String ) = ccall (:getenv , Ptr{Uint8}, (Ptr{Uint8},), s) != C_NULL
3
+ @unix_only _getenv (var:: String ) = ccall (:getenv , Ptr{Uint8}, (Ptr{Uint8},), var)
4
+ @unix_only hasenv (s:: String ) = _getenv (s) != C_NULL
4
5
5
- function getenv (var:: String )
6
- val = ccall (:getenv , Ptr{Uint8}, (Ptr{Uint8},), var)
6
+ @windows_only begin
7
+ _getenvlen (var:: String ) = ccall (:GetEnvironmentVariableA ,stdcall,Uint32,(Ptr{Uint8},Ptr{Uint8},Uint32),var,C_NULL ,0 )
8
+ hasenv (s:: String ) = false # _getenvlen(s)!=0
9
+ function _jl_win_getenv (s:: String ,len:: Uint32 )
10
+ val= zeros (Uint8,len)
11
+ ret= ccall (:GetEnvironmentVariableA ,stdcall,Uint32,(Ptr{Uint8},Ptr{Uint8},Uint32),s,val,len)
12
+ if (ret== 0 || ret!= len- 1 ) # Trailing 0 is only included on first call to GetEnvA
13
+ error (" getenv: unknown system error: " , s, len, ret)
14
+ end
15
+ val
16
+ end
17
+ end
18
+
19
+ macro accessEnv (var,errorcase)
20
+ @unix_only quote
21
+ val= _getenv ($ var)
7
22
if val == C_NULL
8
- error ( " getenv: undefined variable: " , var)
23
+ $ errorcase
9
24
end
10
25
cstring (val)
11
26
end
27
+ @windows_only quote
28
+ len= _getenvlen ($ var)
29
+ if len == 0
30
+ $ errorcase
31
+ end
32
+ cstring (convert (Ptr{Uint8},_jl_win_getenv ($ var,len)))
33
+ end
34
+ end
35
+
36
+ getenv (var:: String ) = @accessEnv var error (" getenv: undefined variable: " , var)
12
37
13
38
function setenv (var:: String , val:: String , overwrite:: Bool )
14
39
@unix_only begin
15
40
ret = ccall (:setenv , Int32, (Ptr{Uint8},Ptr{Uint8},Int32), var, val, overwrite)
16
41
system_error (:setenv , ret != 0 )
17
42
end
18
43
@windows_only begin
44
+ if (overwrite||! hasenv (var))
19
45
ret = ccall (:SetEnvironmentVariableA ,stdcall,Int32,(Ptr{Uint8},Ptr{Uint8}),var,val)
20
46
system_error (:setenv , ret == 0 )
21
47
end
22
48
end
49
+ end
23
50
24
51
setenv (var:: String , val:: String ) = setenv (var, val, true )
25
52
@@ -40,21 +67,9 @@ type EnvHash <: Associative{ByteString,ByteString}; end
40
67
41
68
const ENV = EnvHash ()
42
69
43
- function ref (:: EnvHash , k:: String )
44
- val = ccall (:getenv , Ptr{Uint8}, (Ptr{Uint8},), k)
45
- if val == C_NULL
46
- throw (KeyError (k))
47
- end
48
- cstring (val)
49
- end
70
+ ref (:: EnvHash , k:: String ) = @accessEnv k throw (KeyError (k))
50
71
51
- function get (:: EnvHash , k:: String , deflt)
52
- val = ccall (:getenv , Ptr{Uint8}, (Ptr{Uint8},), k)
53
- if val == C_NULL
54
- return deflt
55
- end
56
- cstring (val)
57
- end
72
+ get (:: EnvHash , k:: String , deflt) = @accessEnv k (return deflt)
58
73
59
74
has (:: EnvHash , k:: String ) = hasenv (k)
60
75
del (:: EnvHash , k:: String ) = unsetenv (k)
0 commit comments