Import luabins 831869cdc8c5e7579804e6472a2dc6cbe0b2672b

This commit is contained in:
Niels Martin Hansen 2014-04-24 18:09:45 +02:00
parent cf81e91383
commit b4801ef1bb
52 changed files with 5222 additions and 0 deletions

4
vendor/luabins/AUTHORS vendored Normal file
View file

@ -0,0 +1,4 @@
Luabins authors:
----------------
Alexander Gladysh <agladysh@gmail.com>

51
vendor/luabins/BENCHMARK vendored Normal file
View file

@ -0,0 +1,51 @@
Luabins 0.2 benchmark (see etc/benchmark.lua) results on
MacBook Pro 2.4 GHz Intel Core Duo 2.66 MB DDR2 SDRAM
OS X 10.6.2
GCC 4.2.1 (Apple Inc. build 5646) (dot 1)
Lua 5.1.4 from MacPorts
Luabins built with default Makefile configuration
Note that the data used in benchmark is quite trivial. You're advised
to find out if Luabins is "fast enough" for you by yourself.
Lua
-------------------------------------------------------------------
name | rel | abs s / iter = us (1e-6 s) / iter
-------------------------------------------------------------------
luabins_save | 1.0000 | 4.21 / 1000000 = 4.210000 us
luabins_load | 1.2043 | 5.07 / 1000000 = 5.070000 us
loadstring | 4.7435 | 19.97 / 1000000 = 19.970000 us
concat | 10.6413 | 44.80 / 1000000 = 44.800000 us
===================================================================
Luabins 0.1 benchmark (see etc/benchmark.lua) results on
MacBook Pro 2.4 GHz Intel Core Duo 2.66 MB DDR2 SDRAM
OS X 10.5.6
GCC 4.0.1 (Apple Inc. build 5490)
Lua 5.1.4 from MacPorts
LuaJIT 1.1.3 built from sources with default configuration
Luabins built with default configuration
Note that the data used in benchmark is quite trivial. You're advised
to find out if Luabins is "fast enough" for you by yourself.
Lua
-------------------------------------------------------------------
name | rel | abs s / iter = us (1e-6 s) / iter
-------------------------------------------------------------------
luabins_load | 1.0000 | 6.34 / 1000000 = 6.340000 us
luabins_save | 1.7256 | 10.94 / 1000000 = 10.940000 us
loadstring | 3.6530 | 23.16 / 1000000 = 23.160000 us
concat | 10.0741 | 63.87 / 1000000 = 63.870000 us
LuaJIT -O
-------------------------------------------------------------------
name | rel | abs s / iter = us (1e-6 s) / iter
-------------------------------------------------------------------
luabins_load | 1.0000 | 5.40 / 1000000 = 5.400000 us
luabins_save | 1.6111 | 8.70 / 1000000 = 8.700000 us
concat | 6.6630 | 35.98 / 1000000 = 35.980000 us
loadstring | 23.6370 | 127.64 / 1000000 = 127.640000 us

32
vendor/luabins/COPYRIGHT vendored Normal file
View file

@ -0,0 +1,32 @@
Luabins License
---------------
Luabins is licensed under the terms of the MIT license reproduced below.
This means that luabins is free software and can be used for both academic
and commercial purposes at absolutely no cost.
===============================================================================
Copyright (C) 2009-2010 Luabins authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
===============================================================================
(end of COPYRIGHT)

47
vendor/luabins/HISTORY vendored Normal file
View file

@ -0,0 +1,47 @@
v0.3
====
Format unification for x86 and x86_64. Bug fixes.
WARNING: Format is not compatible with 0.2 and below.
Only data saved on x86_64 is affected, though.
Data, saved on x86, should load fine.
New features:
-- Format change: unified save format for x86 vs. x86_64.
-- API to save data to FILE * stream without Lua (see fwrite.h).
Bug fixes:
-- Load: fixed bug in readbyte, now it checks if we have data before read.
-- Load: fixed Lua C stack overflow bug on large data.
Misc:
-- Better module information.
Replaced luabins.VERSION with _VERSION, _DESCRIPTION and _COPYRIGHT.
-- Added some CLI tools, useful for Luabins development (see etc/).
-- Some code cleanup.
v0.2
====
Lua-less saving.
-- New, 2x faster luabins.save() (see BENCHMARK).
-- API to save data manually, without Lua (see write.h).
-- Added Luarocks rockspecs (see rockspec/).
-- Fixed Makefile for Ubuntu.
v0.1.1
======
Bugfix release.
-- Fixed handling of array holes in Lua tables.
v0.1
====
Initial release.

469
vendor/luabins/Makefile vendored Normal file
View file

