/* 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 Lpcre_dfa_exec (lua_State *L) { TArgExec argE; TPcre *ud; int res; int *buf, *ovector, *wspace; checkarg_dfa_exec (L, &argE, &ud); buf = (int*) Lmalloc (L, (argE.ovecsize + argE.wscount) * sizeof(int)); ovector = buf; wspace = buf + argE.ovecsize; res = pcre_dfa_exec (ud->pr, ud->extra, argE.text, (int)argE.textlen, argE.startoffset, argE.eflags, ovector, argE.ovecsize, wspace, argE.wscount); if (ALG_ISMATCH (res) || res == PCRE_ERROR_PARTIAL) { int i; int max = (res>0) ? res : (res==0) ? (int)argE.ovecsize/2 : 1; lua_pushinteger (L, ovector[0] + 1); /* 1-st return value */ lua_newtable (L); /* 2-nd return value */ for (i=0; i<max; i++) { lua_pushinteger (L, ovector[i+i+1]); lua_rawseti (L, -2, i+1); } lua_pushinteger (L, res); /* 3-rd return value */ free (buf); return 3; } else { free (buf); if (res == ALG_NOMATCH) return lua_pushnil (L), 1; else return generate_error (L, ud, res); } }