X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=libs%2Fcore%2Fluasrc%2Futil.lua;h=c6d9ec6ce162b622d66cdd6dc84d2814f505e5c0;hb=c7ba7f99b04178e839f343b4f3e17cf3c18ea75a;hp=22f295d23f4613dbd5803fa9f3a7f24cb1bad1f1;hpb=84ad4e3e21b53c84cb6d1dc6f6dbae97e24f9d94;p=project%2Fluci.git diff --git a/libs/core/luasrc/util.lua b/libs/core/luasrc/util.lua index 22f295d23..c6d9ec6ce 100644 --- a/libs/core/luasrc/util.lua +++ b/libs/core/luasrc/util.lua @@ -199,6 +199,8 @@ end -- @param value String value containing the data to escape -- @return String value containing the escaped data function pcdata(value) + if not value then return end + value = tostring(value) value = value:gsub("&", "&") value = value:gsub('"', """) value = value:gsub("'", "'") @@ -320,7 +322,7 @@ end --- Combines two or more numerically indexed tables into one. -- @param tbl1 Table value to combine -- @param tbl2 Table value to combine --- @param tblN More values to combine +-- @param ... More tables to combine -- @return Table value containing all values of given tables function combine(...) local result = {} @@ -356,6 +358,19 @@ function update(t, updates) end end +--- Retrieve all keys of given associative table. +-- @param t Table to extract keys from +-- @return Sorted table containing the keys +function keys(t) + local keys = { } + if t then + for k, _ in kspairs(t) do + table.insert( keys, k ) + end + end + return keys +end + --- Clones the given object and return it's copy. -- @param object Table value to clone -- @param deep Boolean indicating whether to do recursive cloning @@ -378,11 +393,11 @@ end --- Create a dynamic table which automatically creates subtables. -- @return Dynamic Table -function create_dtable() +function dtable() return setmetatable({}, { __index = function(tbl, key) return rawget(tbl, key) - or rawget(rawset(tbl, key, create_dtable()), key) + or rawget(rawset(tbl, key, dtable()), key) end }) end @@ -574,10 +589,89 @@ end -- +-- System utility functions +-- + +--- Test whether the current system is operating in big endian mode. +-- @return Boolean value indicating whether system is big endian +function bigendian() + return string.byte(string.dump(function() end), 7) == 0 +end + +--- Execute given commandline and gather stdout. +-- @param command String containing command to execute +-- @return String containing the command's stdout +function exec(command) + local pp = io.popen(command) + local data = pp:read("*a") + pp:close() + + return data +end + +--- Return a line-buffered iterator over the output of given command. +-- @param command String containing the command to execute +-- @return Iterator +function execi(command) + local pp = io.popen(command) + + return pp and function() + local line = pp:read() + + if not line then + pp:close() + end + + return line + end +end + +-- Deprecated +function execl(command) + local pp = io.popen(command) + local line = "" + local data = {} + + while true do + line = pp:read() + if (line == nil) then break end + table.insert(data, line) + end + pp:close() + + return data +end + +--- Returns the absolute path to LuCI base directory. +-- @return String containing the directory path +function libpath() + return luci.fs.dirname(require("luci.debug").__file__) +end + + +-- -- Coroutine safe xpcall and pcall versions modified for Luci -- original version: -- coxpcall 1.13 - Copyright 2005 - Kepler Project (www.keplerproject.org) -- +-- Copyright © 2005 Kepler Project. +-- Permission is hereby granted, free of charge, to any person obtaining a +-- copy of this software and associated documentation files (the "Software"), +-- to deal in the Software without restriction, including without limitation +-- the rights to use, copy, modify, merge, publish, distribute, sublicense, +-- and/or sell copies of the Software, and to permit persons to whom the +-- Software is furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +-- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +-- OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local performResume, handleReturnValue local oldpcall, oldxpcall = pcall, xpcall