libs/core: introduce luci.util.imatch()
[project/luci.git] / libs / core / luasrc / util.lua
index 9747a44..a248026 100644 (file)
@@ -49,8 +49,10 @@ getmetatable("").__mod = function(a, b)
        if not b then
                return a
        elseif type(b) == "table" then
+               for k, _ in pairs(b) do if type(b[k]) == "userdata" then b[k] = tostring(b[k]) end end
                return a:format(unpack(b))
        else
+               if type(b) == "userdata" then b = tostring(b) end
                return a:format(b)
        end
 end
@@ -198,7 +200,7 @@ local function _pcdata_repl(c)
           ( i >= 0x0E and i <= 0x1F ) or ( i == 0x7F )
        then
                return ""
-               
+
        elseif ( i == 0x26 ) or ( i == 0x27 ) or ( i == 0x22 ) or
               ( i == 0x3C ) or ( i == 0x3E )
        then
@@ -280,6 +282,22 @@ function cmatch(str, pat)
        return count
 end
 
+--- Return a matching iterator for the given value. The iterator will return
+-- one token per invocation, the tokens are separated by whitespace. If the
+-- input value is a table, it is transformed into a string first. A nil value
+-- will result in a valid interator which aborts with the first invocation.
+-- @param val          The value to scan (table, string or nil)
+-- @return                     Iterator which returns one token per call
+function imatch(v)
+       if v == nil then
+               v = ""
+       elseif type(v) == "table" then
+               v = table.concat(v, " ")
+       end
+
+       return v:gmatch("%S+")
+end
+
 --- Parse certain units from the given string and return the canonical integer
 -- value or 0 if the unit is unknown. Upper- or lower case is irrelevant.
 -- Recognized units are:
@@ -523,7 +541,7 @@ function get_bytecode(val)
                code = string.dump( loadstring( "return " .. serialize_data(val) ) )
        end
 
-       return code and strip_bytecode(code)
+       return code -- and strip_bytecode(code)
 end
 
 --- Strips unnescessary lua bytecode from given string. Information like line