diff options
| author | ruki <[email protected]> | 2021-11-10 00:21:29 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-11-10 00:21:29 +0800 |
| commit | 0a17c9c9d9143dfa4281efb13b0f550533d96a18 (patch) | |
| tree | e04530f85f0b3cab8c29ec6daac253fbc8573fdd /core/src | |
| parent | f0d88dbc6bf6b06724edf942488a8e21050c9484 (diff) | |
support std for c++ modules/msvc
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/xmake/engine.c | 2 | ||||
| -rw-r--r-- | core/src/xmake/makefile | 3 | ||||
| -rw-r--r-- | core/src/xmake/winos/short_path.c | 79 |
3 files changed, 83 insertions, 1 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c index 34ed7a196..53ec0d1d0 100644 --- a/core/src/xmake/engine.c +++ b/core/src/xmake/engine.c @@ -187,6 +187,7 @@ tb_int_t xm_winos_logical_drives(lua_State* lua); tb_int_t xm_winos_registry_query(lua_State* lua); tb_int_t xm_winos_registry_keys(lua_State* lua); tb_int_t xm_winos_registry_values(lua_State* lua); +tb_int_t xm_winos_short_path(lua_State* lua); #endif // the string functions @@ -301,6 +302,7 @@ static luaL_Reg const g_winos_functions[] = , { "registry_query", xm_winos_registry_query } , { "registry_keys", xm_winos_registry_keys } , { "registry_values", xm_winos_registry_values } +, { "short_path", xm_winos_short_path } , { tb_null, tb_null } }; #endif diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile index f45d834e2..9e0a3decb 100644 --- a/core/src/xmake/makefile +++ b/core/src/xmake/makefile @@ -145,7 +145,8 @@ xmake_C_FILES += \ winos/logical_drives \ winos/registry_keys \ winos/registry_values \ - winos/registry_query + winos/registry_query \ + winos/short_path endif # flags diff --git a/core/src/xmake/winos/short_path.c b/core/src/xmake/winos/short_path.c new file mode 100644 index 000000000..040b33209 --- /dev/null +++ b/core/src/xmake/winos/short_path.c @@ -0,0 +1,79 @@ +/*!A cross-platform build utility based on Lua + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright (C) 2015-present, TBOOX Open Source Group. + * + * @author ruki + * @file short_path.c + * + */ + +/* ////////////////////////////////////////////////////////////////////////////////////// + * trace + */ +#define TB_TRACE_MODULE_NAME "short_path" +#define TB_TRACE_MODULE_DEBUG (0) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * includes + */ +#include "prefix.h" + +/* ////////////////////////////////////////////////////////////////////////////////////// + * implementation + */ + +/* get windows short path from long path + * + * local short_path, errors = winos.short_path(long_path) + */ +tb_int_t xm_winos_short_path(lua_State* lua) +{ + // check + tb_assert_and_check_return_val(lua, 0); + + // get the arguments + tb_char_t const* long_path = luaL_checkstring(lua, 1); + tb_check_return_val(long_path, 0); + + // convert long path to wide characters + tb_wchar_t long_path_w[TB_PATH_MAXN]; + if (tb_atow(long_path_w, long_path, TB_PATH_MAXN) == (tb_size_t)-1) + { + lua_pushnil(lua); + lua_pushfstring(lua, "invalid long path: %s", long_path); + return 2; + } + + // get short path + tb_wchar_t short_path_w[TB_PATH_MAXN]; + if (GetShortPathNameW(long_path_w, short_path_w, TB_PATH_MAXN) == 0) + { + lua_pushnil(lua); + lua_pushfstring(lua, "cannot get short path from: %s", long_path); + return 2; + } + + // return result + tb_char_t* short_path_a = (tb_char_t*)long_path_w; + tb_size_t short_path_n = tb_wtoa(short_path_a, short_path_w, TB_PATH_MAXN); + if (short_path_n == (tb_size_t)-1) + { + lua_pushnil(lua); + lua_pushfstring(lua, "invalid short path from %s!", long_path); + return 2; + } + lua_pushlstring(lua, short_path_a, short_path_n); + return 1; +} |
