/* unlike PCRE, partial matching won't return the actual substrings/matches */ static int Gregex_dfa_exec (lua_State *L) { TArgExec argE; TGrgx *ud; gboolean res; checkarg_dfa_exec (L, &argE, &ud); gerror_free (ud); res = g_regex_match_all_full (ud->pr, argE.text, (int)argE.textlen, argE.startoffset, (GRegexMatchFlags)argE.eflags, &ud->match_info, &ud->error); if (ALG_ISMATCH (res)) { int i, start_pos, end_pos; int max = g_match_info_get_match_count (ud->match_info); g_match_info_fetch_pos (ud->match_info, 0, &start_pos, NULL); lua_pushinteger (L, start_pos + 1); /* 1-st return value */ lua_newtable (L); /* 2-nd return value */ for (i=0; i<max; i++) { g_match_info_fetch_pos (ud->match_info, i, NULL, &end_pos); /* I don't know why these offsets aren't incremented by 1 to match Lua indexing? */ lua_pushinteger (L, end_pos); lua_rawseti (L, -2, i+1); } lua_pushinteger (L, max); /* 3-rd return value */ minfo_free (ud); return 3; } else if (g_match_info_is_partial_match(ud->match_info)) { lua_pushboolean(L,1); minfo_free (ud); return 1; } else { minfo_free (ud); if (ALG_NOMATCH (res)) return lua_pushnil (L), 1; else return generate_error (L, ud, 0); } }
static int generic_atfind (lua_State *L, int tfind) { int res; TArgExec argE; TPosix *ud; regaparams_t argP; regamatch_t res_match; checkarg_atfind (L, &argE, &ud, &argP); if (argE.startoffset > (int)argE.textlen) return lua_pushnil(L), 1; argE.text += argE.startoffset; res_match.nmatch = ALG_NSUB(ud) + 1; res_match.pmatch = ud->match; /* execute the search */ res = tre_reganexec (&ud->r, argE.text, argE.textlen - argE.startoffset, &res_match, argP, argE.eflags); if (ALG_ISMATCH (res)) { ALG_PUSHOFFSETS (L, ud, argE.startoffset, 0); if (tfind) push_substring_table (L, ud, argE.text); else push_offset_table (L, ud, argE.startoffset); /* set values in the dictionary part of the table */ set_int_field (L, "cost", res_match.cost); set_int_field (L, "num_ins", res_match.num_ins); set_int_field (L, "num_del", res_match.num_del); set_int_field (L, "num_subst", res_match.num_subst); return 3; } else if (ALG_NOMATCH (res)) return lua_pushnil (L), 1; else return generate_error (L, ud, res); }