@ -0,0 +1,469 @@
## CONFIGURATION ##############################################################
ifeq ($(shell uname),Darwin)
LUA_DIR := /usr/local
LUA_LIBDIR := $(LUA_DIR)/lib/lua/5.1
LUA_INCDIR := $(LUA_DIR)/include
LUALIB := lua
else
# Assuming Ubuntu
LUA_LIBDIR := /usr/lib
LUA_INCDIR := /usr/include/lua5.1
LUALIB := lua5.1
endif
PROJECTNAME := luabins
SONAME := $(PROJECTNAME).so
ANAME := lib$(PROJECTNAME).a
HNAME := $(PROJECTNAME).h
TESTNAME := $(PROJECTNAME)-test
TESTLUA := test.lua
LUA := lua
CP := cp
RM := rm -f
RMDIR := rm -df
MKDIR := mkdir -p
CC := gcc
LD := gcc
AR := ar rcu
RANLIB := ranlib
ECHO := @echo
TOUCH := touch
# Needed for tests only
CXX := g++
LDXX := g++
OBJDIR := ./obj
TMPDIR := ./tmp
INCDIR := ./include
LIBDIR := ./lib
HFILE := $(INCDIR)/$(HNAME)
CFLAGS += -O2 -Wall -I$(LUA_INCDIR)
LDFLAGS += -L$(LUA_LIBDIR)
# Tested on OS X and Ubuntu
SOFLAGS :=
ifeq ($(shell uname),Darwin)
SOFLAGS += -dynamiclib -undefined dynamic_lookup
else
CFLAGS += -fPIC
SOFLAGS += -shared
LDFLAGS += -ldl
RMDIR := rm -rf
endif
CFLAGS += $(MYCFLAGS)
LDFLAGS += $(MYLDFLAGS)
## MAIN TARGETS ###############################################################
all: $(LIBDIR)/$(SONAME) $(LIBDIR)/$(ANAME) $(HFILE)
clean: cleanlibs cleantest
$(RM) $(HFILE)
install: $(LIBDIR)/$(SONAME)
# Note header and static library are not copied anywhere
$(CP) $(LIBDIR)/$(SONAME) $(LUA_LIBDIR)/$(SONAME)
$(HFILE):
$(CP) src/$(HNAME) $(HFILE)
## GENERATED RELEASE TARGETS ##################################################
cleanlibs: cleanobjects
$(RM) $(LIBDIR)/$(SONAME)
$(RM) $(LIBDIR)/$(ANAME)
$(LIBDIR)/$(SONAME): $(OBJDIR)/fwrite.o $(OBJDIR)/load.o $(OBJDIR)/luabins.o $(OBJDIR)/luainternals.o $(OBJDIR)/lualess.o $(OBJDIR)/save.o $(OBJDIR)/savebuffer.o $(OBJDIR)/write.o
$(MKDIR) $(LIBDIR)
$(LD) -o $@ $(OBJDIR)/fwrite.o $(OBJDIR)/load.o $(OBJDIR)/luabins.o $(OBJDIR)/luainternals.o $(OBJDIR)/lualess.o $(OBJDIR)/save.o $(OBJDIR)/savebuffer.o $(OBJDIR)/write.o $(LDFLAGS) $(SOFLAGS)
$(LIBDIR)/$(ANAME): $(OBJDIR)/fwrite.o $(OBJDIR)/load.o $(OBJDIR)/luabins.o $(OBJDIR)/luainternals.o $(OBJDIR)/lualess.o $(OBJDIR)/save.o $(OBJDIR)/savebuffer.o $(OBJDIR)/write.o
$(MKDIR) $(LIBDIR)
$(AR) $@ $(OBJDIR)/fwrite.o $(OBJDIR)/load.o $(OBJDIR)/luabins.o $(OBJDIR)/luainternals.o $(OBJDIR)/lualess.o $(OBJDIR)/save.o $(OBJDIR)/savebuffer.o $(OBJDIR)/write.o
$(RANLIB) $@
# objects:
cleanobjects:
$(RM) $(OBJDIR)/fwrite.o $(OBJDIR)/load.o $(OBJDIR)/luabins.o $(OBJDIR)/luainternals.o $(OBJDIR)/lualess.o $(OBJDIR)/save.o $(OBJDIR)/savebuffer.o $(OBJDIR)/write.o
$(OBJDIR)/fwrite.o: src/fwrite.c src/luaheaders.h src/fwrite.h \
src/saveload.h
$(CC) $(CFLAGS) -o $@ -c src/fwrite.c
$(OBJDIR)/load.o: src/load.c src/luaheaders.h src/luabins.h \
src/saveload.h src/luainternals.h
$(CC) $(CFLAGS) -o $@ -c src/load.c
$(OBJDIR)/luabins.o: src/luabins.c src/luaheaders.h src/luabins.h
$(CC) $(CFLAGS) -o $@ -c src/luabins.c
$(OBJDIR)/luainternals.o: src/luainternals.c src/luainternals.h
$(CC) $(CFLAGS) -o $@ -c src/luainternals.c
$(OBJDIR)/lualess.o: src/lualess.c
$(CC) $(CFLAGS) -o $@ -c src/lualess.c
$(OBJDIR)/save.o: src/save.c src/luaheaders.h src/luabins.h \
src/saveload.h src/savebuffer.h src/write.h
$(CC) $(CFLAGS) -o $@ -c src/save.c
$(OBJDIR)/savebuffer.o: src/savebuffer.c src/luaheaders.h \
src/saveload.h src/savebuffer.h
$(CC) $(CFLAGS) -o $@ -c src/savebuffer.c
$(OBJDIR)/write.o: src/write.c src/luaheaders.h src/write.h \
src/saveload.h src/savebuffer.h
$(CC) $(CFLAGS) -o $@ -c src/write.c
## TEST TARGETS ###############################################################
test: testc89 testc99 testc++98
$(ECHO) "===== TESTS PASSED ====="
resettest: resettestc89 resettestc99 resettestc++98
cleantest: cleantestc89 cleantestc99 cleantestc++98
## GENERATED TEST TARGETS #####################################################
## ----- Begin c89 -----
testc89: lua-testsc89 c-testsc89
lua-testsc89: $(TMPDIR)/c89/.luatestspassed
c-testsc89: $(TMPDIR)/c89/.ctestspassed
$(TMPDIR)/c89/.luatestspassed: $(TMPDIR)/c89/$(SONAME) test/$(TESTLUA)
$(ECHO) "===== Running Lua tests for c89 ====="
@$(LUA) \
-e "package.cpath='$(TMPDIR)/c89/$(SONAME);'..package.cpath" \
test/$(TESTLUA)
$(TOUCH) $(TMPDIR)/c89/.luatestspassed
$(ECHO) "===== Lua tests for c89 PASSED ====="
$(TMPDIR)/c89/.ctestspassed: $(TMPDIR)/c89/$(TESTNAME) test/$(TESTLUA)
$(ECHO) "===== Running C tests for c89 ====="
$(TMPDIR)/c89/$(TESTNAME)
$(TOUCH) $(TMPDIR)/c89/.ctestspassed
$(ECHO) "===== C tests for c89 PASSED ====="
$(TMPDIR)/c89/$(TESTNAME): $(OBJDIR)/c89-test.o $(OBJDIR)/c89-test_api.o $(OBJDIR)/c89-test_fwrite_api.o $(OBJDIR)/c89-test_savebuffer.o $(OBJDIR)/c89-test_write_api.o $(OBJDIR)/c89-util.o $(TMPDIR)/c89/$(ANAME)
$(MKDIR) $(TMPDIR)/c89
$(LD) -o $@ $(OBJDIR)/c89-test.o $(OBJDIR)/c89-test_api.o $(OBJDIR)/c89-test_fwrite_api.o $(OBJDIR)/c89-test_savebuffer.o $(OBJDIR)/c89-test_write_api.o $(OBJDIR)/c89-util.o $(LDFLAGS) -lm -l$(LUALIB) -l$(PROJECTNAME) -L$(TMPDIR)/c89
resettestc89:
$(RM) $(TMPDIR)/c89/.luatestspassed
$(RM) $(TMPDIR)/c89/.ctestspassed
cleantestc89: cleanlibsc89 resettestc89 \
cleantestobjectsc89
$(RM) $(TMPDIR)/c89/$(TESTNAME)
$(RMDIR) $(TMPDIR)/c89
# testobjectsc89:
cleantestobjectsc89:
$(RM) $(OBJDIR)/c89-test.o $(OBJDIR)/c89-test_api.o $(OBJDIR)/c89-test_fwrite_api.o $(OBJDIR)/c89-test_savebuffer.o $(OBJDIR)/c89-test_write_api.o $(OBJDIR)/c89-util.o
$(OBJDIR)/c89-test.o: test/test.c test/test.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -Isrc/ -o $@ -c test/test.c
$(OBJDIR)/c89-test_api.o: test/test_api.c src/luabins.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -Isrc/ -o $@ -c test/test_api.c
$(OBJDIR)/c89-test_fwrite_api.o: test/test_fwrite_api.c src/lualess.h \
src/fwrite.h src/saveload.h test/test.h test/util.h \
test/write_tests.inc
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -Isrc/ -o $@ -c test/test_fwrite_api.c
$(OBJDIR)/c89-test_savebuffer.o: test/test_savebuffer.c src/lualess.h \
src/savebuffer.h test/test.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -Isrc/ -o $@ -c test/test_savebuffer.c
$(OBJDIR)/c89-test_write_api.o: test/test_write_api.c src/lualess.h \
src/write.h src/saveload.h src/savebuffer.h test/test.h test/util.h \
test/write_tests.inc
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -Isrc/ -o $@ -c test/test_write_api.c
$(OBJDIR)/c89-util.o: test/util.c test/util.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -Isrc/ -o $@ -c test/util.c
cleanlibsc89: cleanobjectsc89
$(RM) $(TMPDIR)/c89/$(SONAME)
$(RM) $(TMPDIR)/c89/$(ANAME)
$(TMPDIR)/c89/$(SONAME): $(OBJDIR)/c89-fwrite.o $(OBJDIR)/c89-load.o $(OBJDIR)/c89-luabins.o $(OBJDIR)/c89-luainternals.o $(OBJDIR)/c89-lualess.o $(OBJDIR)/c89-save.o $(OBJDIR)/c89-savebuffer.o $(OBJDIR)/c89-write.o
$(MKDIR) $(TMPDIR)/c89
$(LD) -o $@ $(OBJDIR)/c89-fwrite.o $(OBJDIR)/c89-load.o $(OBJDIR)/c89-luabins.o $(OBJDIR)/c89-luainternals.o $(OBJDIR)/c89-lualess.o $(OBJDIR)/c89-save.o $(OBJDIR)/c89-savebuffer.o $(OBJDIR)/c89-write.o $(LDFLAGS) $(SOFLAGS)
$(TMPDIR)/c89/$(ANAME): $(OBJDIR)/c89-fwrite.o $(OBJDIR)/c89-load.o $(OBJDIR)/c89-luabins.o $(OBJDIR)/c89-luainternals.o $(OBJDIR)/c89-lualess.o $(OBJDIR)/c89-save.o $(OBJDIR)/c89-savebuffer.o $(OBJDIR)/c89-write.o
$(MKDIR) $(TMPDIR)/c89
$(AR) $@ $(OBJDIR)/c89-fwrite.o $(OBJDIR)/c89-load.o $(OBJDIR)/c89-luabins.o $(OBJDIR)/c89-luainternals.o $(OBJDIR)/c89-lualess.o $(OBJDIR)/c89-save.o $(OBJDIR)/c89-savebuffer.o $(OBJDIR)/c89-write.o
$(RANLIB) $@
# objectsc89:
cleanobjectsc89:
$(RM) $(OBJDIR)/c89-fwrite.o $(OBJDIR)/c89-load.o $(OBJDIR)/c89-luabins.o $(OBJDIR)/c89-luainternals.o $(OBJDIR)/c89-lualess.o $(OBJDIR)/c89-save.o $(OBJDIR)/c89-savebuffer.o $(OBJDIR)/c89-write.o
$(OBJDIR)/c89-fwrite.o: src/fwrite.c src/luaheaders.h src/fwrite.h \
src/saveload.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/fwrite.c
$(OBJDIR)/c89-load.o: src/load.c src/luaheaders.h src/luabins.h \
src/saveload.h src/luainternals.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/load.c
$(OBJDIR)/c89-luabins.o: src/luabins.c src/luaheaders.h src/luabins.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/luabins.c
$(OBJDIR)/c89-luainternals.o: src/luainternals.c src/luainternals.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/luainternals.c
$(OBJDIR)/c89-lualess.o: src/lualess.c
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/lualess.c
$(OBJDIR)/c89-save.o: src/save.c src/luaheaders.h src/luabins.h \
src/saveload.h src/savebuffer.h src/write.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/save.c
$(OBJDIR)/c89-savebuffer.o: src/savebuffer.c src/luaheaders.h \
src/saveload.h src/savebuffer.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/savebuffer.c
$(OBJDIR)/c89-write.o: src/write.c src/luaheaders.h src/write.h \
src/saveload.h src/savebuffer.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c89 -o $@ -c src/write.c
## ----- Begin c99 -----
testc99: lua-testsc99 c-testsc99
lua-testsc99: $(TMPDIR)/c99/.luatestspassed
c-testsc99: $(TMPDIR)/c99/.ctestspassed
$(TMPDIR)/c99/.luatestspassed: $(TMPDIR)/c99/$(SONAME) test/$(TESTLUA)
$(ECHO) "===== Running Lua tests for c99 ====="
@$(LUA) \
-e "package.cpath='$(TMPDIR)/c99/$(SONAME);'..package.cpath" \
test/$(TESTLUA)
$(TOUCH) $(TMPDIR)/c99/.luatestspassed
$(ECHO) "===== Lua tests for c99 PASSED ====="
$(TMPDIR)/c99/.ctestspassed: $(TMPDIR)/c99/$(TESTNAME) test/$(TESTLUA)
$(ECHO) "===== Running C tests for c99 ====="
$(TMPDIR)/c99/$(TESTNAME)
$(TOUCH) $(TMPDIR)/c99/.ctestspassed
$(ECHO) "===== C tests for c99 PASSED ====="
$(TMPDIR)/c99/$(TESTNAME): $(OBJDIR)/c99-test.o $(OBJDIR)/c99-test_api.o $(OBJDIR)/c99-test_fwrite_api.o $(OBJDIR)/c99-test_savebuffer.o $(OBJDIR)/c99-test_write_api.o $(OBJDIR)/c99-util.o $(TMPDIR)/c99/$(ANAME)
$(MKDIR) $(TMPDIR)/c99
$(LD) -o $@ $(OBJDIR)/c99-test.o $(OBJDIR)/c99-test_api.o $(OBJDIR)/c99-test_fwrite_api.o $(OBJDIR)/c99-test_savebuffer.o $(OBJDIR)/c99-test_write_api.o $(OBJDIR)/c99-util.o $(LDFLAGS) -lm -l$(LUALIB) -l$(PROJECTNAME) -L$(TMPDIR)/c99
resettestc99:
$(RM) $(TMPDIR)/c99/.luatestspassed
$(RM) $(TMPDIR)/c99/.ctestspassed
cleantestc99: cleanlibsc99 resettestc99 \
cleantestobjectsc99
$(RM) $(TMPDIR)/c99/$(TESTNAME)
$(RMDIR) $(TMPDIR)/c99
# testobjectsc99:
cleantestobjectsc99:
$(RM) $(OBJDIR)/c99-test.o $(OBJDIR)/c99-test_api.o $(OBJDIR)/c99-test_fwrite_api.o $(OBJDIR)/c99-test_savebuffer.o $(OBJDIR)/c99-test_write_api.o $(OBJDIR)/c99-util.o
$(OBJDIR)/c99-test.o: test/test.c test/test.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -Isrc/ -o $@ -c test/test.c
$(OBJDIR)/c99-test_api.o: test/test_api.c src/luabins.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -Isrc/ -o $@ -c test/test_api.c
$(OBJDIR)/c99-test_fwrite_api.o: test/test_fwrite_api.c src/lualess.h \
src/fwrite.h src/saveload.h test/test.h test/util.h \
test/write_tests.inc
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -Isrc/ -o $@ -c test/test_fwrite_api.c
$(OBJDIR)/c99-test_savebuffer.o: test/test_savebuffer.c src/lualess.h \
src/savebuffer.h test/test.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -Isrc/ -o $@ -c test/test_savebuffer.c
$(OBJDIR)/c99-test_write_api.o: test/test_write_api.c src/lualess.h \
src/write.h src/saveload.h src/savebuffer.h test/test.h test/util.h \
test/write_tests.inc
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -Isrc/ -o $@ -c test/test_write_api.c
$(OBJDIR)/c99-util.o: test/util.c test/util.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -Isrc/ -o $@ -c test/util.c
cleanlibsc99: cleanobjectsc99
$(RM) $(TMPDIR)/c99/$(SONAME)
$(RM) $(TMPDIR)/c99/$(ANAME)
$(TMPDIR)/c99/$(SONAME): $(OBJDIR)/c99-fwrite.o $(OBJDIR)/c99-load.o $(OBJDIR)/c99-luabins.o $(OBJDIR)/c99-luainternals.o $(OBJDIR)/c99-lualess.o $(OBJDIR)/c99-save.o $(OBJDIR)/c99-savebuffer.o $(OBJDIR)/c99-write.o
$(MKDIR) $(TMPDIR)/c99
$(LD) -o $@ $(OBJDIR)/c99-fwrite.o $(OBJDIR)/c99-load.o $(OBJDIR)/c99-luabins.o $(OBJDIR)/c99-luainternals.o $(OBJDIR)/c99-lualess.o $(OBJDIR)/c99-save.o $(OBJDIR)/c99-savebuffer.o $(OBJDIR)/c99-write.o $(LDFLAGS) $(SOFLAGS)
$(TMPDIR)/c99/$(ANAME): $(OBJDIR)/c99-fwrite.o $(OBJDIR)/c99-load.o $(OBJDIR)/c99-luabins.o $(OBJDIR)/c99-luainternals.o $(OBJDIR)/c99-lualess.o $(OBJDIR)/c99-save.o $(OBJDIR)/c99-savebuffer.o $(OBJDIR)/c99-write.o
$(MKDIR) $(TMPDIR)/c99
$(AR) $@ $(OBJDIR)/c99-fwrite.o $(OBJDIR)/c99-load.o $(OBJDIR)/c99-luabins.o $(OBJDIR)/c99-luainternals.o $(OBJDIR)/c99-lualess.o $(OBJDIR)/c99-save.o $(OBJDIR)/c99-savebuffer.o $(OBJDIR)/c99-write.o
$(RANLIB) $@
# objectsc99:
cleanobjectsc99:
$(RM) $(OBJDIR)/c99-fwrite.o $(OBJDIR)/c99-load.o $(OBJDIR)/c99-luabins.o $(OBJDIR)/c99-luainternals.o $(OBJDIR)/c99-lualess.o $(OBJDIR)/c99-save.o $(OBJDIR)/c99-savebuffer.o $(OBJDIR)/c99-write.o
$(OBJDIR)/c99-fwrite.o: src/fwrite.c src/luaheaders.h src/fwrite.h \
src/saveload.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/fwrite.c
$(OBJDIR)/c99-load.o: src/load.c src/luaheaders.h src/luabins.h \
src/saveload.h src/luainternals.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/load.c
$(OBJDIR)/c99-luabins.o: src/luabins.c src/luaheaders.h src/luabins.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/luabins.c
$(OBJDIR)/c99-luainternals.o: src/luainternals.c src/luainternals.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/luainternals.c
$(OBJDIR)/c99-lualess.o: src/lualess.c
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/lualess.c
$(OBJDIR)/c99-save.o: src/save.c src/luaheaders.h src/luabins.h \
src/saveload.h src/savebuffer.h src/write.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/save.c
$(OBJDIR)/c99-savebuffer.o: src/savebuffer.c src/luaheaders.h \
src/saveload.h src/savebuffer.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/savebuffer.c
$(OBJDIR)/c99-write.o: src/write.c src/luaheaders.h src/write.h \
src/saveload.h src/savebuffer.h
$(CC) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c -std=c99 -o $@ -c src/write.c
## ----- Begin c++98 -----
testc++98: lua-testsc++98 c-testsc++98
lua-testsc++98: $(TMPDIR)/c++98/.luatestspassed
c-testsc++98: $(TMPDIR)/c++98/.ctestspassed
$(TMPDIR)/c++98/.luatestspassed: $(TMPDIR)/c++98/$(SONAME) test/$(TESTLUA)
$(ECHO) "===== Running Lua tests for c++98 ====="
@$(LUA) \
-e "package.cpath='$(TMPDIR)/c++98/$(SONAME);'..package.cpath" \
test/$(TESTLUA)
$(TOUCH) $(TMPDIR)/c++98/.luatestspassed
$(ECHO) "===== Lua tests for c++98 PASSED ====="
$(TMPDIR)/c++98/.ctestspassed: $(TMPDIR)/c++98/$(TESTNAME) test/$(TESTLUA)
$(ECHO) "===== Running C tests for c++98 ====="
$(TMPDIR)/c++98/$(TESTNAME)
$(TOUCH) $(TMPDIR)/c++98/.ctestspassed
$(ECHO) "===== C tests for c++98 PASSED ====="
$(TMPDIR)/c++98/$(TESTNAME): $(OBJDIR)/c++98-test.o $(OBJDIR)/c++98-test_api.o $(OBJDIR)/c++98-test_fwrite_api.o $(OBJDIR)/c++98-test_savebuffer.o $(OBJDIR)/c++98-test_write_api.o $(OBJDIR)/c++98-util.o $(TMPDIR)/c++98/$(ANAME)
$(MKDIR) $(TMPDIR)/c++98
$(LDXX) -o $@ $(OBJDIR)/c++98-test.o $(OBJDIR)/c++98-test_api.o $(OBJDIR)/c++98-test_fwrite_api.o $(OBJDIR)/c++98-test_savebuffer.o $(OBJDIR)/c++98-test_write_api.o $(OBJDIR)/c++98-util.o $(LDFLAGS) -lm -l$(LUALIB) -l$(PROJECTNAME) -L$(TMPDIR)/c++98
resettestc++98:
$(RM) $(TMPDIR)/c++98/.luatestspassed
$(RM) $(TMPDIR)/c++98/.ctestspassed
cleantestc++98: cleanlibsc++98 resettestc++98 \
cleantestobjectsc++98
$(RM) $(TMPDIR)/c++98/$(TESTNAME)
$(RMDIR) $(TMPDIR)/c++98
# testobjectsc++98:
cleantestobjectsc++98:
$(RM) $(OBJDIR)/c++98-test.o $(OBJDIR)/c++98-test_api.o $(OBJDIR)/c++98-test_fwrite_api.o $(OBJDIR)/c++98-test_savebuffer.o $(OBJDIR)/c++98-test_write_api.o $(OBJDIR)/c++98-util.o
$(OBJDIR)/c++98-test.o: test/test.c test/test.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -Isrc/ -o $@ -c test/test.c
$(OBJDIR)/c++98-test_api.o: test/test_api.c src/luabins.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -Isrc/ -o $@ -c test/test_api.c
$(OBJDIR)/c++98-test_fwrite_api.o: test/test_fwrite_api.c src/lualess.h \
src/fwrite.h src/saveload.h test/test.h test/util.h \
test/write_tests.inc
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -Isrc/ -o $@ -c test/test_fwrite_api.c
$(OBJDIR)/c++98-test_savebuffer.o: test/test_savebuffer.c src/lualess.h \
src/savebuffer.h test/test.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -Isrc/ -o $@ -c test/test_savebuffer.c
$(OBJDIR)/c++98-test_write_api.o: test/test_write_api.c src/lualess.h \
src/write.h src/saveload.h src/savebuffer.h test/test.h test/util.h \
test/write_tests.inc
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -Isrc/ -o $@ -c test/test_write_api.c
$(OBJDIR)/c++98-util.o: test/util.c test/util.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -Isrc/ -o $@ -c test/util.c
cleanlibsc++98: cleanobjectsc++98
$(RM) $(TMPDIR)/c++98/$(SONAME)
$(RM) $(TMPDIR)/c++98/$(ANAME)
$(TMPDIR)/c++98/$(SONAME): $(OBJDIR)/c++98-fwrite.o $(OBJDIR)/c++98-load.o $(OBJDIR)/c++98-luabins.o $(OBJDIR)/c++98-luainternals.o $(OBJDIR)/c++98-lualess.o $(OBJDIR)/c++98-save.o $(OBJDIR)/c++98-savebuffer.o $(OBJDIR)/c++98-write.o
$(MKDIR) $(TMPDIR)/c++98
$(LDXX) -o $@ $(OBJDIR)/c++98-fwrite.o $(OBJDIR)/c++98-load.o $(OBJDIR)/c++98-luabins.o $(OBJDIR)/c++98-luainternals.o $(OBJDIR)/c++98-lualess.o $(OBJDIR)/c++98-save.o $(OBJDIR)/c++98-savebuffer.o $(OBJDIR)/c++98-write.o $(LDFLAGS) $(SOFLAGS)
$(TMPDIR)/c++98/$(ANAME): $(OBJDIR)/c++98-fwrite.o $(OBJDIR)/c++98-load.o $(OBJDIR)/c++98-luabins.o $(OBJDIR)/c++98-luainternals.o $(OBJDIR)/c++98-lualess.o $(OBJDIR)/c++98-save.o $(OBJDIR)/c++98-savebuffer.o $(OBJDIR)/c++98-write.o
$(MKDIR) $(TMPDIR)/c++98
$(AR) $@ $(OBJDIR)/c++98-fwrite.o $(OBJDIR)/c++98-load.o $(OBJDIR)/c++98-luabins.o $(OBJDIR)/c++98-luainternals.o $(OBJDIR)/c++98-lualess.o $(OBJDIR)/c++98-save.o $(OBJDIR)/c++98-savebuffer.o $(OBJDIR)/c++98-write.o
$(RANLIB) $@
# objectsc++98:
cleanobjectsc++98:
$(RM) $(OBJDIR)/c++98-fwrite.o $(OBJDIR)/c++98-load.o $(OBJDIR)/c++98-luabins.o $(OBJDIR)/c++98-luainternals.o $(OBJDIR)/c++98-lualess.o $(OBJDIR)/c++98-save.o $(OBJDIR)/c++98-savebuffer.o $(OBJDIR)/c++98-write.o
$(OBJDIR)/c++98-fwrite.o: src/fwrite.c src/luaheaders.h src/fwrite.h \
src/saveload.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/fwrite.c
$(OBJDIR)/c++98-load.o: src/load.c src/luaheaders.h src/luabins.h \
src/saveload.h src/luainternals.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/load.c
$(OBJDIR)/c++98-luabins.o: src/luabins.c src/luaheaders.h src/luabins.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/luabins.c
$(OBJDIR)/c++98-luainternals.o: src/luainternals.c src/luainternals.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/luainternals.c
$(OBJDIR)/c++98-lualess.o: src/lualess.c
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/lualess.c
$(OBJDIR)/c++98-save.o: src/save.c src/luaheaders.h src/luabins.h \
src/saveload.h src/savebuffer.h src/write.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/save.c
$(OBJDIR)/c++98-savebuffer.o: src/savebuffer.c src/luaheaders.h \
src/saveload.h src/savebuffer.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/savebuffer.c
$(OBJDIR)/c++98-write.o: src/write.c src/luaheaders.h src/write.h \
src/saveload.h src/savebuffer.h
$(CXX) $(CFLAGS) -Werror -Wall -Wextra -pedantic -x c++ -std=c++98 -o $@ -c src/write.c
## END OF GENERATED TARGETS ###################################################
.PHONY: all clean install cleanlibs cleanobjects test resettest cleantest testc89 lua-testsc89 c-testsc89 resettestc89 cleantestc89 cleantestobjectsc89 cleanlibsc89 cleanobjectsc89 testc99 lua-testsc99 c-testsc99 resettestc99 cleantestc99 cleantestobjectsc99 cleanlibsc99 cleanobjectsc99 testc++98 lua-testsc++98 c-testsc++98 resettestc++98 cleantestc++98 cleantestobjectsc++98 cleanlibsc++98 cleanobjectsc++98

