|
|
@@ -399,6 +399,13 @@ LUA_FUNCTION_DEF (util, is_utf_spoofed); |
|
|
|
*/ |
|
|
|
LUA_FUNCTION_DEF (util, is_valid_utf8); |
|
|
|
|
|
|
|
/*** |
|
|
|
* @function util.has_obscured_utf(str) |
|
|
|
* Returns true if a string has obscure UTF symbols (zero width spaces, order marks), ignores invalid utf characters |
|
|
|
* @return {boolean} true if a has obscured utf characters |
|
|
|
*/ |
|
|
|
LUA_FUNCTION_DEF (util, has_obscured_utf); |
|
|
|
|
|
|
|
/*** |
|
|
|
* @function util.readline([prompt]) |
|
|
|
* Returns string read from stdin with history and editing support |
|
|
@@ -609,6 +616,7 @@ static const struct luaL_reg utillib_f[] = { |
|
|
|
LUA_INTERFACE_DEF (util, caseless_hash_fast), |
|
|
|
LUA_INTERFACE_DEF (util, is_utf_spoofed), |
|
|
|
LUA_INTERFACE_DEF (util, is_valid_utf8), |
|
|
|
LUA_INTERFACE_DEF (util, has_obscured_utf), |
|
|
|
LUA_INTERFACE_DEF (util, readline), |
|
|
|
LUA_INTERFACE_DEF (util, readpassphrase), |
|
|
|
LUA_INTERFACE_DEF (util, file_exists), |
|
|
@@ -2609,6 +2617,36 @@ lua_util_is_valid_utf8 (lua_State *L) |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
static gint |
|
|
|
lua_util_has_obscured_utf (lua_State *L) |
|
|
|
{ |
|
|
|
LUA_TRACE_POINT; |
|
|
|
const gchar *str; |
|
|
|
gsize len; |
|
|
|
gint32 i = 0; |
|
|
|
UChar32 uc; |
|
|
|
|
|
|
|
str = lua_tolstring (L, 1, &len); |
|
|
|
|
|
|
|
while (i < len) { |
|
|
|
U8_NEXT (str, i, len, uc); |
|
|
|
|
|
|
|
if (uc > 0) { |
|
|
|
if (IS_OBSCURED_CHAR (uc)) { |
|
|
|
lua_pushboolean (L, true); |
|
|
|
lua_pushnumber (L, uc); /* Character */ |
|
|
|
lua_pushnumber (L, i); /* Offset */ |
|
|
|
|
|
|
|
return 3; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
lua_pushboolean (L, false); |
|
|
|
|
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
static gint |
|
|
|
lua_util_readline (lua_State *L) |
|
|
|
{ |