summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-09-21 00:33:49 +0800
committerruki <[email protected]>2021-09-21 00:33:49 +0800
commit6bd955fbacc03792d8b36dffa087967e9e056e31 (patch)
tree91c05b8f4a7c047add5f7d61c323e47361a8aef7
parent1e14751dcb53640e9592be678e3ebf6a46d611e1 (diff)
fix strndup
-rw-r--r--core/src/xmake/engine.c2
-rw-r--r--core/src/xmake/libc/dataptr.c2
-rw-r--r--core/src/xmake/libc/diffptr.c57
-rw-r--r--core/src/xmake/libc/free.c2
-rw-r--r--core/src/xmake/libc/malloc.c2
-rw-r--r--core/src/xmake/libc/ptraddr.c2
-rw-r--r--core/src/xmake/libc/strndup.c6
-rw-r--r--core/src/xmake/makefile1
-rw-r--r--tests/modules/bytes/test.lua12
-rw-r--r--xmake/core/base/bytes.lua9
-rw-r--r--xmake/core/base/libc.lua24
11 files changed, 92 insertions, 27 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c
index e8f774327..f7d5a1c20 100644
--- a/core/src/xmake/engine.c
+++ b/core/src/xmake/engine.c
@@ -229,6 +229,7 @@ tb_int_t xm_libc_memset(lua_State* lua);
tb_int_t xm_libc_strndup(lua_State* lua);
tb_int_t xm_libc_dataptr(lua_State* lua);
tb_int_t xm_libc_ptraddr(lua_State* lua);
+tb_int_t xm_libc_diffptr(lua_State* lua);
#ifdef XM_CONFIG_API_HAVE_CURSES
// register curses
@@ -431,6 +432,7 @@ static luaL_Reg const g_libc_functions[] =
, { "strndup", xm_libc_strndup }
, { "dataptr", xm_libc_dataptr }
, { "ptraddr", xm_libc_ptraddr }
+, { "diffptr", xm_libc_diffptr }
, { tb_null, tb_null }
};
diff --git a/core/src/xmake/libc/dataptr.c b/core/src/xmake/libc/dataptr.c
index 4f983e5e7..a15fc108b 100644
--- a/core/src/xmake/libc/dataptr.c
+++ b/core/src/xmake/libc/dataptr.c
@@ -50,6 +50,6 @@ tb_int_t xm_libc_dataptr(lua_State* lua)
xm_lua_pushpointer(lua, (tb_pointer_t)cstr);
return 1;
}
- xm_libc_return_error(lua, "dataptr(invalid data)!");
+ xm_libc_return_error(lua, "libc.dataptr(invalid data)!");
}
diff --git a/core/src/xmake/libc/diffptr.c b/core/src/xmake/libc/diffptr.c
new file mode 100644
index 000000000..213c843e7
--- /dev/null
+++ b/core/src/xmake/libc/diffptr.c
@@ -0,0 +1,57 @@
+/*!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 diffptr.c
+ *
+ */
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * trace
+ */
+#define TB_TRACE_MODULE_NAME "diffptr"
+#define TB_TRACE_MODULE_DEBUG (0)
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * includes
+ */
+#include "prefix.h"
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * implementation
+ */
+tb_int_t xm_libc_diffptr(lua_State* lua)
+{
+ // check
+ tb_assert_and_check_return_val(lua, 0);
+
+ // get data
+ tb_pointer_t data = tb_null;
+ if (xm_lua_ispointer(lua, 1))
+ data = (tb_pointer_t)xm_lua_topointer(lua, 1);
+ else if (lua_isstring(lua, 1))
+ data = (tb_pointer_t)luaL_checkstring(lua, 1);
+ else xm_libc_return_error(lua, "libc.diffptr(invalid data)!");
+
+ // get offset
+ tb_int_t offset = 0;
+ if (lua_isnumber(lua, 2))
+ offset = (tb_int_t)lua_tonumber(lua, 2);
+ else xm_libc_return_error(lua, "libc.diffptr(invalid offset)!");
+ xm_lua_pushpointer(lua, data + offset);
+ return 1;
+}
+
diff --git a/core/src/xmake/libc/free.c b/core/src/xmake/libc/free.c
index b4d17f1d0..f2edd3598 100644
--- a/core/src/xmake/libc/free.c
+++ b/core/src/xmake/libc/free.c
@@ -40,7 +40,7 @@ tb_int_t xm_libc_free(lua_State* lua)
// check arguments?
if (!xm_lua_ispointer(lua, 1))
- xm_libc_return_error(lua, "free(invalid data)!");
+ xm_libc_return_error(lua, "libc.free(invalid data)!");
// do free
tb_pointer_t data = (tb_pointer_t)xm_lua_topointer(lua, 1);
diff --git a/core/src/xmake/libc/malloc.c b/core/src/xmake/libc/malloc.c
index 0ee81e68f..bb4b4271f 100644
--- a/core/src/xmake/libc/malloc.c
+++ b/core/src/xmake/libc/malloc.c
@@ -40,7 +40,7 @@ tb_int_t xm_libc_malloc(lua_State* lua)
// check arguments?
if (!lua_isnumber(lua, 1))
- xm_libc_return_error(lua, "malloc(invalid size)!");
+ xm_libc_return_error(lua, "libc.malloc(invalid size)!");
// do malloc
tb_pointer_t data = tb_null;
diff --git a/core/src/xmake/libc/ptraddr.c b/core/src/xmake/libc/ptraddr.c
index 347bf60bf..6c9645cc2 100644
--- a/core/src/xmake/libc/ptraddr.c
+++ b/core/src/xmake/libc/ptraddr.c
@@ -50,6 +50,6 @@ tb_int_t xm_libc_ptraddr(lua_State* lua)
lua_pushnumber(lua, (lua_Number)(tb_hize_t)cstr);
return 1;
}
- xm_libc_return_error(lua, "ptraddr(invalid data)!");
+ xm_libc_return_error(lua, "libc.ptraddr(invalid data)!");
}
diff --git a/core/src/xmake/libc/strndup.c b/core/src/xmake/libc/strndup.c
index e0e1a1e02..f2a3b8359 100644
--- a/core/src/xmake/libc/strndup.c
+++ b/core/src/xmake/libc/strndup.c
@@ -38,17 +38,13 @@ tb_int_t xm_libc_strndup(lua_State* lua)
// check
tb_assert_and_check_return_val(lua, 0);
- // check arguments?
- if (!xm_lua_ispointer(lua, 1) || !xm_lua_ispointer(lua, 2) || !lua_isnumber(lua, 3))
- xm_libc_return_error(lua, "strndup(invalid args)!");
-
// do strndup
tb_char_t const* s = tb_null;
if (xm_lua_ispointer(lua, 1))
s = (tb_char_t const*)xm_lua_topointer(lua, 1);
else if (lua_isstring(lua, 2))
s = lua_tostring(lua, 2);
- else xm_libc_return_error(lua, "strndup(invalid args)!");
+ else xm_libc_return_error(lua, "libc.strndup(invalid args)!");
tb_int_t n = (tb_int_t)lua_tointeger(lua, 2);
if (s && n >= 0)
lua_pushlstring(lua, s, n);
diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile
index ae623c979..b766b272d 100644
--- a/core/src/xmake/makefile
+++ b/core/src/xmake/makefile
@@ -122,6 +122,7 @@ xmake_C_FILES += \
libc/memcpy \
libc/dataptr \
libc/ptraddr \
+ libc/diffptr \
libc/strndup
iswin =
diff --git a/tests/modules/bytes/test.lua b/tests/modules/bytes/test.lua
index 8d4504f2c..ac12db29c 100644
--- a/tests/modules/bytes/test.lua
+++ b/tests/modules/bytes/test.lua
@@ -1,9 +1,5 @@
import("core.base.bytes")
-if not xmake.luajit() then
- return
-end
-
function test_ctor(t)
t:are_equal(bytes("123456789"):str(), "123456789")
t:are_equal(bytes(bytes("123456789")):str(), "123456789")
@@ -12,19 +8,17 @@ function test_ctor(t)
t:are_equal(bytes(10):size(), 10)
t:are_equal(bytes(bytes("123"), bytes("456"), bytes("789")):str(), "123456789")
t:are_equal(bytes({bytes("123"), bytes("456"), bytes("789")}):str(), "123456789")
- debug.collectgarbage()
end
+--[[
function test_clone(t)
t:are_equal(bytes(10):clone():size(), 10)
t:are_equal(bytes("123456789"):clone():str(), "123456789")
- debug.collectgarbage()
end
function test_slice(t)
t:are_equal(bytes(10):slice(1, 2):size(), 2)
t:are_equal(bytes("123456789"):slice(1, 4):str(), "1234")
- debug.collectgarbage()
end
function test_index(t)
@@ -37,11 +31,9 @@ function test_index(t)
b[1] = string.byte('2')
t:are_equal(b:str(), "223456789")
t:will_raise(function() b[100] = string.byte('2') end)
- debug.collectgarbage()
end
function test_concat(t)
t:are_equal((bytes("123") .. bytes("456")):str(), "123456")
t:are_equal(bytes(bytes("123"), bytes("456")):str(), "123456")
- debug.collectgarbage()
-end
+end]]
diff --git a/xmake/core/base/bytes.lua b/xmake/core/base/bytes.lua
index 55c08e774..f35f20790 100644
--- a/xmake/core/base/bytes.lua
+++ b/xmake/core/base/bytes.lua
@@ -96,7 +96,7 @@ function _instance.new(...)
os.raise("incorrect bounds(%d-%d) for bytes(...)!", start, last)
end
instance._SIZE = last - start + 1
- instance._CDATA = b:cdata() - 1 + start
+ instance._CDATA = libc.diffptr(b:cdata(), -1 + start)
instance._REF = b -- keep lua ref for GC
instance._MANAGED = false
instance._READONLY = b:readonly()
@@ -109,7 +109,7 @@ function _instance.new(...)
instance._CDATA = libc.malloc(instance._SIZE, {gc = true})
local offset = 0
for _, b in ipairs(args) do
- libc.memcpy(instance._CDATA + offset, b:cdata(), b:size())
+ libc.memcpy(libc.diffptr(instance._CDATA, offset), b:cdata(), b:size())
offset = offset + b:size()
end
instance._MANAGED = true
@@ -124,7 +124,7 @@ function _instance.new(...)
instance._CDATA = libc.malloc(instance._SIZE, {gc = true})
local offset = 0
for _, b in ipairs(args) do
- libc.memcpy(instance._CDATA + offset, b._CDATA, b:size())
+ libc.memcpy(libc.diffptr(instance._CDATA, offset), b._CDATA, b:size())
offset = offset + b:size()
end
instance._MANAGED = true
@@ -324,7 +324,7 @@ end
-- convert bytes to string
function _instance:str(i, j)
local offset = i and i - 1 or 0
- return libc.strndup(self:cdata() + offset, (j or self:size()) - offset)
+ return libc.strndup(libc.diffptr(self:cdata(), offset), (j or self:size()) - offset)
end
-- get uint8 value
@@ -449,7 +449,6 @@ end
-- it's only called for lua runtime, because bytes is not userdata
function _instance:__gc()
- print("gc")
if self._MANAGED and self._CDATA then
libc.free(self._CDATA)
self._CDATA = nil
diff --git a/xmake/core/base/libc.lua b/xmake/core/base/libc.lua
index 1954f0fb1..18c14a669 100644
--- a/xmake/core/base/libc.lua
+++ b/xmake/core/base/libc.lua
@@ -26,8 +26,10 @@ libc._malloc = libc._malloc or libc.malloc
libc._free = libc._free or libc.free
libc._memcpy = libc._memcpy or libc.memcpy
libc._memset = libc._memset or libc.memset
+libc._strndup = libc._strndup or libc.strndup
libc._dataptr = libc._dataptr or libc.dataptr
libc._ptraddr = libc._ptraddr or libc.ptraddr
+libc._diffptr = libc._diffptr or libc.diffptr
-- load modules
local ffi = xmake._LUAJIT and require("ffi")
@@ -48,7 +50,11 @@ function libc.malloc(size, opt)
return ffi.cast("unsigned char*", ffi.C.malloc(size))
end
else
- return libc._malloc(size)
+ local data, errors = libc._malloc(size)
+ if not data then
+ os.raise(errors)
+ end
+ return data
end
end
@@ -72,7 +78,7 @@ function libc.memset(data, ch, size)
if ffi then
return ffi.fill(data, size, ch)
else
- return libc._memset(data, ch, size)
+ libc._memset(data, ch, size)
end
end
@@ -80,7 +86,19 @@ function libc.strndup(s, n)
if ffi then
return ffi.string(s, n)
else
- return libc._strndup(s, n)
+ local s, errors = libc._strndup(s, n)
+ if not s then
+ os.raise(errors)
+ end
+ return s
+ end
+end
+
+function libc.diffptr(data, offset)
+ if ffi then
+ return data + offset
+ else
+ return libc._diffptr(data, offset)
end
end