112
vendor/luabins/README.md vendored Normal file
View file

@ -0,0 +1,112 @@
luabins — Lua Binary Serialization Library
==========================================
Allows to save tuples of primitive Lua types into binary chunks
and to load saved data back.
On serialization
----------------
### Luabins works with
* `nil`
* `boolean`
* `number`
* `string`
* `table` (see below)
### Luabins refuses to save
* `function`
* `thread`
* `userdata`
Luabins intentionally does not save or check any meta-information
(versions, endianness etc.) along with data. If needed, it is to be handled
elsewhere.
### Table serialization
1. Metatatables are ignored.
2. Table nesting depth should be no more than `LUABINS_MAXTABLENESTING`.
3. On table save references are not honored. Each encountered reference
becomes independent object on load:
local t = { 42 }
{ t, t }
becomes
{ { 42 }, { 42 } }
that is, three separate tables instead of two.
Lua API
-------
* `luabins.save(...)`
Saves arguments into a binary string.
* On success returns that string.
* On failure returns nil and error message.
Example:
local str = assert(luabins.save(1, "two", { "three", 4 }))
* `luabins.load(string)`
Loads a list of values from a binary string.
* On success returns true and loaded values.
* On failure returns nil and error message.
Example:
If you do not know in advance what data is stored inside a binary string,
you may put results into a table:
local values = { luabins.load(data) }
assert(values[1], values[2])
If you know how to handle stored values (for example you're sure they were
generated following some established protocol), you may want to use
something like this function to check `luabins.load()` result:
function eat_true(t, ...)
assert(t, ...)
return ...
end
my_value_handler(eat_true(luabins.load(data)))
C API
-----
* `int luabins_save(lua_State * L, int index_from, int index_to)`
Save Lua values from given state at given stack index range.
Lua value is left untouched. Note that empty range is not an error.
You may save from 0 to `LUABINS_MAXTUPLE` values.
Note only real non-negative indices work.
* On success returns 0, pushes saved data as a string on the top of stack.
* On failure returns non-zero, pushes error message on the top
of the stack.
* `int luabins_load(lua_State * L, const unsigned char * data,
size_t len, int *count)`
Load Lua values from given byte chunk.
* On success returns 0, pushes loaded values on stack.
Sets count to the number of values pushed.
Note that to have zero loaded items is a valid scenario.
* On failure returns non-zero, pushes error message on the top
of the stack.
Luabins is still an experimental volatile software.
Please see source code for more documentation.
See the copyright information in the file named `COPYRIGHT`.

