wireshark/test/lua/pcre_sets2.lua
Hadriel Kaplan ea46cdc474 Add GLib's regex library into Lua
While Lua's built-in pattern support is ok for simple things, many people end
up wanting a real regex engine. Since Wireshark already includes the GLib
Regex library (a wrapper for PCRE), it makes sense to expose that library to
Lua scripts. This has been done using Lrexlib, one of the most popular regex
bindings for Lua. Lrexlib didn't support binding GLib's Regex in particular -
it does for PCRE but GLib is a different API - so I've done that. A fairly
thorough testsuite came along with that, which has been incorporated into the
wireshark wslua testuites as well in this commit.

Change-Id: I05811d1edf7af8d7c9f4f081de6850f31c0717c7
Reviewed-on: https://code.wireshark.org/review/332
Reviewed-by: Anders Broman <a.broman58@gmail.com>
2014-03-10 07:11:12 +00:00

199 lines
6.1 KiB
Lua
Executable file

-- See Copyright Notice in the file LICENSE
local pat2pcre = require "pat2pcre"
local function get_gsub (lib)
return lib.gsub or
function (subj, pattern, repl, n)
return lib.new (pattern) : gsub (subj, repl, n)
end
end
local function set_f_gsub1 (lib, flg)
local subj, pat = "abcdef", "[abef]+"
return {
Name = "Function gsub, set1",
Func = get_gsub (lib),
--{ s, p, f, n, res1, res2, res3 },
{ {"a\0c", ".", "#" }, {"###", 3, 3} }, -- subj contains nuls
}
end
local function set_f_gsub4 (lib, flg)
local pCSV = "(^[^,]*)|,([^,]*)"
local fCSV = function (a,b) return "["..(a or b).."]" end
local set = {
Name = "Function gsub, set4",
Func = get_gsub (lib),
--{ s, p, f, n, res1, res2, res3 },
{ {"/* */ */", "%/%*(.*)%*%/", "#" }, {"#", 1, 1} },
{ {"a2c3", ".-", "#" }, {"#########", 9, 9} }, -- test .-
{ {"/**/", "%/%*(.-)%*%/", "#" }, {"#", 1, 1} },
{ {"/* */ */", "%/%*(.-)%*%/", "#" }, {"# */", 1, 1} },
{ {"a2c3", "%d", "#" }, {"a#c#", 2, 2} }, -- test %d
{ {"a2c3", "%D", "#" }, {"#2#3", 2, 2} }, -- test %D
{ {"a \t\nb", "%s", "#" }, {"a###b", 3, 3} }, -- test %s
{ {"a \t\nb", "%S", "#" }, {"# \t\n#", 2, 2} }, -- test %S
{ {"abcd", "\\b", "%1"}, {"abcd", 2, 2} },
{ {"", pCSV,fCSV}, {"[]", 1, 1} },
{ {"123", pCSV,fCSV}, {"[123]", 1, 1} },
{ {",", pCSV,fCSV}, {"[][]", 2, 2} },
{ {"123,,456", pCSV,fCSV}, {"[123][][456]", 3, 3}},
{ {",,123,456,,abc,789,", pCSV,fCSV}, {"[][][123][456][][abc][789][]", 8, 8}},
}
-- convert patterns: lua -> pcre
for _, test in ipairs (set) do
test[1][2] = pat2pcre (test[1][2])
end
return set
end
local function set_f_gsub7 (lib, flg)
local subj = ""
for i = 0, 255 do
subj = subj .. string.char (i)
end
-- This set requires calling prepare_set before calling gsub_test
local set = {
Name = "Function gsub, set7",
Func = get_gsub (lib),
--{ s, p, f, n, },
{ {subj, "%a", "" }, },
{ {subj, "%A", "" }, },
{ {subj, "%c", "" }, },
{ {subj, "%C", "" }, },
{ {subj, "%l", "" }, },
{ {subj, "%L", "" }, },
{ {subj, "%p", "" }, },
{ {subj, "%P", "" }, },
{ {subj, "%u", "" }, },
{ {subj, "%U", "" }, },
{ {subj, "%w", "" }, },
{ {subj, "%W", "" }, },
{ {subj, "%x", "" }, },
{ {subj, "%X", "" }, },
{ {subj, "%z", "" }, },
{ {subj, "%Z", "" }, },
{ {subj, "[%a]", "" }, },
{ {subj, "[%A]", "" }, },
{ {subj, "[%c]", "" }, },
{ {subj, "[%C]", "" }, },
{ {subj, "[%l]", "" }, },
{ {subj, "[%L]", "" }, },
{ {subj, "[%p]", "" }, },
{ {subj, "[%P]", "" }, },
{ {subj, "[%u]", "" }, },
{ {subj, "[%U]", "" }, },
{ {subj, "[%w]", "" }, },
{ {subj, "[%W]", "" }, },
{ {subj, "[%x]", "" }, },
{ {subj, "[%X]", "" }, },
{ {subj, "[%z]", "" }, },
{ {subj, "[%Z]", "" }, },
{ {subj, "[%a_]", "" }, },
{ {subj, "[%A_]", "" }, },
{ {subj, "[%c_]", "" }, },
{ {subj, "[%C_]", "" }, },
{ {subj, "[%l_]", "" }, },
{ {subj, "[%L_]", "" }, },
{ {subj, "[%p_]", "" }, },
{ {subj, "[%P_]", "" }, },
{ {subj, "[%u_]", "" }, },
{ {subj, "[%U_]", "" }, },
{ {subj, "[%w_]", "" }, },
{ {subj, "[%W_]", "" }, },
{ {subj, "[%x_]", "" }, },
{ {subj, "[%X_]", "" }, },
{ {subj, "[%z_]", "" }, },
{ {subj, "[%Z_]", "" }, },
{ {subj, "[%a%d]", "" }, },
{ {subj, "[%A%d]", "" }, },
{ {subj, "[%c%d]", "" }, },
{ {subj, "[%C%d]", "" }, },
{ {subj, "[%l%d]", "" }, },
{ {subj, "[%L%d]", "" }, },
{ {subj, "[%p%d]", "" }, },
{ {subj, "[%P%d]", "" }, },
{ {subj, "[%u%d]", "" }, },
{ {subj, "[%U%d]", "" }, },
{ {subj, "[%w%d]", "" }, },
{ {subj, "[%W%d]", "" }, },
{ {subj, "[%x%d]", "" }, },
{ {subj, "[%X%d]", "" }, },
{ {subj, "[%z%d]", "" }, },
{ {subj, "[%Z%d]", "" }, },
{ {subj, "[^%a%d]", "" }, },
{ {subj, "[^%A%d]", "" }, },
{ {subj, "[^%c%d]", "" }, },
{ {subj, "[^%C%d]", "" }, },
{ {subj, "[^%l%d]", "" }, },
{ {subj, "[^%L%d]", "" }, },
{ {subj, "[^%p%d]", "" }, },
{ {subj, "[^%P%d]", "" }, },
{ {subj, "[^%u%d]", "" }, },
{ {subj, "[^%U%d]", "" }, },
{ {subj, "[^%w%d]", "" }, },
{ {subj, "[^%W%d]", "" }, },
{ {subj, "[^%x%d]", "" }, },
{ {subj, "[^%X%d]", "" }, },
{ {subj, "[^%z%d]", "" }, },
{ {subj, "[^%Z%d]", "" }, },
{ {subj, "[^%a_]", "" }, },
{ {subj, "[^%A_]", "" }, },
{ {subj, "[^%c_]", "" }, },
{ {subj, "[^%C_]", "" }, },
{ {subj, "[^%l_]", "" }, },
{ {subj, "[^%L_]", "" }, },
{ {subj, "[^%p_]", "" }, },
{ {subj, "[^%P_]", "" }, },
{ {subj, "[^%u_]", "" }, },
{ {subj, "[^%U_]", "" }, },
{ {subj, "[^%w_]", "" }, },
{ {subj, "[^%W_]", "" }, },
{ {subj, "[^%x_]", "" }, },
{ {subj, "[^%X_]", "" }, },
{ {subj, "[^%z_]", "" }, },
{ {subj, "[^%Z_]", "" }, },
{ {subj, "\100", "" }, },
{ {subj, "[\100]", "" }, },
{ {subj, "[^\100]", "" }, },
{ {subj, "[\100-\200]", "" }, },
{ {subj, "[^\100-\200]", "" }, },
{ {subj, "\100a", "" }, },
{ {subj, "[\100a]", "" }, },
{ {subj, "[^\100a]", "" }, },
{ {subj, "[\100-\200a]", "" }, },
{ {subj, "[^\100-\200a]", "" }, },
}
-- fill in reference results
for _,v in ipairs(set) do
local r0, r1, r2 = pcall (string.gsub, unpack (v[1]))
v[2] = r0 and { r1, r2, r2 } or { r0, r1 }
end
-- convert patterns: lua -> pcre
for _, test in ipairs (set) do
test[1][2] = pat2pcre (test[1][2])
end
return set
end
return function (libname, isglobal)
local lib = isglobal and _G[libname] or require (libname)
local flags = lib.flags and lib.flags ()
local sets = {
set_f_gsub1 (lib, flags),
set_f_gsub4 (lib, flags),
}
if flags.MAJOR*100 + flags.MINOR > 405 then
table.insert (sets, set_f_gsub7 (lib, flags))
end
return sets
end