module("ffluci.util", package.seeall)
+
+-- Lua simplified Python-style OO class support emulation
+function class(base)
+ local class = {}
+
+ local create = function(class, ...)
+ local inst = {}
+ setmetatable(inst, {__index = class})
+
+ if inst.__init__ then
+ local stat, err = pcall(inst.__init__, inst, ...)
+ if not stat then
+ error(err)
+ end
+ end
+
+ return inst
+ end
+
+ local classmeta = {__call = create}
+
+ if base then
+ classmeta.__index = base
+ end
+
+ setmetatable(class, classmeta)
+ return class
+end
+
+
+-- 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
+
+
-- Checks whether a table has an object "value" in it
function contains(table, value)
for k,v in pairs(table) do
-- Runs "command" and returns its output
-function exec(command, return_array)
+function exec(command)
local pp = io.popen(command)
- local data = nil
+ local data = pp:read("*a")
+ pp:close()
- if return_array then
- local line = ""
- data = {}
-
- while true do
- line = pp:read()
- if (line == nil) then break end
- table.insert(data, line)
- end
- pp:close()
- else
- data = pp:read("*a")
- pp:close()
- end
+ return data
+end
+
+
+-- 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()
return data
end
+
-- Populate obj in the scope of f as key
function extfenv(f, key, obj)
local scope = getfenv(f)
scope[key] = obj
- setfenv(f, scope)
+end
+
+
+-- 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
+
+
+-- Creates valid XML PCDATA from a string
+function pcdata(value)
+ value = value:gsub("&", "&")
+ value = value:gsub('"', """)
+ value = value:gsub("'", "'")
+ value = value:gsub("<", "<")
+ return value:gsub(">", ">")
+end
+
+
+-- Resets the scope of f doing a shallow copy of its scope into a new table
+function resfenv(f)
+ setfenv(f, clone(getfenv(f)))
+end
+
+
+-- Returns the Haserl unique sessionid
+function sessionid()
+ return ENV.SESSIONID
+end
+
+
+-- Splits a string into an array (Taken from lua-users.org)
+function split(str, pat)
+ 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
end
-- Updates the scope of f with "extscope"
function updfenv(f, extscope)
- local scope = getfenv(f)
- for k, v in pairs(extscope) do
- scope[k] = v
+ update(getfenv(f), extscope)
+end
+
+
+-- Validates a variable
+function validate(value, cast_number, cast_int)
+ if cast_number or cast_int then
+ value = tonumber(value)
end
- setfenv(f, scope)
+
+ if cast_int and value and not(value % 1 == 0) then
+ value = nil
+ end
+
+ return value
end
+
-- Returns the filename of the calling script
function __file__()
return debug.getinfo(2, 'S').source:sub(2)