11
vendor/luabins/TODO vendored Normal file
View file

@ -0,0 +1,11 @@
-- Add key-value size-less table format (see luatexts)
-- Add utf-8 char-length string format (see luatexts)
-- Add autotest targets for LuaJIT and LuaJIT 2 x86, x86_64, both for Lua and C.
-- Test on Lua with custom allocator.
-- Use Makefile in rockspec?
-- Enhance "corrupt data" message on load. Need more info on what is wrong.
Ensure every case is covered with tests.
-- Autocompact integers (especially strings -- most of them do not need size_t!)
-- Better cover new exponential growth strategy corner-cases with tests.
-- Shouldn't write and fwrite have common codebase?
-- Document write.h and fwrite.h

View file

@ -0,0 +1,242 @@
@{define:projectname:luabins}
@{define:test-dir:test/}
@{define:source-dir:src/}
@{define:sharedlib:$(LIBDIR)/$(SONAME)}
@{define:staticlib:$(LIBDIR)/$(ANAME)}
@{define-table:release-info:
{suffix="";
libdir="$(LIBDIR)";objprefix="$(OBJDIR)/";
cflags="";
CC="$(CC)";
LD="$(LD)";
};
}
@{define-table:std-info:
{suffix="c89";
libdir="$(TMPDIR)/c89";objprefix="$(OBJDIR)/c89-";
cflags="-Werror -Wall -Wextra -pedantic -x c -std=c89";
CC="$(CC)";
LD="$(LD)";
};
{suffix="c99";
libdir="$(TMPDIR)/c99";objprefix="$(OBJDIR)/c99-";
cflags="-Werror -Wall -Wextra -pedantic -x c -std=c99";
CC="$(CC)";
LD="$(LD)";
};
{suffix="c++98";
libdir="$(TMPDIR)/c++98";objprefix="$(OBJDIR)/c++98-";
cflags="-Werror -Wall -Wextra -pedantic -x c++ -std=c++98";
CC="$(CXX)";
LD="$(LDXX)";
};
}
@{define-dep:dep-objects:dep-template::@{source-dir}}
@{define-dep:test-dep-objects:test-dep-template:-I@{source-dir}:@{test-dir}}
## CONFIGURATION ##############################################################
ifeq ($(shell uname),Darwin)
LUA_DIR := /usr/local
LUA_LIBDIR := $(LUA_DIR)/lib/lua/5.1
LUA_INCDIR := $(LUA_DIR)/include
LUALIB := lua
else
# Assuming Ubuntu
LUA_LIBDIR := /usr/lib
LUA_INCDIR := /usr/include/lua5.1
LUALIB := lua5.1
endif
PROJECTNAME := @{projectname}
SONAME := $(PROJECTNAME).so
ANAME := lib$(PROJECTNAME).a
HNAME := $(PROJECTNAME).h
TESTNAME := $(PROJECTNAME)-test
TESTLUA := test.lua
LUA := lua
CP := cp
RM := rm -f
RMDIR := rm -df
MKDIR := mkdir -p
CC := gcc
LD := gcc
AR := ar rcu
RANLIB := ranlib
ECHO := @echo
TOUCH := touch
# Needed for tests only
CXX := g++
LDXX := g++
OBJDIR := ./obj
TMPDIR := ./tmp
INCDIR := ./include
LIBDIR := ./lib
HFILE := $(INCDIR)/$(HNAME)
CFLAGS += -O2 -Wall -I$(LUA_INCDIR)
LDFLAGS += -L$(LUA_LIBDIR)
# Tested on OS X and Ubuntu
SOFLAGS :=
ifeq ($(shell uname),Darwin)
SOFLAGS += -dynamiclib -undefined dynamic_lookup
else
CFLAGS += -fPIC
SOFLAGS += -shared
LDFLAGS += -ldl
RMDIR := rm -rf
endif
CFLAGS += $(MYCFLAGS)
LDFLAGS += $(MYLDFLAGS)
## MAIN TARGETS ###############################################################
@{define-table:.PHONY:}
@{insert:.PHONY:all}
all: @{sharedlib} @{staticlib} $(HFILE)
@{insert:.PHONY:clean}
clean: cleanlibs cleantest
$(RM) $(HFILE)
@{insert:.PHONY:install}
install: @{sharedlib}
# Note header and static library are not copied anywhere
$(CP) @{sharedlib} $(LUA_LIBDIR)/$(SONAME)
$(HFILE):
$(CP) src/$(HNAME) $(HFILE)
@{--:-------------------------------------------------------------------------}
@{define:objects-macro:
@{insert:.PHONY:clean%<prefix>objects@{suffix}}
clean%<prefix>objects@{suffix}:
$(RM) %<objects>
%<dep>
}
@{define:lib-targets:
@{define-fill:objects:@{fill-template:@{dep-objects}:}}
@{insert:.PHONY:cleanlibs@{suffix}}
cleanlibs@{suffix}: cleanobjects@{suffix}
$(RM) @{sharedlib}
$(RM) @{staticlib}
@{sharedlib}: @{objects}
$(MKDIR) @{libdir}
@{LD} -o $@ @{objects} $(LDFLAGS) $(SOFLAGS)
@{staticlib}: @{objects}
$(MKDIR) @{libdir}
$(AR) $@ @{objects}
$(RANLIB) $@
@{--: note implicit objprefix parameter }
# objects@{suffix}:
@{fill-macro:objects-macro:%<>:
prefix="",
objects=@{lua-escape:@{objects}};
dep=@{lua-escape:@{fill-template:dep-template:}};
}
}
@{define:std-targets:
## ----- Begin @{suffix} -----
@{define-fill:cflags-orig:@{cflags}}
@{define-fill:cflags:@{cflags} -I@{source-dir}}
@{define-fill:sharedlib:@{libdir}/$(SONAME)}
@{define-fill:staticlib:@{libdir}/$(ANAME)}
@{define-fill:objects:@{fill-template:@{test-dep-objects}:}}
@{insert:.PHONY:test@{suffix}}
test@{suffix}: lua-tests@{suffix} c-tests@{suffix}
@{insert:.PHONY:lua-tests@{suffix}}
lua-tests@{suffix}: @{libdir}/.luatestspassed
@{insert:.PHONY:c-tests@{suffix}}
c-tests@{suffix}: @{libdir}/.ctestspassed
@{libdir}/.luatestspassed: @{sharedlib} test/$(TESTLUA)
$(ECHO) "===== Running Lua tests for @{suffix} ====="
@$(LUA) \
-e "package.cpath='@{sharedlib};'..package.cpath" \
test/$(TESTLUA)
$(TOUCH) @{libdir}/.luatestspassed
$(ECHO) "===== Lua tests for @{suffix} PASSED ====="
@{libdir}/.ctestspassed: @{libdir}/$(TESTNAME) test/$(TESTLUA)
$(ECHO) "===== Running C tests for @{suffix} ====="
@{libdir}/$(TESTNAME)
$(TOUCH) @{libdir}/.ctestspassed
$(ECHO) "===== C tests for @{suffix} PASSED ====="
@{libdir}/$(TESTNAME): @{objects} @{staticlib}
$(MKDIR) @{libdir}
@{LD} -o $@ @{objects} $(LDFLAGS) -lm -l$(LUALIB) -l$(PROJECTNAME) -L@{libdir}
@{insert:.PHONY:resettest@{suffix}}
resettest@{suffix}:
$(RM) @{libdir}/.luatestspassed
$(RM) @{libdir}/.ctestspassed
@{insert:.PHONY:cleantest@{suffix}}
cleantest@{suffix}: cleanlibs@{suffix} resettest@{suffix} \
cleantestobjects@{suffix}
$(RM) @{libdir}/$(TESTNAME)
$(RMDIR) @{libdir}
@{--: Note implicit objprefix parameter }
# testobjects@{suffix}:
@{fill-macro:objects-macro:%<>:
prefix="test",
objects=@{lua-escape:@{objects}};
dep=@{lua-escape:@{fill-template:test-dep-template:}};
}
@{--: Libraries must use original cflags }
@{fill-template:lib-targets:cflags=@{lua-escape:@{cflags-orig}}}
}
## GENERATED RELEASE TARGETS ##################################################
@{map-template:release-info:lib-targets}
## TEST TARGETS ###############################################################
@{insert:.PHONY:test}
test:@{map-template:std-info: test@{suffix}}
$(ECHO) "===== TESTS PASSED ====="
@{insert:.PHONY:resettest}
resettest:@{map-template:std-info: resettest@{suffix}}
@{insert:.PHONY:cleantest}
cleantest:@{map-template:std-info: cleantest@{suffix}}
## GENERATED TEST TARGETS #####################################################
@{map-template:std-info:std-targets}
## END OF GENERATED TARGETS ###################################################
.PHONY: @{concat:.PHONY: }

