MINOR: lua: Add tokenize function.
For tokenizing a string, standard Lua recommends to use regexes. The followinf example splits words: for i in string.gmatch(example, "%S+") do print(i) end This is a little bit overkill for simply split words. This patch adds a tokenize function which quick and do not use regexes.
This commit is contained in:
parent
7f3aa8b62f
commit
8a1027aa45
@ -645,6 +645,40 @@ Core class
|
|||||||
Match two networks. For example "127.0.0.1/32" matchs "127.0.0.0/8". The order
|
Match two networks. For example "127.0.0.1/32" matchs "127.0.0.0/8". The order
|
||||||
of network is not important.
|
of network is not important.
|
||||||
|
|
||||||
|
.. js:function:: core.tokenize(str, separators [, noblank])
|
||||||
|
|
||||||
|
**context**: body, init, task, action, sample-fetch, converter
|
||||||
|
|
||||||
|
This function is useful for tokenizing an entry, or splitting some messages.
|
||||||
|
:param string str: The string which will be split.
|
||||||
|
:param string separators: A string containing a list of separators.
|
||||||
|
:param boolean noblank: Ignore empty entries.
|
||||||
|
:returns: an array of string.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
.. code-block:: lua
|
||||||
|
|
||||||
|
local array = core.tokenize("This function is useful, for tokenizing an entry.", "., ", true)
|
||||||
|
print_r(array)
|
||||||
|
..
|
||||||
|
|
||||||
|
Returns this array:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
(table) table: 0x21c01e0 [
|
||||||
|
1: (string) "This"
|
||||||
|
2: (string) "function"
|
||||||
|
3: (string) "is"
|
||||||
|
4: (string) "useful"
|
||||||
|
5: (string) "for"
|
||||||
|
6: (string) "tokenizing"
|
||||||
|
7: (string) "an"
|
||||||
|
8: (string) "entry"
|
||||||
|
]
|
||||||
|
..
|
||||||
|
|
||||||
.. _proxy_class:
|
.. _proxy_class:
|
||||||
|
|
||||||
Proxy class
|
Proxy class
|
||||||
|
@ -915,6 +915,53 @@ int hlua_fcn_post_init(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This Lua function take a string, a list of separators.
|
||||||
|
* It tokenize the input string using the list of separators
|
||||||
|
* as separator.
|
||||||
|
*
|
||||||
|
* The functionreturns a tablle filled with tokens.
|
||||||
|
*/
|
||||||
|
int hlua_tokenize(lua_State *L)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
const char *sep;
|
||||||
|
int index;
|
||||||
|
const char *token;
|
||||||
|
const char *p;
|
||||||
|
const char *c;
|
||||||
|
int ignore_empty;
|
||||||
|
|
||||||
|
ignore_empty = 0;
|
||||||
|
|
||||||
|
str = luaL_checkstring(L, 1);
|
||||||
|
sep = luaL_checkstring(L, 2);
|
||||||
|
if (lua_gettop(L) == 3)
|
||||||
|
ignore_empty = hlua_checkboolean(L, 3);
|
||||||
|
|
||||||
|
lua_newtable(L);
|
||||||
|
index = 1;
|
||||||
|
token = str;
|
||||||
|
p = str;
|
||||||
|
while(1) {
|
||||||
|
for (c = sep; *c != '\0'; c++)
|
||||||
|
if (*p == *c)
|
||||||
|
break;
|
||||||
|
if (*p == *c) {
|
||||||
|
if ((!ignore_empty) || (p - token > 0)) {
|
||||||
|
lua_pushlstring(L, token, p - token);
|
||||||
|
lua_rawseti(L, -2, index);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
token = p + 1;
|
||||||
|
}
|
||||||
|
if (*p == '\0')
|
||||||
|
break;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int hlua_parse_addr(lua_State *L)
|
int hlua_parse_addr(lua_State *L)
|
||||||
{
|
{
|
||||||
struct hlua_addr *addr;
|
struct hlua_addr *addr;
|
||||||
@ -1000,6 +1047,7 @@ int hlua_fcn_reg_core_fcn(lua_State *L)
|
|||||||
hlua_class_function(L, "get_info", hlua_get_info);
|
hlua_class_function(L, "get_info", hlua_get_info);
|
||||||
hlua_class_function(L, "parse_addr", hlua_parse_addr);
|
hlua_class_function(L, "parse_addr", hlua_parse_addr);
|
||||||
hlua_class_function(L, "match_addr", hlua_match_addr);
|
hlua_class_function(L, "match_addr", hlua_match_addr);
|
||||||
|
hlua_class_function(L, "tokenize", hlua_tokenize);
|
||||||
|
|
||||||
/* Create listener object. */
|
/* Create listener object. */
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user