2010-11-08 14:28:59 +01:00
QuestHelper_File [ " pattern.lua " ] = " 4.0.1.$svnversion$ "
2010-10-24 23:17:33 +02:00
QuestHelper_Loadtime [ " pattern.lua " ] = GetTime ( )
-- The following junk is for building functions to parse strings for various locales.
local varindex , varswap = 0 , { }
local function replacePattern ( p )
varindex = varindex + 1
local b , e , i = string.find ( p , " (%d-)%$ " )
if i then
-- String contains an index.
p = string.sub ( p , 1 , b - 1 ) .. string.sub ( p , e + 1 )
i = tonumber ( i )
else
-- String doesn't contains an index, assume its index is the position we found it in.
i = varindex
end
varswap [ i ] = varindex
if p == " d " then return " (%d+) " end
if p == " s " then return " (.-) " end
-- Only know about strings and integers. Other types are broken.
--[[ assert(false, "Unknown pattern: %"..p) ]]
end
-- Used to cache results, so we don't produce multiple functions for the same string.
local known_patterns = { }
function QuestHelper : convertPattern ( pattern )
local result = known_patterns [ pattern ]
if result then
return result
end
while ( table.remove ( varswap ) ) do end
varindex = 0
local pat = string.format ( " ^%s$ " , string.gsub ( pattern , " %%(.-[%%%a]) " , replacePattern ) )
if varindex == 0 then
-- The string doesn't contain any variables.
result = self.nop
else
local func = " local function parse(input) \n "
local linear = true
for i = 1 , varindex do
if varswap [ i ] ~= i then
linear = false
break
end
end
if linear then
-- All the arguments are in order, we can just return them.
func = func .. string.format ( " return select(3, string.find(input, %q)) " , pat )
else
-- The order has been changed, use temporary variables.
for i = 1 , varindex do
func = func .. ( i == 1 and " local " or " , " ) .. ( " n " .. i )
end
func = func .. string.format ( " = select(3, string.find(input, %q)) \n " , pat )
for i = 1 , varindex do
func = func .. ( i == 1 and " return " or " , " ) .. ( varswap [ i ] and ( " n " .. varswap [ i ] ) or " nil " )
end
end
func = func .. " \n end \n return parse \n "
result = loadstring ( func ) ( )
end
known_patterns [ pattern ] = result
return result
end