106
vendor/luabins/etc/benchmark.lua vendored Normal file
View file

@ -0,0 +1,106 @@
-- This benchmark is compatible with luamarca benchmarking system
-- http://github.com/agladysh/luamarca
package.cpath = "./?.so;"..package.cpath
local luabins = require("luabins")
local table_concat = table.concat
local loadstring, assert = loadstring, assert
local pairs, type, tostring = pairs, type, tostring
local luabins_save, luabins_load = luabins.save, luabins.load
local lua = ([[return {
true, false, 42, "string",
[{
true, false, 42, "string",
[true] = true, [false] = false, [42] = 42, string = "string"
}] =
{
true, false, 42, "string",
[true] = true, [false] = false, [42] = 42, string = "string"
}
}]]):gsub("[%s\n]+", "") -- Remove spaces for compactness
local data = assert(loadstring(lua))()
local saved = assert(luabins_save(data))
-- Imagine we know exact data structure.
-- We still impose some overhead on table.concat() related
-- stuff, since it is more realistic scenario.
-- Still looks a bit silly.
local concat = function(data)
local buf = {}
local function cat(v) buf[#buf + 1] = tostring(v) return cat end
-- Find table key
local tablekey, tableval
for k, v in pairs(data) do
if type(k) == "table" then
tablekey, tableval = k, v
break
end
end
cat 'return{'
cat (data[1]) ','
cat (data[2]) ','
cat (data[3]) ','
cat '"' (data[4]) '",'
cat '[{'
cat (tablekey[1]) ','
cat (tablekey[2]) ','
cat (tablekey[3]) ','
cat '"' (tablekey[4]) '",'
cat '[' (true) ']=' (tablekey[true]) ','
cat '[' (false) ']=' (tablekey[false]) ','
cat '[' (42) ']=' (tablekey[42]) ','
cat 'string' '=' '"' (tablekey["string"]) '"'
cat '}]='
cat '{'
cat (tablekey[1]) ','
cat (tablekey[2]) ','
cat (tablekey[3]) ','
cat '"' (tablekey[4]) '",'
cat '[' (true) ']=' (tablekey[true]) ','
cat '[' (false) ']=' (tablekey[false]) ','
cat '[' (42) ']=' (tablekey[42]) ','
cat 'string' '=' '"' (tablekey["string"]) '"'
cat '}'
cat '}'
return table_concat(buf, '')
end
-- Sanity check
assert(concat(data) == lua)
local bench = {}
bench.concat = function()
assert(concat(data))
end
bench.loadstring = function()
assert(loadstring(lua))()
end
bench.luabins_save = function()
assert(luabins_save(data))
end
bench.luabins_load = function()
assert(luabins_load(saved))
end
return bench

30
vendor/luabins/etc/checkfmt.lua vendored Normal file
View file

@ -0,0 +1,30 @@
--- Luabins format checker
package.cpath = "./lib/?.so;"..package.cpath
local luabins = require("luabins")
local luabins_save, luabins_load = luabins.save, luabins.load
local filename = select(1, ...)
assert(filename, "Usage: lua checkfmt.lua <out_filename>")
local file
if filename == "-" then
file = io.stdin
else
file = assert(io.open(filename, "r"))
end
assert(
luabins_load(
file:read("*a")
)
)
if file ~= io.stdin then
file:close()
end
file = nil
print("OK")

90
vendor/luabins/etc/dataset.lua vendored Normal file
View file

@ -0,0 +1,90 @@
-- Random Luabins dataset generator
package.cpath = "./lib/?.so;"..package.cpath
local luabins = require("luabins")
local luabins_save, luabins_load = luabins.save, luabins.load
math.randomseed(123456)
-- TODO: Generalize. Copy-paste from test.lua
local function gen_random_dataset(num, nesting)
num = num or math.random(0, 128)
nesting = nesting or 1
local gen_str = function()
local t = {}
local n = math.random(0, 1024)
for i = 1, n do
t[i] = string.char(math.random(0, 255))
end
return table.concat(t)
end
local gen_bool = function() return math.random() >= 0.5 end
local gen_nil = function() return nil end
local generators =
{
gen_nil;
gen_nil;
gen_nil;
gen_bool;
gen_bool;
gen_bool;
function() return math.random() end;
function() return math.random(-10000, 10000) end;
function() return math.random() * math.random(-10000, 10000) end;
gen_str;
gen_str;
gen_str;
function()
if nesting >= 24 then
return nil
end
local t = {}
local n = math.random(0, 24 - nesting)
for i = 1, n do
local k = gen_random_dataset(1, nesting + 1)
if k == nil then
k = "(nil)"
end
t[ k ] = gen_random_dataset(
1,
nesting + 1
)
end
return t
end;
}
local t = {}
for i = 1, num do
local n = math.random(1, #generators)
t[i] = generators[n]()
end
return unpack(t, 0, num)
end
local saved = assert(luabins_save(gen_random_dataset()))
local filename = select(1, ...)
assert(filename, "Usage: lua dataset.lua <out_filename>")
local file
if filename == "-" then
file = io.stdout
else
file = assert(io.open(filename, "w"))
end
file:write(saved)
if file ~= io.stdout then
file:close()
end
file = nil

2
vendor/luabins/etc/genmakefile.sh vendored Executable file
View file

@ -0,0 +1,2 @@
#! /bin/bash
lua ~/projects/genmakefile/src/genmakefile.lua <etc/Makefile.luabins.template >Makefile

39
vendor/luabins/etc/tolua.lua vendored Normal file
View file

@ -0,0 +1,39 @@
-- Luabins to Lua converter
-- Requires lua-nucleo (http://github.com/lua-nucleo/lua-nucleo/)
package.cpath = "./lib/?.so;"..package.cpath
local luabins = require 'luabins'
dofile('lua-nucleo/strict.lua')
dofile('lua-nucleo/import.lua')
local tserialize = import 'lua-nucleo/tserialize.lua' { 'tserialize' }
local filename = select(1, ...)
assert(filename, "Usage: lua tolua.lua <out_filename>")
local file
if filename == "-" then
file = io.stdin
else
file = assert(io.open(filename, "r"))
end
io.write(
tserialize(
assert(
luabins.load(
file:read("*a")
)
)
)
)
io:flush()
if file ~= io.stdin then
file:close()
end
file = nil

16
vendor/luabins/etc/toluabins.lua vendored Normal file
View file

@ -0,0 +1,16 @@
-- Lua to Luabins converter
package.cpath = "./lib/?.so;"..package.cpath
local luabins = require 'luabins'
local filename = select(1, ...)
assert(filename, "Usage: lua toluabins.lua <out_filename>")
io.write(
luabins.save(
assert(loadfile(filename))()
)
)
io:flush()

0
vendor/luabins/include/.keepme vendored Normal file
View file

0
vendor/luabins/lib/.keepme vendored Normal file
View file

0
vendor/luabins/obj/.keepme vendored Normal file
View file

View file

@ -0,0 +1,19 @@
package = "luabins"
version = "0.1.1-1"
source = {
url = "http://cloud.github.com/downloads/agladysh/luabins/luabins-0.1.1.tar.gz"
}
description = {
summary = "Trivial Lua Binary Serialization Library",
detailed = [[
Luabins allows to save tuples of primitive Lua types into binary chunks and to load saved data back.
]],
homepage = "http://github.com/agladysh/luabins",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "make"
}

View file

@ -0,0 +1,32 @@
package = "luabins"
version = "0.1.1-2"
source = {
url = "http://cloud.github.com/downloads/agladysh/luabins/luabins-0.1.1.tar.gz"
}
description = {
summary = "Trivial Lua Binary Serialization Library",
detailed = [[
Luabins allows to save tuples of primitive Lua types into binary chunks and to load saved data back.
]],
homepage = "http://github.com/agladysh/luabins",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
luabins = {
sources = {
"src/load.c",
"src/luabins.c",
"src/luainternals.c",
"src/save.c"
},
incdirs = {
"src/"
}
}
}
}

View file

@ -0,0 +1,35 @@
package = "luabins"
version = "0.2-1"
source = {
url = "http://cloud.github.com/downloads/agladysh/luabins/luabins-0.2.tar.gz"
}
description = {
summary = "Trivial Lua Binary Serialization Library",
detailed = [[
Luabins allows to save tuples of primitive Lua types into binary chunks and to load saved data back.
]],
homepage = "http://github.com/agladysh/luabins",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
luabins = {
sources = {
"src/load.c",
"src/luabins.c",
"src/luainternals.c",
"src/lualess.c",
"src/save.c",
"src/savebuffer.c",
"src/write.c"
},
incdirs = {
"src/"
}
}
}
}

View file

@ -0,0 +1,35 @@
package = "luabins"
version = "0.3-1"
source = {
url = "http://cloud.github.com/downloads/agladysh/luabins/luabins-0.3.tar.gz"
}
description = {
summary = "Trivial Lua Binary Serialization Library",
detailed = [[
Luabins allows to save tuples of primitive Lua types into binary chunks and to load saved data back.
]],
homepage = "http://github.com/agladysh/luabins",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
luabins = {
sources = {
"src/load.c",
"src/luabins.c",
"src/luainternals.c",
"src/lualess.c",
"src/save.c",
"src/savebuffer.c",
"src/write.c"
},
incdirs = {
"src/"
}
}
}
}

