The patch was removed in the previous message :(<br>So here it is (for real).<br><br>From 9091c40e22f6fd0ca2173ecbeb1f932502cc8ac6 Mon Sep 17 00:00:00 2001<br>From: "Jader H. Silva" <<a href="mailto:jaderhs5@gmail.com">jaderhs5@gmail.com</a>><br>
Date: Fri, 13 Jul 2012 18:06:32 -0300<br>Subject: [PATCH] Add ngx.re.split function<br><br>---<br>Â src/ngx_http_lua_regex.c |Â 443 ++++++++++++++++++++++++++++++++++++++++++++++<br>Â 1 file changed, 443 insertions(+)<br><br>
diff --git a/src/ngx_http_lua_regex.c b/src/ngx_http_lua_regex.c<br>index 108070c..aa5d445 100644<br>--- a/src/ngx_http_lua_regex.c<br>+++ b/src/ngx_http_lua_regex.c<br>@@ -74,6 +74,7 @@ static int ngx_http_lua_ngx_re_match(lua_State *L);<br>
 static int ngx_http_lua_ngx_re_gmatch(lua_State *L);<br> static int ngx_http_lua_ngx_re_sub(lua_State *L);<br> static int ngx_http_lua_ngx_re_gsub(lua_State *L);<br>+static int ngx_http_lua_ngx_re_split(lua_State *L);<br>
 static void ngx_http_lua_regex_free_study_data(ngx_pool_t *pool,<br>    pcre_extra *sd);<br> static ngx_int_t ngx_lua_regex_compile(ngx_lua_regex_compile_t *rc);<br>@@ -1611,6 +1612,445 @@ error:<br>    return luaL_error(L, msg);<br>
 }<br> <br>+static int<br>+ngx_http_lua_ngx_re_split(lua_State *L)<br>+{<br>+   ngx_http_lua_regex_t       *re;<br>+   ngx_http_request_t         *r;<br>+   ngx_str_t                   subj;<br>+   ngx_str_t                   pat;<br>
+   ngx_str_t                   opts;<br>+   ngx_str_t                   tpl;<br>+   ngx_http_lua_main_conf_t   *lmcf = NULL;<br>+   ngx_pool_t                 *pool, *old_pool;<br>+   ngx_lua_regex_compile_t     re_comp;<br>
+   const char                 *msg;<br>+   ngx_int_t                   rc;<br>+   ngx_uint_t                  n;<br>+   ngx_int_t                   i;<br>+   int                         nargs;<br>+   int                        *cap = NULL;<br>
+   int                         ovecsize;<br>+   int                         type;<br>+   unsigned                    func;<br>+   int                         offset;<br>+   size_t                      count;<br>
+   luaL_Buffer                 luabuf;<br>+   ngx_int_t                   flags;<br>+   ngx_int_t                   limit = -1;<br>+   u_char                     *p;<br>+   u_char                      errstr[NGX_MAX_CONF_ERRSTR + 1];<br>
+   pcre_extra                 *sd = NULL;<br>+<br>+   ngx_http_lua_complex_value_t             *ctpl = NULL;<br>+   ngx_http_lua_compile_complex_value_t      ccv;<br>+<br>+   nargs = lua_gettop(L);<br>+<br>+   if (nargs != 2 && nargs != 3 && nargs != 4) {<br>
+Â Â Â Â Â Â Â return luaL_error(L, "expecting two or three or four arguments, but got %d",<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â nargs);<br>+Â Â Â }<br>+<br>+Â Â Â lua_pushlightuserdata(L, &ngx_http_lua_request_key);<br>+Â Â Â lua_rawget(L, LUA_GLOBALSINDEX);<br>
+Â Â Â r = lua_touserdata(L, -1);<br>+Â Â Â lua_pop(L, 1);<br>+<br>+Â Â Â if (r == NULL) {<br>+Â Â Â Â Â Â Â return luaL_error(L, "no request object found");<br>+Â Â Â }<br>+<br>+Â Â Â subj.data = (u_char *) luaL_checklstring(L, 1, &subj.len);<br>
+Â Â Â pat.data = (u_char *) luaL_checklstring(L, 2, &pat.len);<br>+<br>+Â Â Â if (nargs >= 3) {<br>+Â Â Â Â Â Â Â opts.data = (u_char *) luaL_checklstring(L, 3, &opts.len);<br>+<br>+Â Â Â Â Â Â Â if (nargs == 4) {<br>+Â Â Â Â Â Â Â Â Â Â Â limit = luaL_checkinteger(L, 4);<br>
+Â Â Â Â Â Â Â Â Â Â Â lua_pop(L, 1);<br>+<br>+Â Â Â Â Â Â Â } else {/* nargs == 3 */<br>+Â Â Â Â Â Â Â Â Â Â Â limit = -1;<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â } else { /* nargs == 2 */<br>+Â Â Â Â Â Â Â opts.data = (u_char *) "";<br>+Â Â Â Â Â Â Â opts.len = 0;<br>
+Â Â Â }<br>+<br>+Â Â Â ngx_memzero(&re_comp, sizeof(ngx_lua_regex_compile_t));<br>+<br>+Â Â Â /* stack: subj regex repl */<br>+<br>+Â Â Â re_comp.options = 0;<br>+<br>+Â Â Â flags = ngx_http_lua_ngx_re_parse_opts(L, &re_comp, &opts, 4);<br>
+<br>+Â Â Â if (flags & NGX_LUA_RE_COMPILE_ONCE) {<br>+Â Â Â Â Â Â Â lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);<br>+Â Â Â Â Â Â Â pool = lmcf->pool;<br>+<br>+Â Â Â Â Â Â Â dd("server pool %p", lmcf->pool);<br>
+<br>+Â Â Â Â Â Â Â lua_pushlightuserdata(L, &ngx_http_lua_regex_cache_key);<br>+Â Â Â Â Â Â Â lua_rawget(L, LUA_REGISTRYINDEX); /* table */<br>+<br>+Â Â Â Â Â Â Â lua_pushliteral(L, "s");<br>+Â Â Â Â Â Â Â lua_pushinteger(L, tpl.len);<br>
+Â Â Â Â Â Â Â lua_pushliteral(L, ":");<br>+Â Â Â Â Â Â Â lua_pushvalue(L, 2);<br>+<br>+Â Â Â Â Â Â Â if (tpl.len != 0) {<br>+Â Â Â Â Â Â Â Â Â Â Â lua_pushvalue(L, 3);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â dd("options size: %d", (int) sizeof(re_comp.options));<br>
+<br>+Â Â Â Â Â Â Â lua_pushlstring(L, (char *) &re_comp.options, sizeof(re_comp.options));<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â /* table regex opts */<br>+<br>+Â Â Â Â Â Â Â if (tpl.len == 0) {<br>+Â Â Â Â Â Â Â Â Â Â Â lua_concat(L, 5); /* table key */<br>
+<br>+Â Â Â Â Â Â Â } else {<br>+Â Â Â Â Â Â Â Â Â Â Â lua_concat(L, 6); /* table key */<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â lua_pushvalue(L, -1); /* table key key */<br>+<br>+Â Â Â Â Â Â Â dd("regex cache key: %.*s", (int) (pat.len + sizeof(re_comp.options)),<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â lua_tostring(L, -1));<br>+<br>+Â Â Â Â Â Â Â lua_rawget(L, -3); /* table key re */<br>+Â Â Â Â Â Â Â re = lua_touserdata(L, -1);<br>+<br>+Â Â Â Â Â Â Â lua_pop(L, 1); /* table key */<br>+<br>+Â Â Â Â Â Â Â if (re) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>
+                   "lua regex cache hit for split regex \"%s\" with options "<br>+                   "\"%s\"", pat.data, opts.data);<br>+<br>+           lua_pop(L, 2);<br>+<br>+           dd("restoring regex %p, ncaptures %d, captures %p", re->regex,<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â re->ncaptures, re->captures);<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â re_comp.regex = re->regex;<br>+Â Â Â Â Â Â Â Â Â Â Â sd = re->regex_sd;<br>+Â Â Â Â Â Â Â Â Â Â Â re_comp.captures = re->ncaptures;<br>+Â Â Â Â Â Â Â Â Â Â Â cap = re->captures;<br>
+Â Â Â Â Â Â Â Â Â Â Â ctpl = re->replace;<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â if (flags & NGX_LUA_RE_MODE_DFA) {<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ovecsize = 2;<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â } else {<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ovecsize = (re->ncaptures + 1) * 3;<br>
+Â Â Â Â Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â goto exec;<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "lua regex cache miss for split regex \"%s\" with options "<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "\"%s\"",<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pat.data, opts.data);<br>+<br>+Â Â Â Â Â Â Â if (lmcf->regex_cache_entries >= lmcf->regex_cache_max_entries) {<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â if (lmcf->regex_cache_entries == lmcf->regex_cache_max_entries) {<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ngx_log_error(NGX_LOG_WARN, r->connection->log, 0,<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "lua exceeding regex cache max entries (%i)",<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â lmcf->regex_cache_max_entries);<br>
+<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â lmcf->regex_cache_entries++;<br>+Â Â Â Â Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â pool = r->pool;<br>+Â Â Â Â Â Â Â Â Â Â Â flags &= ~NGX_LUA_RE_COMPILE_ONCE;<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â } else {<br>+Â Â Â Â Â Â Â pool = r->pool;<br>
+Â Â Â }<br>+<br>+Â Â Â re_comp.pattern = pat;<br>+Â Â Â re_comp.err.len = NGX_MAX_CONF_ERRSTR;<br>+Â Â Â re_comp.err.data = errstr;<br>+Â Â Â re_comp.pool = pool;<br>+<br>+Â Â Â dd("compiling regex");<br>+<br>+Â Â Â ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>
+Â Â Â Â Â Â Â Â Â Â Â "lua compiling split regex \"%s\" with options \"%s\" "<br>+Â Â Â Â Â Â Â Â Â Â Â "(compile once: %d) (dfa mode: %d) (jit mode: %d)",<br>+Â Â Â Â Â Â Â Â Â Â Â pat.data, opts.data,<br>+Â Â Â Â Â Â Â Â Â Â Â (flags & NGX_LUA_RE_COMPILE_ONCE) != 0,<br>
+Â Â Â Â Â Â Â Â Â Â Â (flags & NGX_LUA_RE_MODE_DFA) != 0,<br>+Â Â Â Â Â Â Â Â Â Â Â (flags & NGX_LUA_RE_MODE_JIT) != 0);<br>+<br>+Â Â Â old_pool = ngx_http_lua_pcre_malloc_init(pool);<br>+<br>+Â Â Â rc = ngx_lua_regex_compile(&re_comp);<br>
+<br>+Â Â Â ngx_http_lua_pcre_malloc_done(old_pool);<br>+<br>+Â Â Â if (rc != NGX_OK) {<br>+Â Â Â Â Â Â Â dd("compile failed");<br>+<br>+Â Â Â Â Â Â Â re_comp.err.data[re_comp.err.len] = '\0';<br>+Â Â Â Â Â Â Â msg = lua_pushfstring(L, "failed to compile regex \"%s\": %s",<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pat.data, re_comp.err.data);<br>+<br>+Â Â Â Â Â Â Â return luaL_argerror(L, 2, msg);<br>+Â Â Â }<br>+<br>+#if LUA_HAVE_PCRE_JIT<br>+<br>+Â Â Â if (flags & NGX_LUA_RE_MODE_JIT) {<br>+<br>+Â Â Â Â Â Â Â old_pool = ngx_http_lua_pcre_malloc_init(pool);<br>
+<br>+Â Â Â Â Â Â Â sd = pcre_study(re_comp.regex, PCRE_STUDY_JIT_COMPILE, &msg);<br>+<br>+Â Â Â Â Â Â Â ngx_http_lua_pcre_malloc_done(old_pool);<br>+<br>+#Â Â if (NGX_DEBUG)<br>+Â Â Â Â Â Â Â dd("sd = %p", sd);<br>+<br>+Â Â Â Â Â Â Â if (msg != NULL) {<br>
+Â Â Â Â Â Â Â Â Â Â Â ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "pcre study failed with PCRE_STUDY_JIT_COMPILE: %s (%p)",<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â msg, sd);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (sd != NULL) {<br>
+           int        jitted;<br>+<br>+           old_pool = ngx_http_lua_pcre_malloc_init(pool);<br>+<br>+           pcre_fullinfo(re_comp.regex, sd, PCRE_INFO_JIT, &jitted);<br>+<br>+           ngx_http_lua_pcre_malloc_done(old_pool);<br>
+<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "pcre JIT compiling result: %d", jitted);<br>+Â Â Â Â Â Â Â }<br>+#Â Â endif /* NGX_DEBUG */<br>+<br>+Â Â Â } else {<br>
+<br>+Â Â Â Â Â Â Â old_pool = ngx_http_lua_pcre_malloc_init(pool);<br>+<br>+Â Â Â Â Â Â Â sd = pcre_study(re_comp.regex, 0, &msg);<br>+<br>+Â Â Â Â Â Â Â ngx_http_lua_pcre_malloc_done(old_pool);<br>+<br>+#Â Â if (NGX_DEBUG)<br>+Â Â Â Â Â Â Â dd("sd = %p", sd);<br>
+<br>+Â Â Â Â Â Â Â if (msg != NULL) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "pcre_study failed with PCRE_STUDY_JIT_COMPILE: %s (%p)",<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â msg, sd);<br>
+       }<br>+#  endif /* NGX_DEBUG */<br>+   }<br>+<br>+#else /* LUA_HAVE_PCRE_JIT */<br>+<br>+   if (flags & NGX_LUA_RE_MODE_JIT) {<br>+       ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "your pcre build does not have JIT support and "<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "the \"j\" regex option is ignored");<br>+Â Â Â }<br>+<br>+#endif /* LUA_HAVE_PCRE_JIT */<br>+<br>+Â Â Â dd("compile done, captures %d", re_comp.captures);<br>
+<br>+Â Â Â if (flags & NGX_LUA_RE_MODE_DFA) {<br>+Â Â Â Â Â Â Â ovecsize = 2;<br>+<br>+Â Â Â } else {<br>+Â Â Â Â Â Â Â ovecsize = (re_comp.captures + 1) * 3;<br>+Â Â Â }<br>+<br>+Â Â Â cap = ngx_palloc(pool, ovecsize * sizeof(int));<br>
+Â Â Â if (cap == NULL) {<br>+Â Â Â Â Â Â Â flags &= ~NGX_LUA_RE_COMPILE_ONCE;<br>+Â Â Â Â Â Â Â msg = "out of memory";<br>+Â Â Â Â Â Â Â goto error;<br>+Â Â Â }<br>+<br>+Â Â Â if (flags & NGX_LUA_RE_COMPILE_ONCE) {<br>+<br>+Â Â Â Â Â Â Â ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "lua saving compiled sub regex (%d captures) into the cache "<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "(entries %i)", re_comp.captures,<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â lmcf ? lmcf->regex_cache_entries : 0);<br>+<br>
+       re = ngx_palloc(pool, sizeof(ngx_http_lua_regex_t));<br>+       if (re == NULL) {<br>+           return luaL_error(L, "out of memory");<br>+       }<br>+<br>+       dd("saving regex %p, ncaptures %d, captures %p", re_comp.regex,<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â re_comp.captures, cap);<br>+<br>+Â Â Â Â Â Â Â re->regex = re_comp.regex;<br>+Â Â Â Â Â Â Â re->regex_sd = sd;<br>+Â Â Â Â Â Â Â re->ncaptures = re_comp.captures;<br>+Â Â Â Â Â Â Â re->captures = cap;<br>+Â Â Â Â Â Â Â re->replace = ctpl;<br>
+<br>+Â Â Â Â Â Â Â lua_pushlightuserdata(L, re); /* table key value */<br>+Â Â Â Â Â Â Â lua_rawset(L, -3); /* table */<br>+Â Â Â Â Â Â Â lua_pop(L, 1);<br>+<br>+Â Â Â Â Â Â Â if (lmcf) {<br>+Â Â Â Â Â Â Â Â Â Â Â lmcf->regex_cache_entries++;<br>+Â Â Â Â Â Â Â }<br>
+Â Â Â }<br>+<br>+exec:<br>+Â Â Â count = 0;<br>+Â Â Â offset = 0;<br>+<br>+Â Â Â lua_newtable(L);<br>+<br>+Â Â Â for (;;) {<br>+Â Â Â Â Â Â Â if (subj.len == 0 || count == limit) {<br>+Â Â Â Â Â Â Â Â Â Â Â break;<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (flags & NGX_LUA_RE_MODE_DFA) {<br>
+<br>+#if LUA_HAVE_PCRE_DFA<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â int ws[NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT];<br>+Â Â Â Â Â Â Â Â Â Â Â rc = ngx_http_lua_regex_dfa_exec(re_comp.regex, sd, &subj,<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â offset, cap, ovecsize, ws, NGX_LUA_RE_DFA_MODE_WORKSPACE_COUNT);<br>
+<br>+#else /* LUA_HAVE_PCRE_DFA */<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â msg = "at least pcre 6.0 is required for the DFA mode";<br>+Â Â Â Â Â Â Â Â Â Â Â goto error;<br>+<br>+#endif /* LUA_HAVE_PCRE_DFA */<br>+<br>+Â Â Â Â Â Â Â } else {<br>+Â Â Â Â Â Â Â Â Â Â Â rc = ngx_http_lua_regex_exec(re_comp.regex, sd, &subj, offset, cap,<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ovecsize);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (rc == NGX_REGEX_NO_MATCHED) {<br>+Â Â Â Â Â Â Â Â Â Â Â break;<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (rc < 0) {<br>+Â Â Â Â Â Â Â Â Â Â Â msg = lua_pushfstring(L, ngx_regex_exec_n " failed: %d on \"%s\" "<br>
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â "using \"%s\"", (int) rc, subj.data, pat.data);<br>+Â Â Â Â Â Â Â Â Â Â Â goto error;<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (rc == 0) {<br>+Â Â Â Â Â Â Â Â Â Â Â if (flags & NGX_LUA_RE_MODE_DFA) {<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â rc = 1;<br>
+<br>+Â Â Â Â Â Â Â Â Â Â Â } else {<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â msg = "capture size too small";<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â goto error;<br>+Â Â Â Â Â Â Â Â Â Â Â }<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â dd("rc = %d", (int) rc);<br>+<br>+Â Â Â Â Â Â Â count++;<br>
+<br>+Â Â Â Â Â Â Â luaL_buffinit(L, &luabuf);<br>+<br>+Â Â Â Â Â Â Â luaL_addlstring(&luabuf, (char *) &subj.data[offset],<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â cap[0] - offset);<br>+<br>+Â Â Â Â Â Â Â lua_pushnumber(L, count);<br>+Â Â Â Â Â Â Â luaL_pushresult(&luabuf);<br>
+Â Â Â Â Â Â Â lua_settable(L, -3);<br>+<br>+Â Â Â Â Â Â Â offset = cap[1];<br>+<br>+Â Â Â }<br>+<br>+Â Â Â if (count == 0) {<br>+Â Â Â Â Â Â Â dd("no match, just the original subject");<br>+<br>+Â Â Â Â Â Â Â lua_pushnumber(L, count+1);<br>
+Â Â Â Â Â Â Â lua_pushvalue(L, 1);<br>+Â Â Â Â Â Â Â lua_settable(L, -3);<br>+<br>+Â Â Â } else {<br>+Â Â Â Â Â Â Â if (offset != (int) subj.len) {<br>+Â Â Â Â Â Â Â Â Â Â Â dd("adding trailer: %s (len %d)", &subj.data[offset],<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (int) (subj.len - offset));<br>
+<br>+Â Â Â Â Â Â Â Â Â Â Â luaL_buffinit(L, &luabuf);<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â luaL_addlstring(&luabuf, (char *) &subj.data[offset],<br>+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â subj.len - offset);<br>+<br>+Â Â Â Â Â Â Â Â Â Â Â lua_pushnumber(L, count+1);<br>
+Â Â Â Â Â Â Â Â Â Â Â luaL_pushresult(&luabuf);<br>+Â Â Â Â Â Â Â Â Â Â Â lua_settable(L, -3);<br>+<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â dd("the dst string: %s", lua_tostring(L, -1));<br>+Â Â Â }<br>+<br>+Â Â Â if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {<br>
+Â Â Â Â Â Â Â if (sd) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_http_lua_regex_free_study_data(pool, sd);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (re_comp.regex) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_pfree(pool, re_comp.regex);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (ctpl) {<br>
+Â Â Â Â Â Â Â Â Â Â Â ngx_pfree(pool, ctpl);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (cap) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_pfree(pool, cap);<br>+Â Â Â Â Â Â Â }<br>+Â Â Â }<br>+<br>+Â Â Â return 1;<br>+<br>+error:<br>+Â Â Â if (!(flags & NGX_LUA_RE_COMPILE_ONCE)) {<br>
+Â Â Â Â Â Â Â if (sd) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_http_lua_regex_free_study_data(pool, sd);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (re_comp.regex) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_pfree(pool, re_comp.regex);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (ctpl) {<br>
+Â Â Â Â Â Â Â Â Â Â Â ngx_pfree(pool, ctpl);<br>+Â Â Â Â Â Â Â }<br>+<br>+Â Â Â Â Â Â Â if (cap) {<br>+Â Â Â Â Â Â Â Â Â Â Â ngx_pfree(pool, cap);<br>+Â Â Â Â Â Â Â }<br>+Â Â Â }<br>+<br>+Â Â Â return luaL_error(L, msg);<br>+}<br>Â <br>Â void<br>Â ngx_http_lua_inject_regex_api(lua_State *L)<br>
@@ -1631,6 +2071,9 @@ ngx_http_lua_inject_regex_api(lua_State *L)<br>Â Â Â Â lua_pushcfunction(L, ngx_http_lua_ngx_re_gsub);<br>Â Â Â Â lua_setfield(L, -2, "gsub");<br>Â <br>+Â Â Â lua_pushcfunction(L, ngx_http_lua_ngx_re_split);<br>
+Â Â Â lua_setfield(L, -2, "split");<br>+<br>Â Â Â Â lua_setfield(L, -2, "re");<br>Â }<br>Â <br>-- <br>1.7.9.5<br><br><br><div class="gmail_quote">2012/7/13 Jader H. Silva <span dir="ltr"><<a href="mailto:jaderhs5@gmail.com" target="_blank">jaderhs5@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">So, here it is :)<br><br>ngx.re.split(<i>subject, regex, options?</i>, limit?)<br><br>This function is based on ngx_re_sub.<br>
<br>It will split subject on regex matches and return a table of strings. Limit is the max number of splits (0 will return a table containing the subject string).<br>
<br>Let me know if there are bugs, identation issues or anything I need to fix.<span class="HOEnZb"><font color="#888888"><br><br>Jader H. Silva</font></span><div class="HOEnZb"><div class="h5"><br><br><div class="gmail_quote">
2012/7/11 agentzh <span dir="ltr"><<a href="mailto:agentzh@gmail.com" target="_blank">agentzh@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<br>
On Wed, Jul 11, 2012 at 12:54 PM, Jader Henrique da Silva<br>
<<a href="mailto:cad_jsilva@uolinc.com" target="_blank">cad_jsilva@uolinc.com</a>> wrote:<br>
> I was checking HttpLuaModule docs and saw "ngx.re.split" implementation in<br>
> the TODO section.<br>
><br>
> Is it already implemented?<br>
<br>
Nope, otherwise I would update the TODO section accordingly :)<br>
<br>
> Are there any details about this implementation (e.g. parameters, returned<br>
> data)?<br>
><br>
<br>
Not yet. But I think the behavior will be similar to Perl 5's split<br>
builtin function.<br>
<br>
I'm always open to patches for this feature :)<br>
<br>
Best regards,<br>
-agentzh<br>
<br>
_______________________________________________<br>
nginx mailing list<br>
<a href="mailto:nginx@nginx.org" target="_blank">nginx@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx</a><br>
</blockquote></div><br>
</div></div></blockquote></div><br>