From fbb893c6b1b1c17f0ad2d755e2a5f128ecbc17ce Mon Sep 17 00:00:00 2001 From: Guldoman Date: Thu, 3 Mar 2022 22:09:48 +0100 Subject: [PATCH] Fix `^` regex matching when using an offset Before, if `offset > 1` was used, the match would have failed because the beginning of the string was never met. Now we force the beginning of the string to be the one specified by the offset. --- src/api/regex.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/api/regex.c b/src/api/regex.c index 08f0f142..6a0aac7a 100644 --- a/src/api/regex.c +++ b/src/api/regex.c @@ -60,12 +60,14 @@ static int f_pcre_match(lua_State *L) { const char* str = luaL_checklstring(L, 2, &len); if (lua_gettop(L) > 2) offset = luaL_checknumber(L, 3); + offset -= 1; + len -= offset; if (lua_gettop(L) > 3) opts = luaL_checknumber(L, 4); lua_rawgeti(L, 1, 1); pcre2_code* re = (pcre2_code*)lua_touserdata(L, -1); pcre2_match_data* md = pcre2_match_data_create_from_pattern(re, NULL); - int rc = pcre2_match(re, (PCRE2_SPTR)str, len, offset - 1, opts, md, NULL); + int rc = pcre2_match(re, (PCRE2_SPTR)&str[offset], len, 0, opts, md, NULL); if (rc < 0) { pcre2_match_data_free(md); if (rc != PCRE2_ERROR_NOMATCH) { @@ -86,7 +88,7 @@ static int f_pcre_match(lua_State *L) { return 0; } for (int i = 0; i < rc*2; i++) - lua_pushnumber(L, ovector[i]+1); + lua_pushnumber(L, ovector[i]+offset+1); pcre2_match_data_free(md); return rc*2; }