summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Gesang <megas.kapaneus@gmail.com>2012-10-19 18:35:14 +0200
committerPhilipp Gesang <megas.kapaneus@gmail.com>2012-10-19 18:35:14 +0200
commite84a0c500a2104dc82b8278d7778144351aa71b3 (patch)
tree2cf9b21cca6c231445d854c9c239ee6d3b731c25
parent9e40ecb0b88b556a55b7b5bf3b7c58b5a8368501 (diff)
downloadlualibs-e84a0c500a2104dc82b8278d7778144351aa71b3.tar.gz
update l-number l-boolean
-rw-r--r--lualibs-boolean.lua66
-rw-r--r--lualibs-number.lua82
2 files changed, 120 insertions, 28 deletions
diff --git a/lualibs-boolean.lua b/lualibs-boolean.lua
index be7ec7d..2b94de7 100644
--- a/lualibs-boolean.lua
+++ b/lualibs-boolean.lua
@@ -6,36 +6,60 @@ if not modules then modules = { } end modules ['l-boolean'] = {
license = "see context related readme files"
}
-boolean = boolean or { }
-
local type, tonumber = type, tonumber
+boolean = boolean or { }
+local boolean = boolean
+
function boolean.tonumber(b)
- if b then return 1 else return 0 end
+ if b then return 1 else return 0 end -- test and return or return
end
function toboolean(str,tolerant)
- if tolerant then
- local tstr = type(str)
- if tstr == "string" then
- return str == "true" or str == "yes" or str == "on" or str == "1" or str == "t"
- elseif tstr == "number" then
- return tonumber(str) ~= 0
- elseif tstr == "nil" then
- return false
- else
- return str
- end
+ if str == nil then
+ return false
+ elseif str == false then
+ return false
+ elseif str == true then
+ return true
+ elseif str == "true" then
+ return true
+ elseif str == "false" then
+ return false
+ elseif not tolerant then
+ return false
+ elseif str == 0 then
+ return false
+ elseif (tonumber(str) or 0) > 0 then
+ return true
+ else
+ return str == "yes" or str == "on" or str == "t"
+ end
+end
+
+string.toboolean = toboolean
+
+function string.booleanstring(str)
+ if str == nil then
+ return false
+ elseif str == false then
+ return false
+ elseif str == true then
+ return true
elseif str == "true" then
return true
elseif str == "false" then
return false
+ elseif str == 0 then
+ return false
+ elseif (tonumber(str) or 0) > 0 then
+ return true
else
- return str
+ return str == "yes" or str == "on" or str == "t"
end
end
-function string.is_boolean(str)
+function string.is_boolean(str,default)
if type(str) == "string" then
if str == "true" or str == "yes" or str == "on" or str == "t" then
return true
@@ -43,13 +67,5 @@ function string.is_boolean(str)
return false
end
end
- return nil
-end
-
-function boolean.alwaystrue()
- return true
-end
-
-function boolean.falsetrue()
- return false
+ return default
end
diff --git a/lualibs-number.lua b/lualibs-number.lua
index a1249f0..a4dbe3b 100644
--- a/lualibs-number.lua
+++ b/lualibs-number.lua
@@ -6,11 +6,15 @@ if not modules then modules = { } end modules ['l-number'] = {
license = "see context related readme files"
}
-local tostring = tostring
-local format, floor, insert, match = string.format, math.floor, table.insert, string.match
+-- this module will be replaced when we have the bit library
+
+local tostring, tonumber = tostring, tonumber
+local format, floor, match, rep = string.format, math.floor, string.match, string.rep
+local concat, insert = table.concat, table.insert
local lpegmatch = lpeg.match
-number = number or { }
+number = number or { }
+local number = number
-- a,b,c,d,e,f = number.toset(100101)
@@ -56,3 +60,75 @@ function number.bits(n,zero)
end
return t
end
+
+--~ http://ricilake.blogspot.com/2007/10/iterating-bits-in-lua.html
+
+function number.bit(p)
+ return 2 ^ (p - 1) -- 1-based indexing
+end
+
+function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ...
+ return x % (p + p) >= p
+end
+
+function number.setbit(x, p)
+ return (x % (p + p) >= p) and x or x + p
+end
+
+function number.clearbit(x, p)
+ return (x % (p + p) >= p) and x - p or x
+end
+
+--~ function number.tobitstring(n)
+--~ if n == 0 then
+--~ return "0"
+--~ else
+--~ local t = { }
+--~ while n > 0 do
+--~ insert(t,1,n % 2 > 0 and 1 or 0)
+--~ n = floor(n/2)
+--~ end
+--~ return concat(t)
+--~ end
+--~ end
+
+function number.tobitstring(n,m)
+ if n == 0 then
+ if m then
+ rep("00000000",m)
+ else
+ return "00000000"
+ end
+ else
+ local t = { }
+ while n > 0 do
+ insert(t,1,n % 2 > 0 and 1 or 0)
+ n = floor(n/2)
+ end
+ local nn = 8 - #t % 8
+ if nn > 0 and nn < 8 then
+ for i=1,nn do
+ insert(t,1,0)
+ end
+ end
+ if m then
+ m = m * 8 - #t
+ if m > 0 then
+ insert(t,1,rep("0",m))
+ end
+ end
+ return concat(t)
+ end
+end
+
+--~ print(number.tobitstring(8))
+--~ print(number.tobitstring(14))
+--~ print(number.tobitstring(66))
+--~ print(number.tobitstring(0x00))
+--~ print(number.tobitstring(0xFF))
+--~ print(number.tobitstring(46260767936,8))
+--~ print(#number.tobitstring(46260767936,6))
+
+function number.valid(str,default)
+ return tonumber(str) or default or nil
+end