diff options
| author | Khaled Hosny <khaledhosny@eglug.org> | 2010-05-10 17:23:06 +0300 | 
|---|---|---|
| committer | Khaled Hosny <khaledhosny@eglug.org> | 2010-05-10 17:23:06 +0300 | 
| commit | 7002dfe5556f503320d9bee480e5fb43bdb6e7a3 (patch) | |
| tree | 384ee73556657b6818c78b006cfa625776c980cd /lualibs-number.lua | |
| parent | 20864d5fdb81f248500f2e94c95b3b15569cc277 (diff) | |
| download | lualibs-7002dfe5556f503320d9bee480e5fb43bdb6e7a3.tar.gz | |
Rename to lualibs
Rename luaextra->lualibs when sensible, also use luatexbase instead of
luatextra.
Diffstat (limited to 'lualibs-number.lua')
| -rw-r--r-- | lualibs-number.lua | 58 | 
1 files changed, 58 insertions, 0 deletions
| diff --git a/lualibs-number.lua b/lualibs-number.lua new file mode 100644 index 0000000..a1249f0 --- /dev/null +++ b/lualibs-number.lua @@ -0,0 +1,58 @@ +if not modules then modules = { } end modules ['l-number'] = { +    version   = 1.001, +    comment   = "companion to luat-lib.mkiv", +    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL", +    copyright = "PRAGMA ADE / ConTeXt Development Team", +    license   = "see context related readme files" +} + +local tostring = tostring +local format, floor, insert, match = string.format, math.floor, table.insert, string.match +local lpegmatch = lpeg.match + +number = number or { } + +-- a,b,c,d,e,f = number.toset(100101) + +function number.toset(n) +    return match(tostring(n),"(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)") +end + +function number.toevenhex(n) +    local s = format("%X",n) +    if #s % 2 == 0 then +        return s +    else +        return "0" .. s +    end +end + +-- the lpeg way is slower on 8 digits, but faster on 4 digits, some 7.5% +-- on +-- +-- for i=1,1000000 do +--     local a,b,c,d,e,f,g,h = number.toset(12345678) +--     local a,b,c,d         = number.toset(1234) +--     local a,b,c           = number.toset(123) +-- end +-- +-- of course dedicated "(.)(.)(.)(.)" matches are even faster + +local one = lpeg.C(1-lpeg.S(''))^1 + +function number.toset(n) +    return lpegmatch(one,tostring(n)) +end + +function number.bits(n,zero) +    local t, i = { }, (zero and 0) or 1 +    while n > 0 do +        local m = n % 2 +        if m > 0 then +            insert(t,1,i) +        end +        n = floor(n/2) +        i = i + 1 +    end +    return t +end | 
