l-bit32.lua /size: 3607 b    last modification: 2020-07-01 14:35
1if not modules then modules = { } end modules ['l-bit32'] = {
2    version = 1.001,
3    license = "the same as regular Lua",
4    source  = "bitwise.lua, v 1.24 2014/12/26 17:20:53 roberto",
5    comment = "drop-in for bit32, adapted a bit by Hans Hagen",
6
7}
8
9-- Lua 5.3 has bitwise operators built in but code meant for 5.2 can expect the
10-- bit32 library to be present. For the moment (and maybe forever) we will ship
11-- the bit32 library as part of LuaTeX bit just in case it is missing, here is a
12-- drop-in. The code is an adapted version of code by Roberto. The Luajit variant
13-- is a mixture of mapping and magic.
14
15if bit32 then
16
17    -- lua 5.2: we're okay
18
19elseif utf8 then
20
21    -- lua 5.3:  bitwise.lua, v 1.24 2014/12/26 17:20:53 roberto
22
23    load ( [[
24local select = select -- instead of: arg = { ... }
25
26bit32 = {
27  bnot = function (a)
28    return ~a & 0xFFFFFFFF
29  end,
30  band = function (x, y, z, ...)
31    if not z then
32      return ((x or -1) & (y or -1)) & 0xFFFFFFFF
33    else
34      local res = x & y & z
35      for i=1,select("#",...) do
36        res = res & select(i,...)
37      end
38      return res & 0xFFFFFFFF
39    end
40  end,
41  bor = function (x, y, z, ...)
42    if not z then
43      return ((x or 0) | (y or 0)) & 0xFFFFFFFF
44    else
45      local res = x | y | z
46      for i=1,select("#",...) do
47        res = res | select(i,...)
48      end
49      return res & 0xFFFFFFFF
50    end
51  end,
52  bxor = function (x, y, z, ...)
53    if not z then
54      return ((x or 0) ~ (y or 0)) & 0xFFFFFFFF
55    else
56      local res = x ~ y ~ z
57      for i=1,select("#",...) do
58        res = res ~ select(i,...)
59      end
60      return res & 0xFFFFFFFF
61    end
62  end,
63  btest = function (x, y, z, ...)
64    if not z then
65      return (((x or -1) & (y or -1)) & 0xFFFFFFFF) ~= 0
66    else
67      local res = x & y & z
68      for i=1,select("#",...) do
69          res = res & select(i,...)
70      end
71      return (res & 0xFFFFFFFF) ~= 0
72    end
73  end,
74  lshift = function (a, b)
75    return ((a & 0xFFFFFFFF) << b) & 0xFFFFFFFF
76  end,
77  rshift = function (a, b)
78    return ((a & 0xFFFFFFFF) >> b) & 0xFFFFFFFF
79  end,
80  arshift = function (a, b)
81    a = a & 0xFFFFFFFF
82    if b <= 0 or (a & 0x80000000) == 0 then
83      return (a >> b) & 0xFFFFFFFF
84    else
85      return ((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF
86    end
87  end,
88  lrotate = function (a ,b)
89    b = b & 31
90    a = a & 0xFFFFFFFF
91    a = (a << b) | (a >> (32 - b))
92    return a & 0xFFFFFFFF
93  end,
94  rrotate = function (a, b)
95    b = -b & 31
96    a = a & 0xFFFFFFFF
97    a = (a << b) | (a >> (32 - b))
98    return a & 0xFFFFFFFF
99  end,
100  extract = function (a, f, w)
101    return (a >> f) & ~(-1 << (w or 1))
102  end,
103  replace = function (a, v, f, w)
104    local mask = ~(-1 << (w or 1))
105    return ((a & ~(mask << f)) | ((v & mask) << f)) & 0xFFFFFFFF
106  end,
107}
108        ]] ) ()
109
110elseif bit then
111
112    -- luajit (for now)
113
114    load ( [[
115local band, bnot, rshift, lshift = bit.band, bit.bnot, bit.rshift, bit.lshift
116
117bit32 = {
118  arshift = bit.arshift,
119  band    = band,
120  bnot    = bnot,
121  bor     = bit.bor,
122  bxor    = bit.bxor,
123  btest   = function(...)
124    return band(...) ~= 0
125  end,
126  extract = function(a,f,w)
127    return band(rshift(a,f),2^(w or 1)-1)
128  end,
129  lrotate = bit.rol,
130  lshift  = lshift,
131  replace = function(a,v,f,w)
132    local mask = 2^(w or 1)-1
133    return band(a,bnot(lshift(mask,f)))+lshift(band(v,mask),f)
134  end,
135  rrotate = bit.ror,
136  rshift  = rshift,
137}
138        ]] ) ()
139
140else
141
142    -- hope for the best or fail
143
144 -- bit32 = require("bit32")
145
146    xpcall(function() local _, t = require("bit32") if t then bit32 = t end return end,function() end)
147
148end
149