mirror of
https://github.com/vxcontrol/lualibs-lrexlib.git
synced 2026-07-01 09:25:08 -04:00
Added method "fullinfo" to PCRE binding.
This commit is contained in:
@@ -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
|
||||
--------
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user