2008-03-02 21:52:58 +00:00
|
|
|
--[[
|
|
|
|
FFLuCI - Utility library
|
|
|
|
|
|
|
|
Description:
|
|
|
|
Several common useful Lua functions
|
|
|
|
|
|
|
|
FileId:
|
|
|
|
$Id$
|
|
|
|
|
|
|
|
License:
|
|
|
|
Copyright 2008 Steven Barth <steven@midlink.org>
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
|
|
|
|
]]--
|
|
|
|
|
|
|
|
module("ffluci.util", package.seeall)
|
|
|
|
|
2008-03-12 20:52:28 +00:00
|
|
|
|
2008-03-16 18:11:22 +00:00
|
|
|
-- Lua simplified Python-style OO class support emulation
|
2008-03-12 20:52:28 +00:00
|
|
|
function class(base)
|
2008-03-16 18:11:22 +00:00
|
|
|
local class = {}
|
2008-03-12 20:52:28 +00:00
|
|
|
|
2008-03-16 18:11:22 +00:00
|
|
|
local create = function(class, ...)
|
|
|
|
local inst = {}
|
|
|
|
setmetatable(inst, {__index = class})
|
|
|
|
|
|
|
|
if inst.__init__ then
|
2008-03-24 15:39:32 +00:00
|
|
|
local stat, err = pcall(inst.__init__, inst, ...)
|
|
|
|
if not stat then
|
|
|
|
error(err)
|
|
|
|
end
|
2008-03-16 18:11:22 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
return inst
|
|
|
|
end
|
|
|
|
|
|
|
|
local classmeta = {__call = create}
|
2008-03-12 20:52:28 +00:00
|
|
|
|
|
|
|
if base then
|
2008-03-16 18:11:22 +00:00
|
|
|
classmeta.__index = base
|
2008-03-12 20:52:28 +00:00
|
|
|
end
|
|
|
|
|
2008-03-16 18:11:22 +00:00
|
|
|
setmetatable(class, classmeta)
|
|
|
|
return class
|
2008-03-12 20:52:28 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
2008-03-25 23:34:21 +00:00
|
|
|
-- Clones an object (deep on-demand)
|
|
|
|
function clone(object, deep)
|
|
|
|
local copy = {}
|
|
|
|
|
|
|
|
for k, v in pairs(object) do
|
|
|
|
if deep and type(v) == "table" then
|
|
|
|
v = clone(v, deep)
|
|
|
|
end
|
|
|
|
copy[k] = v
|
|
|
|
end
|
|
|
|
|
|
|
|
setmetatable(copy, getmetatable(object))
|
|
|
|
|
|
|
|
return copy
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2008-03-02 21:52:58 +00:00
|
|
|
-- Checks whether a table has an object "value" in it
|
|
|
|
function contains(table, value)
|
|
|
|
for k,v in pairs(table) do
|
|
|
|
if value == v then
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- Dumps a table to stdout (useful for testing and debugging)
|
|
|
|
function dumptable(t, i)
|
|
|
|
i = i or 0
|
|
|
|
for k,v in pairs(t) do
|
|
|
|
print(string.rep("\t", i) .. k, v)
|
|
|
|
if type(v) == "table" then
|
|
|
|
dumptable(v, i+1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- Escapes all occurences of c in s
|
|
|
|
function escape(s, c)
|
|
|
|
c = c or "\\"
|
|
|
|
return s:gsub(c, "\\" .. c)
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- Runs "command" and returns its output
|
2008-03-12 20:52:28 +00:00
|
|
|
function exec(command)
|
2008-03-02 21:52:58 +00:00
|
|
|
local pp = io.popen(command)
|
2008-03-12 20:52:28 +00:00
|
|
|
local data = pp:read("*a")
|
|
|
|
pp:close()
|
2008-03-02 21:52:58 +00:00
|
|
|
|
2008-03-12 20:52:28 +00:00
|
|
|
return data
|
|
|
|
end
|
|
|
|
|
2008-03-17 21:38:03 +00:00
|
|
|
|
2008-03-12 20:52:28 +00:00
|
|
|
-- Runs "command" and returns its output as a array of lines
|
|
|
|
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()
|
2008-03-02 21:52:58 +00:00
|
|
|
|
|
|
|
return data
|
|
|
|
end
|
|
|
|
|
2008-03-17 21:38:03 +00:00
|
|
|
|
2008-03-02 21:52:58 +00:00
|
|
|
-- Populate obj in the scope of f as key
|
|
|
|
function extfenv(f, key, obj)
|
|
|
|
local scope = getfenv(f)
|
|
|
|
scope[key] = obj
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2008-03-17 21:38:03 +00:00
|
|
|
-- Checks whether an object is an instanceof class
|
|
|
|
function instanceof(object, class)
|
|
|
|
local meta = getmetatable(object)
|
|
|
|
while meta and meta.__index do
|
|
|
|
if meta.__index == class then
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
meta = getmetatable(meta.__index)
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2008-03-21 19:30:53 +00:00
|
|
|
-- Resets the scope of f doing a shallow copy of its scope into a new table
|
|
|
|
function resfenv(f)
|
2008-03-26 20:55:14 +00:00
|
|
|
setfenv(f, clone(getfenv(f)))
|
2008-03-21 19:30:53 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
2008-03-24 15:39:32 +00:00
|
|
|
-- Returns the Haserl unique sessionid
|
|
|
|
function sessionid()
|
|
|
|
return ENV.SESSIONID
|
|
|
|
end
|
|
|
|
|
2008-03-25 23:34:21 +00:00
|
|
|
|
|
|
|
-- Splits a string into an array (Taken from lua-users.org)
|
|
|
|
function split(str, pat)
|
2008-03-26 20:55:14 +00:00
|
|
|
pat = pat or "\n"
|
|
|
|
|
|
|
|
local t = {}
|
|
|
|
local fpat = "(.-)" .. pat
|
|
|
|
local last_end = 1
|
|
|
|
local s, e, cap = str:find(fpat, 1)
|
|
|
|
|
|
|
|
while s do
|
|
|
|
if s ~= 1 or cap ~= "" then
|
|
|
|
table.insert(t,cap)
|
|
|
|
end
|
|
|
|
last_end = e+1
|
|
|
|
s, e, cap = str:find(fpat, last_end)
|
|
|
|
end
|
|
|
|
|
|
|
|
if last_end <= #str then
|
|
|
|
cap = str:sub(last_end)
|
|
|
|
table.insert(t, cap)
|
|
|
|
end
|
|
|
|
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- Updates given table with new values
|
|
|
|
function update(t, updates)
|
|
|
|
for k, v in pairs(updates) do
|
|
|
|
t[k] = v
|
|
|
|
end
|
2008-03-25 23:34:21 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
|
2008-03-02 21:52:58 +00:00
|
|
|
-- Updates the scope of f with "extscope"
|
|
|
|
function updfenv(f, extscope)
|
2008-03-26 20:55:14 +00:00
|
|
|
update(getfenv(f), extscope)
|
2008-03-02 21:52:58 +00:00
|
|
|
end
|
|
|
|
|
2008-03-17 21:38:03 +00:00
|
|
|
|
2008-03-20 17:30:33 +00:00
|
|
|
-- Validates a variable
|
2008-03-27 23:14:01 +00:00
|
|
|
function validate(value, cast_number, cast_int)
|
2008-03-20 17:30:33 +00:00
|
|
|
if cast_number or cast_int then
|
|
|
|
value = tonumber(value)
|
|
|
|
end
|
|
|
|
|
2008-03-24 21:50:48 +00:00
|
|
|
if cast_int and value and not(value % 1 == 0) then
|
2008-03-20 17:30:33 +00:00
|
|
|
value = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
return value
|
|
|
|
end
|
|
|
|
|
|
|
|
|
2008-03-02 21:52:58 +00:00
|
|
|
-- Returns the filename of the calling script
|
|
|
|
function __file__()
|
|
|
|
return debug.getinfo(2, 'S').source:sub(2)
|
|
|
|
end
|