diff options
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/argv.c | 144 |
3 files changed, 148 insertions, 1 deletions
diff --git a/core/src/xmake/machine.c b/core/src/xmake/machine.c index 4dfa028d4..a5ab7968e 100755 --- a/core/src/xmake/machine.c +++ b/core/src/xmake/machine.c @@ -55,6 +55,7 @@ typedef struct __xm_machine_impl_t */ // the os functions +tb_int_t xm_os_argv(lua_State* lua); tb_int_t xm_os_find(lua_State* lua); tb_int_t xm_os_uuid(lua_State* lua); tb_int_t xm_os_isdir(lua_State* lua); @@ -101,7 +102,8 @@ tb_int_t xm_process_close(lua_State* lua); // the os functions static luaL_Reg const g_os_functions[] = { - { "find", xm_os_find } + { "argv", xm_os_argv } +, { "find", xm_os_find } , { "uuid", xm_os_uuid } , { "isdir", xm_os_isdir } , { "rmdir", xm_os_rmdir } diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile index 09d0767e1..6e4b25031 100755 --- a/core/src/xmake/makefile +++ b/core/src/xmake/makefile @@ -14,6 +14,7 @@ xmake_CONFIG = y xmake_C_FILES += \ xmake \ machine \ + os/argv \ os/find \ os/uuid \ os/isdir \ diff --git a/core/src/xmake/os/argv.c b/core/src/xmake/os/argv.c new file mode 100755 index 000000000..233b55d0b --- /dev/null +++ b/core/src/xmake/os/argv.c @@ -0,0 +1,144 @@ +/*!The Make-like Build Utility based on Lua + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 - 2017, TBOOX Open Source Group. + * + * @author ruki + * @file argv.c + * + */ + +/* ////////////////////////////////////////////////////////////////////////////////////// + * trace + */ +#define TB_TRACE_MODULE_NAME "argv" +#define TB_TRACE_MODULE_DEBUG (0) + +/* ////////////////////////////////////////////////////////////////////////////////////// + * includes + */ +#include "prefix.h" + +/* ////////////////////////////////////////////////////////////////////////////////////// + * implementation + */ +tb_int_t xm_os_argv(lua_State* lua) +{ + // check + tb_assert_and_check_return_val(lua, 0); + + // get the argument string + tb_char_t const* args = luaL_checkstring(lua, 1); + tb_check_return_val(args, 0); + + // done + tb_char_t* buffer = tb_null; + do + { + // make buffer + tb_size_t maxn = TB_PATH_MAXN; + buffer = (tb_char_t*)tb_malloc(maxn); + tb_assert_and_check_break(buffer); + + // copy and translate command + tb_char_t ch; + tb_size_t i = 0; + tb_size_t j = 0; + for (i = 0; j <= maxn && (ch = args[i]); i++) + { + // not enough? grow it + if (j == maxn) + { + // grow it + maxn += TB_PATH_MAXN; + buffer = (tb_char_t*)tb_ralloc(buffer, maxn); + tb_assert_and_check_break(buffer); + } + + // translate "\"", "\'", "\\" + tb_char_t next = args[i + 1]; + if (ch == '\\' && (next == '\"' || next == '\'' || next == '\\')) /* skip it */ ; + // copy it + else buffer[j++] = ch; + } + tb_assert_and_check_break(j < maxn); + buffer[j] = '\0'; + + // reset index + i = 1; + + // init table + lua_newtable(lua); + + // parse command to the arguments + tb_bool_t s = 0; + tb_char_t* p = buffer; + tb_char_t* b = tb_null; + while ((ch = *p)) + { + // enter double quote? + if (!s && ch == '\"') s = 2; + // enter single quote? + else if (!s && ch == '\'') s = 1; + // leave quote? + else if ((s == 2 && ch == '\"') || (s == 1 && ch == '\'')) s = 0; + // is argument end with ' '? + else if (!s && tb_isspace(ch)) + { + // fill zero + *p = '\0'; + + // save this argument + if (b) + { + // save argument + lua_pushstring(lua, b); + lua_rawseti(lua, -2, i++); + + // clear it + b = tb_null; + } + } + + // get the argument pointer + if ((s || !tb_isspace(ch)) && !b) b = p; + + // next + p++; + } + + // save this argument + if (b) + { + // save argument + lua_pushstring(lua, b); + lua_rawseti(lua, -2, i++); + + // clear it + b = tb_null; + } + + } while (0); + + // exit buffer + if (buffer) tb_free(buffer); + buffer = tb_null; + + // ok + return 1; +} |
