* Replaced luafilesystem with luaposix library
[project/luci.git] / src / ffluci / util.lua
index 3004f55..c47a898 100644 (file)
@@ -27,22 +27,49 @@ limitations under the License.
 module("ffluci.util", package.seeall)
 
 
--- Lua OO class support emulation
+-- Lua simplified Python-style OO class support emulation
 function class(base)
-       local clsobj = {}
-       local metatable = {__index = clsobj}
+       local class = {}
        
-    function clsobj.new()
-        local inst = {}
-        setmetatable(inst, metatable)
-        return inst
-    end        
+       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
-               setmetatable(clsobj, {__index = base})
+               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
        
-       return clsobj
+       setmetatable(copy, getmetatable(object))
+       
+       return copy
 end
 
 
@@ -85,6 +112,7 @@ function exec(command)
        return data
 end
 
+
 -- Runs "command" and returns its output as a array of lines
 function execl(command)
        local pp   = io.popen(command)  
@@ -101,23 +129,103 @@ function execl(command)
        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("<", "&lt;") 
+       return value:gsub(">", "&gt;")
+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
+       
+       if cast_int and value and not(value % 1 == 0) then
+               value = nil
        end
-       setfenv(f, scope)
+       
+       return value
 end
 
+
 -- Returns the filename of the calling script
 function __file__()
        return debug.getinfo(2, 'S').source:sub(2)