wireshark/test/lua/pat2pcre.lua

88 lines
1.9 KiB
Lua

-- See Copyright Notice in the file lrexlib.h
-- Convert Lua regex pattern to its PCRE equivalent.
local t_esc = {
a = "[:alpha:]",
A = "[:^alpha:]",
c = "[:cntrl:]",
C = "[:^cntrl:]",
d = "[:digit:]",
D = "[:^digit:]",
l = "[:lower:]",
L = "[:^lower:]",
p = "[:punct:]",
P = "[:^punct:]",
s = "[:space:]",
S = "[:^space:]",
u = "[:upper:]",
U = "[:^upper:]",
w = "[:alnum:]",
W = "[:^alnum:]",
x = "[:xdigit:]",
X = "[:^xdigit:]",
z = "\\x00",
Z = "\\x01-\\xFF",
}
local function rep_normal (ch)
assert (ch ~= "b", "\"%b\" subpattern is not supported")
assert (ch ~= "0", "invalid capture index")
local v = t_esc[ch]
return v and ("[" .. v .. "]") or ("\\" .. ch)
end
local function rep_charclass (ch)
return t_esc[ch] or ("\\" .. ch)
end
function pat2pcre (s)
local ind = 0
local function getc ()
ind = ind + 1
return string.sub (s, ind, ind)
end
local function getnum ()
local num = string.match (s, "^\\(%d%d?%d?)", ind)
if num then
ind = ind + #num
return string.format ("\\x%02X", num)
end
end
local out, state = "", "normal"
while ind < #s do
local ch = getc ()
if state == "normal" then
if ch == "%" then
out = out .. rep_normal (getc ())
elseif ch == "-" then
out = out .. "*?"
elseif ch == "." then
out = out .. "\\C"
elseif ch == "[" then
out = out .. ch
state = "charclass"
else
local num = getnum ()
out = num and (out .. num) or (out .. ch)
end
elseif state == "charclass" then
if ch == "%" then
out = out .. rep_charclass (getc ())
elseif ch == "]" then
out = out .. ch
state = "normal"
else
local num = getnum ()
out = num and (out .. num) or (out .. ch)
end
end
end
return out
end
return pat2pcre