aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-07-09 14:49:50 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-07-09 14:49:50 -0300
commit5fa680d47f36d2f54d436d47beee2cb7dcf986cb (patch)
treeb0c4f8846eb7378140995e9855710d7ccf0d5369
parent48735da0d035d0a24f67b499ae888b824993c0fe (diff)
downloadlua-5fa680d47f36d2f54d436d47beee2cb7dcf986cb.tar.gz
lua-5fa680d47f36d2f54d436d47beee2cb7dcf986cb.tar.bz2
lua-5fa680d47f36d2f54d436d47beee2cb7dcf986cb.zip
no need for type 'b_uint' (lua_Unsigned must have at least 32 bits)
-rw-r--r--lbitlib.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/lbitlib.c b/lbitlib.c
index 764d1d71..a76307b6 100644
--- a/lbitlib.c
+++ b/lbitlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbitlib.c,v 1.19 2013/04/16 18:39:37 roberto Exp roberto $ 2** $Id: lbitlib.c,v 1.20 2013/06/21 17:27:24 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*/
@@ -19,11 +19,8 @@
19#endif 19#endif
20 20
21 21
22/* type with (at least) LUA_NBITS bits */
23typedef unsigned long b_uint;
24 22
25 23#define ALLONES (~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1))
26#define ALLONES (~(((~(b_uint)0) << (LUA_NBITS - 1)) << 1))
27 24
28 25
29/* macro to trim extra bits */ 26/* macro to trim extra bits */
@@ -35,9 +32,9 @@ typedef unsigned long b_uint;
35 32
36 33
37 34
38static b_uint andaux (lua_State *L) { 35static lua_Unsigned andaux (lua_State *L) {
39 int i, n = lua_gettop(L); 36 int i, n = lua_gettop(L);
40 b_uint r = ~(b_uint)0; 37 lua_Unsigned r = ~(lua_Unsigned)0;
41 for (i = 1; i <= n; i++) 38 for (i = 1; i <= n; i++)
42 r &= luaL_checkunsigned(L, i); 39 r &= luaL_checkunsigned(L, i);
43 return trim(r); 40 return trim(r);
@@ -45,14 +42,14 @@ static b_uint andaux (lua_State *L) {
45 42
46 43
47static int b_and (lua_State *L) { 44static int b_and (lua_State *L) {
48 b_uint r = andaux(L); 45 lua_Unsigned r = andaux(L);
49 lua_pushunsigned(L, r); 46 lua_pushunsigned(L, r);
50 return 1; 47 return 1;
51} 48}
52 49
53 50
54static int b_test (lua_State *L) { 51static int b_test (lua_State *L) {
55 b_uint r = andaux(L); 52 lua_Unsigned r = andaux(L);
56 lua_pushboolean(L, r != 0); 53 lua_pushboolean(L, r != 0);
57 return 1; 54 return 1;
58} 55}
@@ -60,7 +57,7 @@ static int b_test (lua_State *L) {
60 57
61static int b_or (lua_State *L) { 58static int b_or (lua_State *L) {
62 int i, n = lua_gettop(L); 59 int i, n = lua_gettop(L);
63 b_uint r = 0; 60 lua_Unsigned r = 0;
64 for (i = 1; i <= n; i++) 61 for (i = 1; i <= n; i++)
65 r |= luaL_checkunsigned(L, i); 62 r |= luaL_checkunsigned(L, i);
66 lua_pushunsigned(L, trim(r)); 63 lua_pushunsigned(L, trim(r));
@@ -70,7 +67,7 @@ static int b_or (lua_State *L) {
70 67
71static int b_xor (lua_State *L) { 68static int b_xor (lua_State *L) {
72 int i, n = lua_gettop(L); 69 int i, n = lua_gettop(L);
73 b_uint r = 0; 70 lua_Unsigned r = 0;
74 for (i = 1; i <= n; i++) 71 for (i = 1; i <= n; i++)
75 r ^= luaL_checkunsigned(L, i); 72 r ^= luaL_checkunsigned(L, i);
76 lua_pushunsigned(L, trim(r)); 73 lua_pushunsigned(L, trim(r));
@@ -79,13 +76,13 @@ static int b_xor (lua_State *L) {
79 76
80 77
81static int b_not (lua_State *L) { 78static int b_not (lua_State *L) {
82 b_uint r = ~luaL_checkunsigned(L, 1); 79 lua_Unsigned r = ~luaL_checkunsigned(L, 1);
83 lua_pushunsigned(L, trim(r)); 80 lua_pushunsigned(L, trim(r));
84 return 1; 81 return 1;
85} 82}
86 83
87 84
88static int b_shift (lua_State *L, b_uint r, int i) { 85static int b_shift (lua_State *L, lua_Unsigned r, int i) {
89 if (i < 0) { /* shift right? */ 86 if (i < 0) { /* shift right? */
90 i = -i; 87 i = -i;
91 r = trim(r); 88 r = trim(r);
@@ -113,14 +110,14 @@ static int b_rshift (lua_State *L) {
113 110
114 111
115static int b_arshift (lua_State *L) { 112static int b_arshift (lua_State *L) {
116 b_uint r = luaL_checkunsigned(L, 1); 113 lua_Unsigned r = luaL_checkunsigned(L, 1);
117 int i = luaL_checkint(L, 2); 114 int i = luaL_checkint(L, 2);
118 if (i < 0 || !(r & ((b_uint)1 << (LUA_NBITS - 1)))) 115 if (i < 0 || !(r & ((lua_Unsigned)1 << (LUA_NBITS - 1))))
119 return b_shift(L, r, -i); 116 return b_shift(L, r, -i);
120 else { /* arithmetic shift for 'negative' number */ 117 else { /* arithmetic shift for 'negative' number */
121 if (i >= LUA_NBITS) r = ALLONES; 118 if (i >= LUA_NBITS) r = ALLONES;
122 else 119 else
123 r = trim((r >> i) | ~(trim(~(b_uint)0) >> i)); /* add signal bit */ 120 r = trim((r >> i) | ~(trim(~(lua_Unsigned)0) >> i)); /* add signal bit */
124 lua_pushunsigned(L, r); 121 lua_pushunsigned(L, r);
125 return 1; 122 return 1;
126 } 123 }
@@ -128,7 +125,7 @@ static int b_arshift (lua_State *L) {
128 125
129 126
130static int b_rot (lua_State *L, int i) { 127static int b_rot (lua_State *L, int i) {
131 b_uint r = luaL_checkunsigned(L, 1); 128 lua_Unsigned r = luaL_checkunsigned(L, 1);
132 i &= (LUA_NBITS - 1); /* i = i % NBITS */ 129 i &= (LUA_NBITS - 1); /* i = i % NBITS */
133 r = trim(r); 130 r = trim(r);
134 r = (r << i) | (r >> (LUA_NBITS - i)); 131 r = (r << i) | (r >> (LUA_NBITS - i));
@@ -167,7 +164,7 @@ static int fieldargs (lua_State *L, int farg, int *width) {
167 164
168static int b_extract (lua_State *L) { 165static int b_extract (lua_State *L) {
169 int w; 166 int w;
170 b_uint r = trim(luaL_checkunsigned(L, 1)); 167 lua_Unsigned r = trim(luaL_checkunsigned(L, 1));
171 int f = fieldargs(L, 2, &w); 168 int f = fieldargs(L, 2, &w);
172 r = (r >> f) & mask(w); 169 r = (r >> f) & mask(w);
173 lua_pushunsigned(L, r); 170 lua_pushunsigned(L, r);
@@ -177,8 +174,8 @@ static int b_extract (lua_State *L) {
177 174
178static int b_replace (lua_State *L) { 175static int b_replace (lua_State *L) {
179 int w; 176 int w;
180 b_uint r = trim(luaL_checkunsigned(L, 1)); 177 lua_Unsigned r = trim(luaL_checkunsigned(L, 1));
181 b_uint v = luaL_checkunsigned(L, 2); 178 lua_Unsigned v = luaL_checkunsigned(L, 2);
182 int f = fieldargs(L, 3, &w); 179 int f = fieldargs(L, 3, &w);
183 int m = mask(w); 180 int m = mask(w);
184 v &= m; /* erase bits outside given width */ 181 v &= m; /* erase bits outside given width */