* Core translation
[project/luci.git] / libs / core / luasrc / util.lua
index 0a30b16..11f7720 100644 (file)
@@ -107,7 +107,7 @@ end
 function dumptable(t, i)
        i = i or 0
        for k,v in pairs(t) do
-               print(string.rep("\t", i) .. k, v)
+               print(string.rep("\t", i) .. tostring(k), tostring(v))
                if type(v) == "table" then
                        dumptable(v, i+1)
                end
@@ -189,9 +189,10 @@ function split(str, pat, max, regex)
 end
 
 
--- Bytecode stripping function by Peter Cawley from http://lua-users.org/lists/lua-l/2008-02/msg01158.html
+-- Strips lua bytecode
+-- Original version by Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
 function strip_bytecode(dump)
-       local version, format, endian, int, size, ins, num = dump:byte(5, 11)
+       local version, format, endian, int, size, ins, num, lnum = dump:byte(5, 12)
        local subint
        if endian == 1 then
                subint = function(dump, i, l)
@@ -200,16 +201,16 @@ function strip_bytecode(dump)
                                val = val * 256 + dump:byte(i + n - 1)
                        end
                        return val, i + l
-               end
+               end
        else
-       subint = function(dump, i, l)
-               local val = 0
-            for n = 1, l, 1 do
-                val = val * 256 + dump:byte(i + n - 1)
-            end
-            return val, i + l
-        end
-    end
+               subint = function(dump, i, l)
+                       local val = 0
+                       for n = 1, l, 1 do
+                               val = val * 256 + dump:byte(i + n - 1)
+                       end
+                       return val, i + l
+               end
+       end
     
        local strip_function
        strip_function = function(dump)
@@ -227,6 +228,8 @@ function strip_bytecode(dump)
                                offset = offset + size + subint(dump, offset, size)
                        elseif t == 3 then
                                offset = offset + num
+                       elseif t == 254 then
+                               offset = offset + lnum
                        end
                end
                count, offset = subint(dump, offset, int)
@@ -273,15 +276,45 @@ function updfenv(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
-       
-       return value
-end
\ No newline at end of file
+-- Parse units from a string and return integer value
+function parse_units(ustr)
+
+        local val = 0
+
+        -- unit map
+        local map = {
+                -- date stuff
+                y   = 60 * 60 * 24 * 366,
+                m   = 60 * 60 * 24 * 31,
+                w   = 60 * 60 * 24 * 7,
+                d   = 60 * 60 * 24,
+                h   = 60 * 60,
+               min = 60,
+
+                -- storage sizes
+                kb  = 1024,
+                mb  = 1024 * 1024,
+                gb  = 1024 * 1024 * 1024,
+
+                -- storage sizes (si)
+                kib = 1000,
+                mib = 1000 * 1000,
+                gib = 1000 * 1000 * 1000
+        }
+
+        -- parse input string
+        for spec in ustr:lower():gmatch("[0-9%.]+[a-zA-Z]*") do
+
+                local num = spec:gsub("[^0-9%.]+$","")
+                local spn = spec:gsub("^[0-9%.]+", "")
+
+                if map[spn] or map[spn:sub(1,1)] then
+                        val = val + num * ( map[spn] or map[spn:sub(1,1)] )
+                else
+                        val = val + num
+                end
+        end
+
+
+       return val
+end