diff --git a/3rd/lua/bee_lua.c b/3rd/lua/bee_lua.c new file mode 100644 index 00000000..5c32002f --- /dev/null +++ b/3rd/lua/bee_lua.c @@ -0,0 +1,7 @@ +#if defined(_WIN32) +# define main(a, b) utf8_main(a, b) +# include "lua.c" +# undef main +#else +# include "lua.c" +#endif diff --git a/3rd/lua/bee_utf8_crt.cpp b/3rd/lua/bee_utf8_crt.cpp index 87ffc7d9..dad230a8 100644 --- a/3rd/lua/bee_utf8_crt.cpp +++ b/3rd/lua/bee_utf8_crt.cpp @@ -206,34 +206,4 @@ void utf8_ConsoleError(const char* fmt, const char* param) { ConsoleWrite(stderr, str); } -char** utf8_create_args(int argc, wchar_t** wargv) { - char** argv = new (std::nothrow) char*[argc + 1]; - if (!argv) { - return NULL; - } - for (int i = 0; i < argc; ++i) { - size_t wlen = wcslen(wargv[i]); - size_t len = wtf8_from_utf16_length(wargv[i], wlen); - argv[i] = new (std::nothrow) char[len + 1]; - if (!argv[i]) { - for (int j = 0; j < i; ++j) { - delete[] argv[j]; - } - delete[] argv; - return NULL; - } - wtf8_from_utf16(wargv[i], wlen, argv[i], len); - argv[i][len] = '\0'; - } - argv[argc] = NULL; - return argv; -} - -void utf8_free_args(int argc, char** argv) { - for (int i = 0; i < argc; ++i) { - delete[] argv[i]; - } - delete[] argv; -} - #endif diff --git a/3rd/lua/bee_utf8_crt.h b/3rd/lua/bee_utf8_crt.h index 4f95a0eb..3128f995 100644 --- a/3rd/lua/bee_utf8_crt.h +++ b/3rd/lua/bee_utf8_crt.h @@ -32,9 +32,6 @@ void utf8_ConsoleWrite(const char* msg, size_t sz); void utf8_ConsoleNewLine(); void utf8_ConsoleError(const char* fmt, const char* param); -char** utf8_create_args(int argc, wchar_t** wargv); -void utf8_free_args(int argc, char** argv); - #endif #if defined(__cplusplus) diff --git a/3rd/lua/bee_utf8_main.c b/3rd/lua/bee_utf8_main.c new file mode 100644 index 00000000..a36467e0 --- /dev/null +++ b/3rd/lua/bee_utf8_main.c @@ -0,0 +1,81 @@ +#pragma once + +#if defined(_WIN32) + +# include +# include +# include +# include + +static char** utf8_create_args(int argc, wchar_t** wargv) { + char** argv = (char**)malloc((argc + 1) * sizeof(char*)); + if (!argv) { + return NULL; + } + for (int i = 0; i < argc; ++i) { + size_t wlen = wcslen(wargv[i]); + size_t len = wtf8_from_utf16_length(wargv[i], wlen); + argv[i] = (char*)malloc((len + 1) * sizeof(char)); + + if (!argv[i]) { + for (int j = 0; j < i; ++j) { + free(argv[j]); + } + free(argv); + return NULL; + } + wtf8_from_utf16(wargv[i], wlen, argv[i], len); + argv[i][len] = '\0'; + } + argv[argc] = NULL; + return argv; +} + +static void utf8_free_args(int argc, char** argv) { + for (int i = 0; i < argc; ++i) { + free(argv[i]); + } + free(argv); +} + +extern int utf8_main(int argc, char** argv); + +static void enable_vtmode(HANDLE h) { + if (h == INVALID_HANDLE_VALUE) { + return; + } + DWORD mode = 0; + if (!GetConsoleMode(h, &mode)) { + return; + } + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(h, mode); +} + +int wmain(int argc, wchar_t** wargv) { + enable_vtmode(GetStdHandle(STD_OUTPUT_HANDLE)); + enable_vtmode(GetStdHandle(STD_ERROR_HANDLE)); + char** argv = utf8_create_args(argc, wargv); + if (!argv) { + return EXIT_FAILURE; + } + int ret = utf8_main(argc, argv); + utf8_free_args(argc, argv); + return ret; +} + +# if defined(__MINGW32__) + +extern int _CRT_glob; +extern "C" void __wgetmainargs(int*, wchar_t***, wchar_t***, int, int*); + +int main() { + wchar_t **enpv, **argv; + int argc, si = 0; + __wgetmainargs(&argc, &argv, &enpv, _CRT_glob, &si); + return wmain(argc, argv); +} + +# endif + +#endif diff --git a/3rd/lua/utf8_prefix.h b/3rd/lua/bee_utf8_prefix.h similarity index 100% rename from 3rd/lua/utf8_prefix.h rename to 3rd/lua/bee_utf8_prefix.h diff --git a/3rd/lua/lprefix.h b/3rd/lua/lprefix.h index 856b6920..0654a4d1 100644 --- a/3rd/lua/lprefix.h +++ b/3rd/lua/lprefix.h @@ -39,7 +39,7 @@ #define _CRT_SECURE_NO_WARNINGS /* avoid warnings about ISO C functions */ #endif -#include "utf8_prefix.h" +#include "bee_utf8_prefix.h" #endif /* } */ diff --git a/3rd/lua/onelua.c b/3rd/lua/onelua.c index 1ee283c1..67eb9d6f 100644 --- a/3rd/lua/onelua.c +++ b/3rd/lua/onelua.c @@ -113,10 +113,22 @@ /* lua */ #ifdef MAKE_LUA -#include "lua.c" +# if defined(_WIN32) +# define main(a, b) utf8_main(a, b) +# include "lua.c" +# undef main +# else +# include "lua.c" +# endif #endif /* luac */ #ifdef MAKE_LUAC -#include "utf8_luac.c" +# if defined(_WIN32) +# define main(a, b) utf8_main(a, b) +# include "luac.c" +# undef main +# else +# include "luac.c" +# endif #endif diff --git a/3rd/lua/utf8_lua.c b/3rd/lua/utf8_lua.c deleted file mode 100644 index 10174bc3..00000000 --- a/3rd/lua/utf8_lua.c +++ /dev/null @@ -1,59 +0,0 @@ -#if !defined(_WIN32) - -# include "lua.c" - -#else - -# define main(a, b) utf8_main(a, b) -# include "lua.c" -# undef main -# include - -# include "bee_utf8_crt.h" - -static void enable_vtmode(HANDLE h) { - if (h == INVALID_HANDLE_VALUE) { - return; - } - DWORD mode = 0; - if (!GetConsoleMode(h, &mode)) { - return; - } - mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - SetConsoleMode(h, mode); -} - -int wmain(int argc, wchar_t **wargv) { - enable_vtmode(GetStdHandle(STD_OUTPUT_HANDLE)); - enable_vtmode(GetStdHandle(STD_ERROR_HANDLE)); - char **argv = utf8_create_args(argc, wargv); - if (!argv) { - return EXIT_FAILURE; - } - int ret = utf8_main(argc, argv); - utf8_free_args(argc, argv); - return ret; -} - -# if defined(__MINGW32__) - -# include - -extern int _CRT_glob; -extern -# ifdef __cplusplus - "C" -# endif - void - __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, int *); - -int main() { - wchar_t **enpv, **argv; - int argc, si = 0; - __wgetmainargs(&argc, &argv, &enpv, _CRT_glob, &si); - return wmain(argc, argv); -} - -# endif - -#endif diff --git a/3rd/lua/utf8_luac.c b/3rd/lua/utf8_luac.c deleted file mode 100644 index 18310855..00000000 --- a/3rd/lua/utf8_luac.c +++ /dev/null @@ -1,40 +0,0 @@ -#if !defined(_WIN32) - -# include "luac.c" - -#else - -# define main(a, b) utf8_main(a, b) -# include "luac.c" -# undef main -# include - -# include "bee_utf8_crt.h" - -int wmain(int argc, wchar_t **wargv) { - char **argv = utf8_create_args(argc, wargv); - if (!argv) { - return EXIT_FAILURE; - } - int ret = utf8_main(argc, argv); - utf8_free_args(argc, argv); - return ret; -} - -# if defined(__MINGW32__) - -# include - -extern int _CRT_glob; -extern "C" void __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, int *); - -int main() { - wchar_t **enpv, **argv; - int argc, si = 0; - __wgetmainargs(&argc, &argv, &enpv, _CRT_glob, &si); - return wmain(argc, argv); -} - -# endif - -#endif diff --git a/bootstrap/main.cpp b/bootstrap/main.cpp index 73bd2106..81f10100 100644 --- a/bootstrap/main.cpp +++ b/bootstrap/main.cpp @@ -246,7 +246,7 @@ static int pmain(lua_State *L) { } #if defined(_WIN32) -static int utf8_main(int argc, char **argv) { +extern "C" int utf8_main(int argc, char **argv) { #else int main(int argc, char **argv) { #endif @@ -265,47 +265,3 @@ int main(int argc, char **argv) { lua_close(L); return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; } - -#if defined(_WIN32) - -# include -# include - -static void enable_vtmode(HANDLE h) { - if (h == INVALID_HANDLE_VALUE) { - return; - } - DWORD mode = 0; - if (!GetConsoleMode(h, &mode)) { - return; - } - mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - SetConsoleMode(h, mode); -} - -int wmain(int argc, wchar_t **wargv) { - enable_vtmode(GetStdHandle(STD_OUTPUT_HANDLE)); - enable_vtmode(GetStdHandle(STD_ERROR_HANDLE)); - char **argv = utf8_create_args(argc, wargv); - int ret = utf8_main(argc, argv); - utf8_free_args(argc, argv); - return ret; -} - -# if defined(__MINGW32__) - -# include - -extern int _CRT_glob; -extern "C" void __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, int *); - -int main() { - wchar_t **enpv, **argv; - int argc, si = 0; - __wgetmainargs(&argc, &argv, &enpv, _CRT_glob, &si); - return wmain(argc, argv); -} - -# endif - -#endif diff --git a/compile/common.lua b/compile/common.lua index 482d7e32..a083d3c3 100644 --- a/compile/common.lua +++ b/compile/common.lua @@ -179,7 +179,10 @@ lm:lua_source "source_bee" { lm:source_set "source_lua" { includes = ".", - sources = "3rd/lua/bee_utf8_crt.cpp", + sources = { + "3rd/lua/bee_utf8_crt.cpp", + "3rd/lua/bee_utf8_main.c", + }, } lm:source_set "source_lua" { diff --git a/compile/lua.lua b/compile/lua.lua index 981bac14..3778cb24 100644 --- a/compile/lua.lua +++ b/compile/lua.lua @@ -12,11 +12,15 @@ lm:lua_dll "bee" { } if lm.os == "windows" then - lm:source_set "lua54" { + lm:source_set "bee_utf8_crt" { includes = ".", - sources = "3rd/lua/bee_utf8_crt.cpp", + sources = { + "3rd/lua/bee_utf8_crt.cpp", + "bee/platform/win/wtf8_win.cpp", + }, } lm:shared_library "lua54" { + deps = "bee_utf8_crt", sources = { "3rd/lua/onelua.c", "3rd/lua/linit.c", @@ -31,18 +35,22 @@ if lm.os == "windows" then } } lm:executable "lua" { - deps = "lua54", + deps = { + "lua54", + "bee_utf8_crt", + }, includes = ".", sources = { - "3rd/lua/utf8_lua.c", - "3rd/lua/bee_utf8_crt.cpp", + "3rd/lua/bee_lua.c", + "3rd/lua/bee_utf8_main.c", } } lm:executable "luac" { + deps = "bee_utf8_crt", includes = ".", sources = { "3rd/lua/onelua.c", - "3rd/lua/bee_utf8_crt.cpp", + "3rd/lua/bee_utf8_main.c", }, defines = { "MAKE_LUAC",