X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Futil.lua;h=a248026f10357d54f04ab4ff0969787ba90dc2df;hp=a3ba43246817d49fc721e583f2516aaea49e79ae;hb=ddd1ba088ed3b93b3485e34d05c427d43306c744;hpb=4ef3ac9694dae9f1c7afa57bd525b54e88d7c608 diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index a3ba43246..a248026f1 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -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 @@ -114,19 +116,16 @@ end -- Scope manipulation routines -- ---- Create a new or get an already existing thread local store associated with --- the current active coroutine. A thread local store is private a table object --- whose values can't be accessed from outside of the running coroutine. --- @return Table value representing the corresponding thread local store -function threadlocal() - local tbl = {} +local tl_meta = { + __mode = "k", - local function get(self, key) - local t = rawget(self, coxpt[coroutine.running()] or coroutine.running() or 0) + __index = function(self, key) + local t = rawget(self, coxpt[coroutine.running()] + or coroutine.running() or 0) return t and t[key] - end + end, - local function set(self, key, value) + __newindex = function(self, key, value) local c = coxpt[coroutine.running()] or coroutine.running() or 0 if not rawget(self, c) then rawset(self, c, { [key] = value }) @@ -134,10 +133,14 @@ function threadlocal() rawget(self, c)[key] = value end end +} - setmetatable(tbl, {__index = get, __newindex = set, __mode = "k"}) - - return tbl +--- Create a new or get an already existing thread local store associated with +-- the current active coroutine. A thread local store is private a table object +-- whose values can't be accessed from outside of the running coroutine. +-- @return Table value representing the corresponding thread local store +function threadlocal(tbl) + return setmetatable(tbl or {}, tl_meta) end @@ -197,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 @@ -279,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: @@ -522,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