diff options
| author | ruki <[email protected]> | 2015-05-19 11:42:14 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-05-19 11:42:14 +0800 |
| commit | 050d1882cf578ca81f92666d42bc005b7c0eb914 (patch) | |
| tree | 3da2dadd83c155ab2e07811d703172918e03159f /core/src | |
| parent | f1de3034b9afbb88f83501730bf27c31078818ed (diff) | |
find and match files or directories
Diffstat (limited to 'core/src')
| -rwxr-xr-x | core/src/xmake/machine.c | 4 | ||||
| -rwxr-xr-x | core/src/xmake/makefile | 1 | ||||
| -rwxr-xr-x | core/src/xmake/os/find.c | 131 |
3 files changed, 135 insertions, 1 deletions
diff --git a/core/src/xmake/machine.c b/core/src/xmake/machine.c index 3fc303002..476a6a7eb 100755 --- a/core/src/xmake/machine.c +++ b/core/src/xmake/machine.c @@ -50,6 +50,7 @@ typedef struct __xm_machine_impl_t */ // the os functions +tb_int_t xm_os_find(lua_State* lua); tb_int_t xm_os_isdir(lua_State* lua); tb_int_t xm_os_rmdir(lua_State* lua); tb_int_t xm_os_mkdir(lua_State* lua); @@ -82,7 +83,8 @@ tb_int_t xm_preprocessor_loadx(lua_State* lua); // the os functions static luaL_Reg const g_os_functions[] = { - { "isdir", xm_os_isdir } + { "find", xm_os_find } +, { "isdir", xm_os_isdir } , { "rmdir", xm_os_rmdir } , { "mkdir", xm_os_mkdir } , { "cpdir", xm_os_cpdir } diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile index 8d848e904..dc4c1cee5 100755 --- a/core/src/xmake/makefile +++ b/core/src/xmake/makefile @@ -14,6 +14,7 @@ xmake_CONFIG = y xmake_C_FILES += \ xmake \ machine \ + os/find \ os/isdir \ os/rmdir \ os/mkdir \ diff --git a/core/src/xmake/os/find.c b/core/src/xmake/os/find.c new file mode 100755 index 000000000..c891b9146 --- /dev/null +++ b/core/src/xmake/os/find.c @@ -0,0 +1,131 @@ +/*!The Automatic Cross-platform Build Tool + * + * XMake is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * XMake is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with XMake; + * If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> + * + * Copyright (C) 2009 - 2015, ruki All rights reserved. + * + * @author ruki + * @file find.c + * + */ + +/* ////////////////////////////////////////////////////////////////////////////////////// + * trace + */ +#define TB_TRACE_MODULE_NAME "find" +#define TB_TRACE_MODULE_DEBUG (0) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * includes + */ +#include "prefix.h" + +/* ////////////////////////////////////////////////////////////////////////////////////// + * private implementation + */ +static tb_bool_t xm_os_find_walk(tb_char_t const* path, tb_file_info_t const* info, tb_cpointer_t priv) +{ + // check + tb_value_ref_t tuple = (tb_value_ref_t)priv; + tb_assert_and_check_return_val(path && info && tuple, tb_false); + + // the lua + lua_State* lua = (lua_State*)tuple[0].ptr; + tb_assert_and_check_return_val(lua, tb_false); + + // the pattern + tb_char_t const* pattern = (tb_char_t const*)tuple[1].cstr; + tb_assert_and_check_return_val(pattern, tb_false); + + // find directory? + tb_bool_t findir = tuple[2].b; + + // the count + tb_size_t* pcount = &(tuple[3].ul); + + // trace + tb_trace_d("path[%c]: %s", info->type == TB_FILE_TYPE_DIRECTORY? 'd' : 'f', path); + + // find file or directory? + if ((findir && info->type == TB_FILE_TYPE_DIRECTORY) || (!findir && info->type == TB_FILE_TYPE_FILE)) + { + // done string.match(pattern) + lua_getfield(lua, -1, "match"); + lua_pushstring(lua, path); + lua_pushstring(lua, pattern); + if (lua_pcall(lua, 2, 1, 0)) + { + // trace + tb_printf("error: call string.match(%s, %s) failed: %s!\n", path, pattern, lua_tostring(lua, -1)); + + // failed + return tb_false; + } + + // match ok? save this path + if (lua_isstring(lua, -1) && !tb_strcmp(path, lua_tostring(lua, -1))) + lua_rawseti(lua, -3, ++*pcount); + // pop this return value + else lua_pop(lua, 1); + } + + // continue + return tb_true; +} +/* ////////////////////////////////////////////////////////////////////////////////////// + * implementation + */ +tb_int_t xm_os_find(lua_State* lua) +{ + // check + tb_assert_and_check_return_val(lua, 0); + + // get the root directory + tb_char_t const* rootdir = luaL_checkstring(lua, 1); + tb_check_return_val(rootdir, 0); + + // get the pattern + tb_char_t const* pattern = luaL_checkstring(lua, 2); + tb_check_return_val(pattern, 0); + + // is recurse? + tb_bool_t recurse = lua_toboolean(lua, 3); + + // find directory? + tb_bool_t findir = lua_toboolean(lua, 4); + + // init table + lua_newtable(lua); + + // get string package + lua_getglobal(lua, "string"); + + // done os.find(root, name) + tb_value_t tuple[4]; + tuple[0].ptr = lua; + tuple[1].cstr = pattern; + tuple[2].b = findir; + tuple[3].ul = 0; + tb_directory_walk(rootdir, recurse, tb_true, xm_os_find_walk, tuple); + + // pop string package + lua_pop(lua, 1); + + // return count + lua_pushinteger(lua, tuple[3].ul); + + // ok + return 2; +} |
