From 5201773a3bf7b24c03b6f8ac3bb3d01675777465 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Sat, 27 Dec 2014 20:03:39 -0800 Subject: [PATCH] Slightly optimize returning strings to lua from ffi functions --- libaegisub/include/libaegisub/lua/ffi.h | 9 +++++++++ libaegisub/lua/modules/lfs.cpp | 7 ++++--- libaegisub/lua/modules/re.cpp | 2 +- libaegisub/lua/modules/unicode.cpp | 2 +- src/auto4_lua.cpp | 2 +- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libaegisub/include/libaegisub/lua/ffi.h b/libaegisub/include/libaegisub/lua/ffi.h index 0dc09f563..0dbf166cb 100644 --- a/libaegisub/include/libaegisub/lua/ffi.h +++ b/libaegisub/include/libaegisub/lua/ffi.h @@ -16,6 +16,7 @@ #include +#include #include namespace agi { namespace lua { @@ -59,4 +60,12 @@ void register_lib_table(lua_State *L, std::initializer_list types, // Leaves lib table on the stack } +template +char *strndup(T const& str) { + char *ret = static_cast(malloc(str.size() + 1)); + memcpy(ret, str.data(), str.size()); + ret[str.size()] = 0; + return ret; +} + } } diff --git a/libaegisub/lua/modules/lfs.cpp b/libaegisub/lua/modules/lfs.cpp index 2f6d377b1..fc95f7807 100644 --- a/libaegisub/lua/modules/lfs.cpp +++ b/libaegisub/lua/modules/lfs.cpp @@ -21,6 +21,7 @@ #include using namespace agi::fs; +using namespace agi::lua; namespace bfs = boost::filesystem; namespace agi { @@ -38,7 +39,7 @@ auto wrap(char **err, Func f) -> decltype(f()) { return 0; } catch (agi::Exception const& e) { - *err = strdup(e.GetMessage().c_str()); + *err = strndup(e.GetMessage()); return 0; } } @@ -57,7 +58,7 @@ bool lfs_chdir(const char *dir, char **err) { char *currentdir(char **err) { return wrap(err, []{ - return strdup(bfs::current_path().string().c_str()); + return strndup(bfs::current_path().string()); }); } @@ -76,7 +77,7 @@ bool touch(const char *path, char **err) { char *dir_next(DirectoryIterator &it, char **err) { if (it == end(it)) return nullptr; return wrap(err, [&]{ - auto str = strdup((*it).c_str()); + auto str = strndup(*it); ++it; return str; }); diff --git a/libaegisub/lua/modules/re.cpp b/libaegisub/lua/modules/re.cpp index 03283e6aa..66efe0f89 100644 --- a/libaegisub/lua/modules/re.cpp +++ b/libaegisub/lua/modules/re.cpp @@ -92,7 +92,7 @@ char *regex_replace(u32regex& re, const char *replacement, const char *str, size } ret += suffix; - return strdup(ret.c_str()); + return agi::lua::strndup(ret); } u32regex *regex_compile(const char *pattern, int flags, char **err) { diff --git a/libaegisub/lua/modules/unicode.cpp b/libaegisub/lua/modules/unicode.cpp index 0141c8d89..d9a6c2248 100644 --- a/libaegisub/lua/modules/unicode.cpp +++ b/libaegisub/lua/modules/unicode.cpp @@ -22,7 +22,7 @@ namespace { template char *wrap(const char *str, char **err) { try { - return strdup(func(str, std::locale()).c_str()); + return agi::lua::strndup(func(str, std::locale())); } catch (std::exception const& e) { *err = strdup(e.what()); return nullptr; diff --git a/src/auto4_lua.cpp b/src/auto4_lua.cpp index e2816d4d1..4093c6516 100644 --- a/src/auto4_lua.cpp +++ b/src/auto4_lua.cpp @@ -124,7 +124,7 @@ namespace { std::string data = GetClipboard(); if (data.empty()) return nullptr; - return strdup(data.c_str()); + return strndup(data); } bool clipboard_set(const char *str)