View file

@ -0,0 +1,32 @@
package = "luabins"
version = "scm-1"
source = {
url = "git://github.com/agladysh/luabins.git"
}
description = {
summary = "Trivial Lua Binary Serialization Library",
detailed = [[
Luabins allows to save tuples of primitive Lua types into binary chunks and to load saved data back.
]],
homepage = "http://github.com/agladysh/luabins",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
luabins = {
sources = {
"src/load.c",
"src/luabins.c",
"src/luainternals.c",
"src/save.c"
},
incdirs = {
"src/"
}
}
}
}

View file

@ -0,0 +1,35 @@
package = "luabins"
version = "scm-2"
source = {
url = "git://github.com/agladysh/luabins.git"
}
description = {
summary = "Trivial Lua Binary Serialization Library",
detailed = [[
Luabins allows to save tuples of primitive Lua types into binary chunks and to load saved data back.
]],
homepage = "http://github.com/agladysh/luabins",
license = "MIT/X11"
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
luabins = {
sources = {
"src/load.c",
"src/luabins.c",
"src/luainternals.c",
"src/lualess.c",
"src/save.c",
"src/savebuffer.c",
"src/write.c"
},
incdirs = {
"src/"
}
}
}
}

49
vendor/luabins/src/fwrite.c vendored Normal file
View file

