* luci/core: util.lua: implement min(utes) in parse_units()
[project/luci.git] / libs / core / luasrc / util.lua
index d79f93b..074b435 100644 (file)
@@ -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)
@@ -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)
@@ -284,4 +287,48 @@ function validate(value, cast_number, cast_int)
        end
        
        return value
-end
\ No newline at end of file
+end
+
+
+-- 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