summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2019-04-27 00:07:48 +0800
committerruki <[email protected]>2019-04-26 18:46:51 +0800
commit2c52aa3ecd3c16da67a266d5a63ded6c4bd9fdd8 (patch)
tree4f4d9630001b9dea0dcfa0f19fa793c30a7f25b4 /core/src
parent6e34dd3a9f72eb9c7743b1eebb10f7fbc5996025 (diff)
impl os.getenvs for windows
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/os/getenvs.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/core/src/xmake/os/getenvs.c b/core/src/xmake/os/getenvs.c
index 81e0b68c7..f504ebab3 100644
--- a/core/src/xmake/os/getenvs.c
+++ b/core/src/xmake/os/getenvs.c
@@ -62,14 +62,59 @@ tb_int_t xm_os_getenvs(lua_State* lua)
lua_newtable(lua);
#ifdef TB_CONFIG_OS_WINDOWS
+ tb_wchar_t const* p = (tb_wchar_t const*)tb_kernel32()->GetEnvironmentStringsW();
+ if (p)
+ {
+ tb_int_t i = 0;
+ tb_char_t* data = tb_null;
+ tb_size_t maxn = 0;
+ tb_char_t line[TB_PATH_MAXN];
+ tb_size_t n = 0;
+ while (*p)
+ {
+ n = tb_wcslen(p);
+ if (n + 1 < tb_arrayn(line))
+ {
+ if (tb_wtoa(line, p, tb_arrayn(line)) >= 0)
+ {
+ lua_pushstring(lua, line);
+ lua_rawseti(lua, -2, i++);
+ }
+ }
+ else
+ {
+ if (!data)
+ {
+ maxn = n + 1;
+ data = (tb_char_t*)tb_malloc(maxn);
+ }
+ else if (n >= maxn)
+ {
+ maxn = n + TB_PATH_MAXN + 1;
+ data = (tb_char_t*)tb_ralloc(data, maxn);
+ }
+ tb_assert_and_check_break(data);
+
+ if (tb_wtoa(data, p, maxn) >= 0)
+ {
+ lua_pushstring(lua, data);
+ lua_rawseti(lua, -2, i++);
+ }
+ }
+ p += n + 1;
+ }
+ if (data && data != line) tb_free(data);
+ data = tb_null;
+ }
#else
tb_char_t const** p = (tb_char_t const**)environ;
if (p)
{
- tb_int_t i = 0;
+ tb_int_t i = 0;
+ tb_size_t n = 0;
while (*p)
{
- tb_size_t n = tb_strlen(*p);
+ n = tb_strlen(*p);
if (n)
{
lua_pushstring(lua, *p);