diff options
| author | ruki <[email protected]> | 2015-04-30 15:16:35 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-04-30 15:16:35 +0800 |
| commit | b58ecc2194967e75375116db9ca782cdfe261022 (patch) | |
| tree | 87229347340351578fc44a8aeea69c3cb7812f28 | |
| parent | 84999518105e894be127ceb3237a3d260f23cda9 (diff) | |
add option module
| -rwxr-xr-x | core/src/xmake/machine.c | 26 | ||||
| -rwxr-xr-x | core/src/xmake/makefile | 3 | ||||
| -rw-r--r-- | core/src/xmake/string/prefix.h | 35 | ||||
| -rwxr-xr-x | core/src/xmake/string/startswith.c | 53 | ||||
| -rw-r--r-- | xmake/scripts/_xmake_main.lua | 1 | ||||
| -rw-r--r-- | xmake/scripts/base/main.lua | 26 | ||||
| -rw-r--r-- | xmake/scripts/base/option.lua | 92 |
7 files changed, 229 insertions, 7 deletions
diff --git a/core/src/xmake/machine.c b/core/src/xmake/machine.c index aad8e358b..c4928e10d 100755 --- a/core/src/xmake/machine.c +++ b/core/src/xmake/machine.c @@ -49,6 +49,24 @@ typedef struct __xm_machine_impl_t }xm_machine_impl_t; /* ////////////////////////////////////////////////////////////////////////////////////// + * declaration + */ + +// the string functions +tb_int_t xm_string_startswith(lua_State* lua); + +/* ////////////////////////////////////////////////////////////////////////////////////// + * globals + */ + +// the string functions +static luaL_Reg const g_string_functions[] = +{ + { "startswith", xm_string_startswith } +, { tb_null, tb_null } +}; + +/* ////////////////////////////////////////////////////////////////////////////////////// * private implementation */ static tb_bool_t xm_machine_main_save_arguments(xm_machine_impl_t* impl, tb_int_t argc, tb_char_t** argv) @@ -184,12 +202,12 @@ xm_machine_ref_t xm_machine_init() // open lua libraries luaL_openlibs(impl->lua); - // TODO: bind lua interfaces - // ... + // bind string functions + luaL_register(impl->lua, "string", g_string_functions); // init namespace: xmake lua_newtable(impl->lua); - lua_setglobal(impl->lua, "xmake"); + lua_setglobal(impl->lua, "xmake"); // init verbose impl->verbose = tb_false; @@ -267,7 +285,7 @@ tb_int_t xm_machine_main(xm_machine_ref_t machine, tb_int_t argc, tb_char_t** ar if (impl->verbose) { lua_getglobal(impl->lua, "debug"); - lua_getfield(impl->lua, -1, "traceback"); + lua_getfield(impl->lua, -1, "traceback"); errfunc = -2; } diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile index 394a48950..5c7228962 100755 --- a/core/src/xmake/makefile +++ b/core/src/xmake/makefile @@ -13,7 +13,8 @@ xmake_CONFIG = y # core files xmake_C_FILES += \ xmake \ - machine + machine \ + string/startswith # flags diff --git a/core/src/xmake/string/prefix.h b/core/src/xmake/string/prefix.h new file mode 100644 index 000000000..ef2779f9f --- /dev/null +++ b/core/src/xmake/string/prefix.h @@ -0,0 +1,35 @@ +/*!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 prefix.h + * + */ +#ifndef XM_STRING_PREFIX_H +#define XM_STRING_PREFIX_H + +/* ////////////////////////////////////////////////////////////////////////////////////// + * includes + */ +#include "../prefix.h" +#include "luajit/luajit.h" + + +#endif + + diff --git a/core/src/xmake/string/startswith.c b/core/src/xmake/string/startswith.c new file mode 100755 index 000000000..b7516e129 --- /dev/null +++ b/core/src/xmake/string/startswith.c @@ -0,0 +1,53 @@ +/*!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 startswith.c + * + */ + +/* ////////////////////////////////////////////////////////////////////////////////////// + * trace + */ +#define TB_TRACE_MODULE_NAME "startswith" +#define TB_TRACE_MODULE_DEBUG (0) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * includes + */ +#include "prefix.h" + +/* ////////////////////////////////////////////////////////////////////////////////////// + * implementation + */ +tb_int_t xm_string_startswith(lua_State* lua) +{ + // check + tb_assert_and_check_return_val(lua, 0); + + // get the string and prefix + tb_char_t const* string = luaL_optstring(lua, 1, tb_null); + tb_char_t const* prefix = luaL_optstring(lua, 2, tb_null); + tb_check_return_val(string && prefix, 0); + + // done string:startswith(prefix) + lua_pushboolean(lua, !tb_strncmp(string, prefix, tb_strlen(prefix))); + + // ok + return 1; +} diff --git a/xmake/scripts/_xmake_main.lua b/xmake/scripts/_xmake_main.lua index 870f36276..db7981609 100644 --- a/xmake/scripts/_xmake_main.lua +++ b/xmake/scripts/_xmake_main.lua @@ -27,6 +27,7 @@ xmake._VERBOSE = _VERBOSE xmake._PROGRAM_DIR = _PROGRAM_DIR xmake._PROJECT_DIR = _PROJECT_DIR xmake._SCRIPTS_DIR = _PROGRAM_DIR .. "/scripts/" +xmake._OPTIONS = {} -- init package path package.path = xmake._SCRIPTS_DIR .. "?.lua;" .. package.path diff --git a/xmake/scripts/base/main.lua b/xmake/scripts/base/main.lua index a049bee11..2b029fc88 100644 --- a/xmake/scripts/base/main.lua +++ b/xmake/scripts/base/main.lua @@ -24,11 +24,33 @@ local main = {} -- load modules -local utils = require("base/utils") +local utils = require("base/utils") +local option = require("base/option") + +-- init the option menu +option._MENU = +{ + {'p', "project", "Change to the given prject directory before doing anything." } +, {'f', "file", "Read FILE as a xmake.lua file." } +, {'d', "debug", "Print lots of debugging information." } +, {'v', "version", "Print the version number and exit." } +, {'h', "help", "Print this help message and exit." } +} -- the main function function main.done() - utils.trace("hello world!") + + -- done option first + if not option.done(xmake._ARGV) then + + -- print the help option + option.help() + + -- failed + return -1 + end + + -- ok return 0 end diff --git a/xmake/scripts/base/option.lua b/xmake/scripts/base/option.lua new file mode 100644 index 000000000..a4d7ce1bf --- /dev/null +++ b/xmake/scripts/base/option.lua @@ -0,0 +1,92 @@ +--!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 option.lua +-- + +-- define module: option +local option = {} + +-- init _OPTIONS.metatable to always use lowercase keys +local _OPTIONS_metatable = +{ + __index = function(table, key) + -- make lowercase key + if type(key) == "string" then + key = key:lower() + end + return rawget(table, key) + end +, __newindex = function(table, key, value) + -- make lowercase key + if type(key) == "string" then + key = key:lower() + end + rawset(table, key, value) + end +} +xmake._OPTIONS = xmake._OPTIONS or {} +setmetatable(xmake._OPTIONS, _OPTIONS_metatable) + +-- done the option +function option.done(argv) + + -- check + assert(option._MENU) + + -- parse _ARGV to _OPTIONS + for i, arg in ipairs(argv) do + + -- parse key and value + local key, value + local i = arg:find("=", 1, true) + + -- key=value? + if i then + key = arg:sub(1, i - 1) + value = arg:sub(i + 1) + -- only key? + else + key = arg + value = "" + end + + -- -k? + if key:startswith("-") then + xmake._OPTIONS[key:sub(2)] = value + -- --key=value? + elseif key:startswith("--") then + xmake. _OPTIONS[key:sub(3)] = value + end + end + + -- ok + return true +end + +-- print the help option +function option.help() + + -- check + assert(option._MENU) + +end + +-- return module: option +return option |
