add unix.environ() & use LPCWSTR in dylib.dlopen on Windows platform

This commit is contained in:
ValKmjolnir
2022-03-05 19:15:52 +08:00
parent 3cd9d02de4
commit ebb601abbf
4 changed files with 28 additions and 9 deletions
+1 -1
View File
@@ -278,7 +278,7 @@ var unix=
time: func(){return time(0);},
sleep: func(secs){return __builtin_sleep(secs);},
chdir: func(path){return __builtin_chdir(path);},
environ: func(){die("not supported yet");},
environ: func(){return __builtin_environ();},
getcwd: func(){return __builtin_getcwd();},
getenv: func(envvar){return __builtin_getenv(envvar);}
};
+22 -6
View File
@@ -77,6 +77,7 @@ nas_native(builtin_opendir);
nas_native(builtin_readdir);
nas_native(builtin_closedir);
nas_native(builtin_chdir);
nas_native(builtin_environ);
nas_native(builtin_getcwd);
nas_native(builtin_getenv);
nas_native(builtin_dlopen);
@@ -160,6 +161,7 @@ struct
{"__builtin_readdir", builtin_readdir },
{"__builtin_closedir",builtin_closedir},
{"__builtin_chdir", builtin_chdir },
{"__builtin_environ", builtin_environ },
{"__builtin_getcwd", builtin_getcwd },
{"__builtin_getenv", builtin_getenv },
{"__builtin_dlopen", builtin_dlopen },
@@ -984,6 +986,21 @@ nasal_ref builtin_chdir(nasal_ref* local,nasal_gc& gc)
return builtin_err("chdir","failed to execute chdir");
return nil;
}
nasal_ref builtin_environ(nasal_ref* local,nasal_gc& gc)
{
char** env=environ;
(++gc.top)[0]=gc.alloc(vm_vec);
auto& vec=gc.top[0].vec()->elems;
while(*env)
{
auto s=gc.alloc(vm_str);
*s.str()=*env;
vec.push_back(s);
++env;
}
--gc.top;
return gc.top[1];
}
nasal_ref builtin_getcwd(nasal_ref* local,nasal_gc& gc)
{
char buf[1024];
@@ -1010,12 +1027,11 @@ nasal_ref builtin_dlopen(nasal_ref* local,nasal_gc& gc)
if(dlname.type!=vm_str)
return builtin_err("dlopen","\"libname\" must be string");
#ifdef _WIN32
// wchar_t* str=new wchar_t[dlname.str()->size()+1];
// memset(str,0,sizeof(wchar_t)*dlname.str()->size()+1);
// mbstowcs(str,dlname.str()->c_str(),dlname.str()->size()+1);
// void* ptr=LoadLibrary(str);
// delete []str;
void* ptr=LoadLibrary(dlname.str()->c_str());
wchar_t* str=new wchar_t[dlname.str()->size()+1];
memset(str,0,sizeof(wchar_t)*dlname.str()->size()+1);
mbstowcs(str,dlname.str()->c_str(),dlname.str()->size()+1);
void* ptr=LoadLibraryW(str);
delete []str;
#else
void* ptr=dlopen(dlname.str()->c_str(),RTLD_LOCAL|RTLD_LAZY);
#endif
+1 -1
View File
@@ -278,7 +278,7 @@ var unix=
time: func(){return time(0);},
sleep: func(secs){return __builtin_sleep(secs);},
chdir: func(path){return __builtin_chdir(path);},
environ: func(){die("not supported yet");},
environ: func(){return __builtin_environ();},
getcwd: func(){return __builtin_getcwd();},
getenv: func(envvar){return __builtin_getenv(envvar);}
};
+4 -1
View File
@@ -59,7 +59,10 @@ var testfile=[
];
var module=[
"module/fib.cpp "
"module/fib.cpp ",
"module/keyboard.cpp ",
"module/libfib.nas ",
"module/libkey.nas "
];
var getname=func(s){