Added method "fullinfo" to PCRE binding.

This commit is contained in:
Shmuel Zeigerman
2014-10-30 20:10:02 +02:00
parent 150c251be5
commit 1512d3999e
3 changed files with 60 additions and 0 deletions
+15
View File
@@ -565,6 +565,21 @@ userdata obtained from a call to maketables_. The default value, used when the
parameter is not supplied or ``nil``, is the built-in PCRE set of character
tables.
------------------------------------------------------------
fullinfo
--------
[See *pcre_fullinfo* in the PCRE docs.]
:funcdef:`r:fullinfo ()`
This function returns a table containing information about the compiled pattern.
The keys are strings formed in the following way:
``PCRE_INFO_CAPTURECOUNT`` -> ``"CAPTURECOUNT"``. The values are numbers.
------------------------------------------------------------
dfa_exec
--------
+38
View File
@@ -5,6 +5,7 @@
#include <string.h>
#include <locale.h>
#include <ctype.h>
#include <stdint.h>
#include <pcre.h>
#include "lua.h"
@@ -351,6 +352,42 @@ static int Lpcre_version (lua_State *L) {
return 1;
}
#define SET_INFO_FIELD(L,ud,what,name,valtype) { \
valtype val; \
if (0 == pcre_fullinfo (ud->pr, ud->extra, what, &val)) { \
lua_pushnumber (L, val); \
lua_setfield (L, -2, name); \
} \
}
static int Lpcre_fullinfo (lua_State *L) {
TPcre *ud = check_ud (L);
lua_newtable(L);
SET_INFO_FIELD (L, ud, PCRE_INFO_BACKREFMAX, "BACKREFMAX", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_CAPTURECOUNT, "CAPTURECOUNT", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_FIRSTBYTE, "FIRSTBYTE", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_HASCRORLF, "HASCRORLF", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_JCHANGED, "JCHANGED", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_JIT, "JIT", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_JITSIZE, "JITSIZE", size_t);
SET_INFO_FIELD (L, ud, PCRE_INFO_MATCH_EMPTY, "MATCH_EMPTY", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_MATCHLIMIT, "MATCHLIMIT", uint32_t)
SET_INFO_FIELD (L, ud, PCRE_INFO_MAXLOOKBEHIND, "MAXLOOKBEHIND", int) /* int ? */
SET_INFO_FIELD (L, ud, PCRE_INFO_MINLENGTH, "MINLENGTH", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_OKPARTIAL, "OKPARTIAL", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_OPTIONS, "OPTIONS", unsigned long)
SET_INFO_FIELD (L, ud, PCRE_INFO_RECURSIONLIMIT, "RECURSIONLIMIT", uint32_t)
SET_INFO_FIELD (L, ud, PCRE_INFO_SIZE, "SIZE", size_t)
SET_INFO_FIELD (L, ud, PCRE_INFO_STUDYSIZE, "STUDYSIZE", size_t)
SET_INFO_FIELD (L, ud, PCRE_INFO_FIRSTCHARACTERFLAGS, "FIRSTCHARACTERFLAGS", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_FIRSTCHARACTER, "FIRSTCHARACTER", uint32_t)
SET_INFO_FIELD (L, ud, PCRE_INFO_REQUIREDCHARFLAGS, "REQUIREDCHARFLAGS", int)
SET_INFO_FIELD (L, ud, PCRE_INFO_REQUIREDCHAR, "REQUIREDCHAR", uint32_t)
return 1;
}
static const luaL_Reg chartables_meta[] = {
{ "__gc", chartables_gc },
{ "__tostring", chartables_tostring },
@@ -365,6 +402,7 @@ static const luaL_Reg r_methods[] = {
#if PCRE_MAJOR >= 6
{ "dfa_exec", Lpcre_dfa_exec },
#endif
{ "fullinfo", Lpcre_fullinfo },
{ "__gc", Lpcre_gc },
{ "__tostring", Lpcre_tostring },
{ NULL, NULL }
+7
View File
@@ -160,6 +160,12 @@ local function set_m_dfa_exec (lib, flg)
}
end
local function set_m_fullinfo (lib, flg)
local r = lib.new("(foo)(bar)")
local info = r:fullinfo()
assert(info.CAPTURECOUNT == 2)
end
return function (libname)
local lib = require (libname)
local flags = lib.flags ()
@@ -170,6 +176,7 @@ return function (libname)
set_f_split (lib, flags),
set_m_exec (lib, flags),
set_m_tfind (lib, flags),
set_m_fullinfo (lib, flags),
}
if flags.MAJOR >= 4 then
table.insert (sets, set_named_subpatterns (lib, flags))