diff options
-rw-r--r-- | lbitlib.c | 25 |
1 files changed, 14 insertions, 11 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lbitlib.c,v 1.13 2010/11/22 18:06:33 roberto Exp roberto $ | 2 | ** $Id: lbitlib.c,v 1.14 2010/11/29 15:19:28 roberto Exp roberto $ |
3 | ** Standard library for bitwise operations | 3 | ** Standard library for bitwise operations |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -14,15 +14,18 @@ | |||
14 | 14 | ||
15 | 15 | ||
16 | /* number of bits to consider in a number */ | 16 | /* number of bits to consider in a number */ |
17 | #define NBITS 32 | 17 | #if !defined(LUA_NBITS) |
18 | #define LUA_NBITS 32 | ||
19 | #endif | ||
18 | 20 | ||
19 | #define ALLONES (~(((~(lua_Unsigned)0) << (NBITS - 1)) << 1)) | 21 | |
22 | #define ALLONES (~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1)) | ||
20 | 23 | ||
21 | /* macro to trim extra bits */ | 24 | /* macro to trim extra bits */ |
22 | #define trim(x) ((x) & ALLONES) | 25 | #define trim(x) ((x) & ALLONES) |
23 | 26 | ||
24 | 27 | ||
25 | /* builds a number with 'n' ones (1 <= n <= NBITS) */ | 28 | /* builds a number with 'n' ones (1 <= n <= LUA_NBITS) */ |
26 | #define mask(n) (~((ALLONES << 1) << ((n) - 1))) | 29 | #define mask(n) (~((ALLONES << 1) << ((n) - 1))) |
27 | 30 | ||
28 | 31 | ||
@@ -84,11 +87,11 @@ static int b_shift (lua_State *L, b_uint r, int i) { | |||
84 | if (i < 0) { /* shift right? */ | 87 | if (i < 0) { /* shift right? */ |
85 | i = -i; | 88 | i = -i; |
86 | r = trim(r); | 89 | r = trim(r); |
87 | if (i >= NBITS) r = 0; | 90 | if (i >= LUA_NBITS) r = 0; |
88 | else r >>= i; | 91 | else r >>= i; |
89 | } | 92 | } |
90 | else { /* shift left */ | 93 | else { /* shift left */ |
91 | if (i >= NBITS) r = 0; | 94 | if (i >= LUA_NBITS) r = 0; |
92 | else r <<= i; | 95 | else r <<= i; |
93 | r = trim(r); | 96 | r = trim(r); |
94 | } | 97 | } |
@@ -110,10 +113,10 @@ static int b_rshift (lua_State *L) { | |||
110 | static int b_arshift (lua_State *L) { | 113 | static int b_arshift (lua_State *L) { |
111 | b_uint r = luaL_checkunsigned(L, 1); | 114 | b_uint r = luaL_checkunsigned(L, 1); |
112 | int i = luaL_checkint(L, 2); | 115 | int i = luaL_checkint(L, 2); |
113 | if (i < 0 || !(r & ((b_uint)1 << (NBITS - 1)))) | 116 | if (i < 0 || !(r & ((b_uint)1 << (LUA_NBITS - 1)))) |
114 | return b_shift(L, r, -i); | 117 | return b_shift(L, r, -i); |
115 | else { /* arithmetic shift for 'negative' number */ | 118 | else { /* arithmetic shift for 'negative' number */ |
116 | if (i >= NBITS) r = ALLONES; | 119 | if (i >= LUA_NBITS) r = ALLONES; |
117 | else | 120 | else |
118 | r = trim((r >> i) | ~(~(b_uint)0 >> i)); /* add signal bit */ | 121 | r = trim((r >> i) | ~(~(b_uint)0 >> i)); /* add signal bit */ |
119 | lua_pushunsigned(L, r); | 122 | lua_pushunsigned(L, r); |
@@ -124,9 +127,9 @@ static int b_arshift (lua_State *L) { | |||
124 | 127 | ||
125 | static int b_rot (lua_State *L, int i) { | 128 | static int b_rot (lua_State *L, int i) { |
126 | b_uint r = luaL_checkunsigned(L, 1); | 129 | b_uint r = luaL_checkunsigned(L, 1); |
127 | i &= (NBITS - 1); /* i = i % NBITS */ | 130 | i &= (LUA_NBITS - 1); /* i = i % NBITS */ |
128 | r = trim(r); | 131 | r = trim(r); |
129 | r = (r << i) | (r >> (NBITS - i)); | 132 | r = (r << i) | (r >> (LUA_NBITS - i)); |
130 | lua_pushunsigned(L, trim(r)); | 133 | lua_pushunsigned(L, trim(r)); |
131 | return 1; | 134 | return 1; |
132 | } | 135 | } |
@@ -151,7 +154,7 @@ static int fieldargs (lua_State *L, int farg, int *width) { | |||
151 | int w = luaL_optint(L, farg + 1, 1); | 154 | int w = luaL_optint(L, farg + 1, 1); |
152 | luaL_argcheck(L, 0 <= f, farg, "field cannot be netative"); | 155 | luaL_argcheck(L, 0 <= f, farg, "field cannot be netative"); |
153 | luaL_argcheck(L, 0 < w, farg + 1, "width must be positive"); | 156 | luaL_argcheck(L, 0 < w, farg + 1, "width must be positive"); |
154 | if (f + w > NBITS) | 157 | if (f + w > LUA_NBITS) |
155 | luaL_error(L, "trying to access non-existent bits"); | 158 | luaL_error(L, "trying to access non-existent bits"); |
156 | *width = w; | 159 | *width = w; |
157 | return f; | 160 | return f; |