summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorruki <[email protected]>2017-02-08 10:30:48 +0800
committerruki <[email protected]>2017-02-08 10:30:48 +0800
commit0dd09d0248bb07ca897d666ff13feaae19a3d93e (patch)
tree96cb83fb812b0e995a34cbf0ed562e8f3c5b471a /core
parent495724f2c5c22501520de05715f6ef18f2bd484d (diff)
add os.argv
Diffstat (limited to 'core')
-rwxr-xr-xcore/src/xmake/machine.c4
-rwxr-xr-xcore/src/xmake/makefile1
-rwxr-xr-xcore/src/xmake/os/argv.c144
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;
+}