@ -0,0 +1,49 @@
/*
* fwrite.c
* Luabins Lua-less write API using FILE * as buffer
* See copyright notice in luabins.h
*/
#include "luaheaders.h"
#include "fwrite.h"
/* TODO: Note that stream errors are ignored. Handle them better? */
void lbs_fwriteTableHeader(
FILE * f,
int array_size,
int hash_size
)
{
fputc(LUABINS_CTABLE, f);
fwrite(
(const unsigned char *)&array_size,
LUABINS_LINT,
1,
f
);
fwrite(
(const unsigned char *)&hash_size,
LUABINS_LINT,
1,
f
);
}
void lbs_fwriteNumber(FILE * f, lua_Number value)
{
fputc(LUABINS_CNUMBER, f);
fwrite((const unsigned char *)&value, LUABINS_LNUMBER, 1, f);
}
void lbs_fwriteString(
FILE * f,
const char * value,
size_t length
)
{
fputc(LUABINS_CSTRING, f);
fwrite((const unsigned char *)&length, LUABINS_LSIZET, 1, f);
fwrite((const unsigned char *)value, length, 1, f);
}

37
vendor/luabins/src/fwrite.h vendored Normal file
View file

@ -0,0 +1,37 @@
/*
* fwrite.h
* Luabins Lua-less write API using FILE * as buffer
* See copyright notice in luabins.h
*/
#ifndef LUABINS_FWRITE_H_INCLUDED_
#define LUABINS_FWRITE_H_INCLUDED_
#include "saveload.h"
#define lbs_fwriteTupleSize(f, tuple_size) \
fputc((int)(tuple_size), (f))
void lbs_fwriteTableHeader(
FILE * f,
int array_size,
int hash_size
);
#define lbs_fwriteNil(f) \
fputc(LUABINS_CNIL, (f))
#define lbs_fwriteBoolean(f, value) \
fputc(((value) == 0) ? LUABINS_CFALSE : LUABINS_CTRUE, (f))
void lbs_fwriteNumber(FILE * f, lua_Number value);
#define lbs_fwriteInteger lbs_fwriteNumber
void lbs_fwriteString(
FILE * f,
const char * value,
size_t length
);
#endif /* LUABINS_FWRITE_H_INCLUDED_ */

367
vendor/luabins/src/load.c vendored Normal file
View file