| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- Index: lua-5.1.4/src/Makefile
- ===================================================================
- --- lua-5.1.4.orig/src/Makefile 2008-09-25 13:08:31.000000000 +0200
- +++ lua-5.1.4/src/Makefile 2008-09-25 13:08:43.000000000 +0200
- @@ -29,7 +29,7 @@
- lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \
- lundump.o lvm.o lzio.o lnum.o
- LIB_O= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \
- - lstrlib.o loadlib.o linit.o lposix.o
- + lstrlib.o loadlib.o linit.o lposix.o lbitlib.o
-
- LUA_T= lua
- LUA_O= lua.o
- Index: lua-5.1.4/src/bit_limits.h
- ===================================================================
- --- /dev/null 1970-01-01 00:00:00.000000000 +0000
- +++ lua-5.1.4/src/bit_limits.h 2008-09-25 13:09:16.000000000 +0200
- @@ -0,0 +1,4 @@
- +#define BITLIB_FLOAT_BITS 53
- +#define BITLIB_FLOAT_MAX 0xfffffffffffffL
- +#define BITLIB_FLOAT_MIN (-0x10000000000000L)
- +#define BITLIB_FLOAT_UMAX 0x1fffffffffffffUL
- Index: lua-5.1.4/src/lbitlib.c
- ===================================================================
- --- /dev/null 1970-01-01 00:00:00.000000000 +0000
- +++ lua-5.1.4/src/lbitlib.c 2008-09-25 13:05:15.000000000 +0200
- @@ -0,0 +1,133 @@
- +/* Bitwise operations library */
- +/* (c) Reuben Thomas 2000-2008 */
- +/* See README for license */
- +
- +#include "lua.h"
- +#include "lauxlib.h"
- +#include "limits.h"
- +
- +#include "bit_limits.h"
- +
- +
- +/* FIXME: Assume lua_Integer is int */
- +#define LUA_INTEGER_MAX INT_MAX
- +#define LUA_INTEGER_MIN INT_MIN
- +
- +/* FIXME: Assume uint is an unsigned lua_Integer */
- +typedef unsigned int lua_UInteger;
- +#define LUA_UINTEGER_MAX UINT_MAX
- +
- +
- +/* Bit type size and limits */
- +
- +#define BIT_BITS \
- + (CHAR_BIT * sizeof(lua_Integer) > BITLIB_FLOAT_BITS ? \
- + BITLIB_FLOAT_BITS : (CHAR_BIT * sizeof(lua_Integer)))
- +
- +/* This code may give warnings if BITLIB_FLOAT_* are too big to fit in
- + long, but that doesn't matter since in that case they won't be
- + used. */
- +#define BIT_MAX \
- + (CHAR_BIT * sizeof(lua_Integer) > BITLIB_FLOAT_BITS ? BITLIB_FLOAT_MAX : LUA_INTEGER_MAX)
- +
- +#define BIT_MIN \
- + (CHAR_BIT * sizeof(lua_Integer) > BITLIB_FLOAT_BITS ? BITLIB_FLOAT_MIN : LUA_INTEGER_MIN)
- +
- +#define BIT_UMAX \
- + (CHAR_BIT * sizeof(lua_Integer) > BITLIB_FLOAT_BITS ? BITLIB_FLOAT_UMAX : LUA_UINTEGER_MAX)
- +
- +
- +/* Define TOBIT to get a bit value */
- +#ifdef BUILTIN_CAST
- +#define
- +#define TOBIT(L, n, res) \
- + ((void)(res), luaL_checkinteger((L), (n)))
- +#else
- +#include <stdint.h>
- +#include <math.h>
- +
- +/* FIXME: Assume lua_Number fits in a double (use of fmod). */
- +#define TOBIT(L, n, res) \
- + ((lua_Integer)(((res) = fmod(luaL_checknumber(L, (n)), (double)BIT_UMAX + 1.0)), \
- + (res) > BIT_MAX ? ((res) -= (double)BIT_UMAX, (res) -= 1) : \
- + ((res) < BIT_MIN ? ((res) += (double)BIT_UMAX, (res) += 1) : (res))))
- +#endif
- +
- +
- +#define BIT_TRUNCATE(i) \
- + ((i) & BIT_UMAX)
- +
- +
- +/* Operations
- +
- + The macros MONADIC and VARIADIC only deal with bitwise operations.
- +
- + LOGICAL_SHIFT truncates its left-hand operand before shifting so
- + that any extra bits at the most-significant end are not shifted
- + into the result.
- +
- + ARITHMETIC_SHIFT does not truncate its left-hand operand, so that
- + the sign bits are not removed and right shift work properly.
- + */
- +
- +#define MONADIC(name, op) \
- + static int bit_ ## name(lua_State *L) { \
- + lua_Number f; \
- + lua_pushinteger(L, BIT_TRUNCATE(op TOBIT(L, 1, f))); \
- + return 1; \
- + }
- +
- +#define VARIADIC(name, op) \
- + static int bit_ ## name(lua_State *L) { \
- + lua_Number f; \
- + int n = lua_gettop(L), i; \
- + lua_Integer w = TOBIT(L, 1, f); \
- + for (i = 2; i <= n; i++) \
- + w op TOBIT(L, i, f); \
- + lua_pushinteger(L, BIT_TRUNCATE(w)); \
- + return 1; \
- + }
- +
- +#define LOGICAL_SHIFT(name, op) \
- + static int bit_ ## name(lua_State *L) { \
- + lua_Number f; \
- + lua_pushinteger(L, BIT_TRUNCATE(BIT_TRUNCATE((lua_UInteger)TOBIT(L, 1, f)) op \
- + (unsigned)luaL_checknumber(L, 2))); \
- + return 1; \
- + }
- +
- +#define ARITHMETIC_SHIFT(name, op) \
- + static int bit_ ## name(lua_State *L) { \
- + lua_Number f; \
- + lua_pushinteger(L, BIT_TRUNCATE((lua_Integer)TOBIT(L, 1, f) op \
- + (unsigned)luaL_checknumber(L, 2))); \
- + return 1; \
- + }
- +
- +MONADIC(cast, +)
- +MONADIC(bnot, ~)
- +VARIADIC(band, &=)
- +VARIADIC(bor, |=)
- +VARIADIC(bxor, ^=)
- +ARITHMETIC_SHIFT(lshift, <<)
- +LOGICAL_SHIFT(rshift, >>)
- +ARITHMETIC_SHIFT(arshift, >>)
- +
- +static const struct luaL_reg bitlib[] = {
- + {"cast", bit_cast},
- + {"bnot", bit_bnot},
- + {"band", bit_band},
- + {"bor", bit_bor},
- + {"bxor", bit_bxor},
- + {"lshift", bit_lshift},
- + {"rshift", bit_rshift},
- + {"arshift", bit_arshift},
- + {NULL, NULL}
- +};
- +
- +LUALIB_API int luaopen_bit (lua_State *L) {
- + luaL_register(L, "bit", bitlib);
- + lua_pushnumber(L, BIT_BITS);
- + lua_setfield(L, -2, "bits");
- + return 1;
- +}
- Index: lua-5.1.4/src/linit.c
- ===================================================================
- --- lua-5.1.4.orig/src/linit.c 2008-09-25 13:08:11.000000000 +0200
- +++ lua-5.1.4/src/linit.c 2008-09-25 13:08:27.000000000 +0200
- @@ -24,6 +24,7 @@
- {LUA_MATHLIBNAME, luaopen_math},
- {LUA_DBLIBNAME, luaopen_debug},
- {LUA_POSIXLIBNAME, luaopen_posix},
- + {LUA_BITLIBNAME, luaopen_bit},
- {NULL, NULL}
- };
-
- Index: lua-5.1.4/src/lualib.h
- ===================================================================
- --- lua-5.1.4.orig/src/lualib.h 2008-09-25 13:07:29.000000000 +0200
- +++ lua-5.1.4/src/lualib.h 2008-09-25 13:08:06.000000000 +0200
- @@ -42,6 +42,9 @@
- #define LUA_POSIXLIBNAME "posix"
- LUALIB_API int (luaopen_posix) (lua_State *L);
-
- +#define LUA_BITLIBNAME "bit"
- +LUALIB_API int (luaopen_bit) (lua_State *L);
- +
-
- /* open all previous libraries */
- LUALIB_API void (luaL_openlibs) (lua_State *L);
|