diff --git a/bindings/Lua/Makefile b/bindings/Lua/Makefile index ca4ec45..7202420 100644 --- a/bindings/Lua/Makefile +++ b/bindings/Lua/Makefile @@ -1,8 +1,10 @@ # Makefile for Judger's lua binding -CC = gcc -CFLAGS = -Wall -Werror -O3 -std=c99 -fPIC -LDFLAGS ?= -pthread -lseccomp -fPIC -shared +CC = gcc +LDFLAGS ?= -pthread -lseccomp -fPIC -shared +LUAVER ?= 5.1 +LUAVERPURE ?= $(subst .,,${LUAVER}) +CFLAGS ?= -Wall -Werror -O3 -std=c99 -fPIC -I/usr/include/lua${LUAVER} -DLUA${LUAVERPURE} JUDGER_OBJECTS = child.o killer.o logger.o runner.o rules/c_cpp.o rules/general.o OBJECTS = $(addprefix ../../src/,${JUDGER_OBJECTS}) judger.o @@ -15,8 +17,8 @@ judger.so: ${OBJECTS} ${CC} ${OBJECTS} ${LDFLAGS} -o judger.so install: all - @mkdir -p /usr/local/lib/lua/5.3/ - @cp -f judger.so /usr/local/lib/lua/5.3/ + @mkdir -p /usr/local/lib/lua/${LUAVER}/ + @cp -f judger.so /usr/local/lib/lua/${LUAVER}/ clean: @rm -f ${OBJECTS} judger.so diff --git a/bindings/Lua/judger.c b/bindings/Lua/judger.c index 01304a4..f3801ac 100644 --- a/bindings/Lua/judger.c +++ b/bindings/Lua/judger.c @@ -18,8 +18,8 @@ Usage: #include #include -#include -#include +#include +#include #include "../../src/runner.h" typedef struct ConfItem { @@ -27,27 +27,27 @@ typedef struct ConfItem { int value; } ConfItem; static ConfItem conf_item[] = { - {"VERSION", VERSION}, - {"UNLIMITED", UNLIMITED}, - {"RESULT_WRONG_ANSWER", WRONG_ANSWER}, - {"RESULT_SUCCESS", SUCCESS}, - {"RESULT_CPU_TIME_LIMIT_EXCEEDED", CPU_TIME_LIMIT_EXCEEDED}, - {"RESULT_REAL_TIME_LIMIT_EXCEEDED", REAL_TIME_LIMIT_EXCEEDED}, - {"RESULT_MEMORY_LIMIT_EXCEEDED", MEMORY_LIMIT_EXCEEDED}, - {"RESULT_RUNTIME_ERROR", RUNTIME_ERROR}, - {"RESULT_SYSTEM_ERROR", SYSTEM_ERROR}, - {"ERROR_INVALID_CONFIG", INVALID_CONFIG}, - {"ERROR_FORK_FAILED", FORK_FAILED}, + {"_VERSION", VERSION}, + {"_UNLIMITED", UNLIMITED}, + {"_RESULT_WRONG_ANSWER", WRONG_ANSWER}, + {"_RESULT_SUCCESS", SUCCESS}, + {"_RESULT_CPU_TIME_LIMIT_EXCEEDED", CPU_TIME_LIMIT_EXCEEDED}, + {"_RESULT_REAL_TIME_LIMIT_EXCEEDED", REAL_TIME_LIMIT_EXCEEDED}, + {"_RESULT_MEMORY_LIMIT_EXCEEDED", MEMORY_LIMIT_EXCEEDED}, + {"_RESULT_RUNTIME_ERROR", RUNTIME_ERROR}, + {"_RESULT_SYSTEM_ERROR", SYSTEM_ERROR}, + {"_ERROR_INVALID_CONFIG", INVALID_CONFIG}, + {"_ERROR_FORK_FAILED", FORK_FAILED}, - {"ERROR_PTHREAD_FAILED", PTHREAD_FAILED}, - {"ERROR_WAIT_FAILED", WAIT_FAILED}, - {"ERROR_ROOT_REQUIRED", ROOT_REQUIRED}, - {"ERROR_LOAD_SECCOMP_FAILED", LOAD_SECCOMP_FAILED}, - {"ERROR_SETRLIMIT_FAILED", SETRLIMIT_FAILED}, - {"ERROR_DUP2_FAILED", DUP2_FAILED}, - {"ERROR_SETUID_FAILED", SETUID_FAILED}, - {"ERROR_EXECVE_FAILED", EXECVE_FAILED}, - {"ERROR_SPJ_ERROR", SPJ_ERROR} + {"_ERROR_PTHREAD_FAILED", PTHREAD_FAILED}, + {"_ERROR_WAIT_FAILED", WAIT_FAILED}, + {"_ERROR_ROOT_REQUIRED", ROOT_REQUIRED}, + {"_ERROR_LOAD_SECCOMP_FAILED", LOAD_SECCOMP_FAILED}, + {"_ERROR_SETRLIMIT_FAILED", SETRLIMIT_FAILED}, + {"_ERROR_DUP2_FAILED", DUP2_FAILED}, + {"_ERROR_SETUID_FAILED", SETUID_FAILED}, + {"_ERROR_EXECVE_FAILED", EXECVE_FAILED}, + {"_ERROR_SPJ_ERROR", SPJ_ERROR} }; static const int conf_item_size = sizeof(conf_item) / sizeof(ConfItem); @@ -75,11 +75,9 @@ static ArgMask arg_mask[] = { }; static const int arg_mask_size = sizeof(arg_mask) / sizeof(ArgMask); -static int global_getconfig(lua_State* L); static int global_judge(lua_State* L); static const struct luaL_Reg judger[] = { - {"getconfig", global_getconfig}, {"run", global_judge}, {NULL, NULL} }; @@ -91,20 +89,6 @@ static char* _strdup(const char* s) { return t; } -static int global_getconfig(lua_State* L) { - int i = 0; - - lua_createtable(L, 0, conf_item_size); - for (; i < conf_item_size; ++i) { - lua_pushstring(L, conf_item[i].name); - lua_pushnumber(L, conf_item[i].value); - lua_rawset(L, -3); - } - assert(lua_gettop(L) == 1 && lua_type(L, -1) == LUA_TTABLE); //One table left - - return 1; -} - static void destory_config(struct config* config) { int i = 0; @@ -218,6 +202,19 @@ static int global_judge(lua_State* L) { int luaopen_judger(lua_State* L) { + int i = 0; + +#ifdef LUA51 + luaL_register(L, "judger", judger); +#else luaL_newlib(L, judger); +#endif + + for (; i < conf_item_size; ++i) { + lua_pushstring(L, conf_item[i].name); + lua_pushnumber(L, conf_item[i].value); + lua_rawset(L, -3); + } + return 1; }