From 46f9bcb90c13c20edb126b332daccc059375a7fe Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Fri, 5 Nov 2021 22:42:52 +0800 Subject: [PATCH 01/15] fix lite_xl_plugin_api.h This fixes a longstanding bug with the plugin API. This commit is not complete, further polish is still needed. --- resources/lite_xl_plugin_api.h | 806 ++++++++++++++++++++------------- scripts/README.md | 1 + scripts/generate_header.sh | 94 ++++ 3 files changed, 592 insertions(+), 309 deletions(-) create mode 100755 scripts/generate_header.sh diff --git a/resources/lite_xl_plugin_api.h b/resources/lite_xl_plugin_api.h index 44c1b4d3..fbef3502 100644 --- a/resources/lite_xl_plugin_api.h +++ b/resources/lite_xl_plugin_api.h @@ -1,97 +1,372 @@ -#ifndef LITE_XL_PLUGIN_API -#define LITE_XL_PLUGIN_API -/* +/** The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long as it has an entrypoint that looks like the following, where xxxxx is the plugin name: - #include "lite_xl_plugin_api.h" - int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) { lite_xl_plugin_init(XL); ... return 1; } - In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple! Due to the way the API is structured, you *should not* link or include lua libraries. - This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY. -#!/bin/sh -echo "#ifndef LITE_XL_PLUGIN_API" -echo "#define LITE_XL_PLUGIN_API" -echo "/* " -echo "The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long" -echo "as it has an entrypoint that looks like the following, where xxxxx is the plugin name:" -echo -echo '#include "lite_xl_plugin_api.h"' -echo -echo "int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {" -echo " lite_xl_plugin_init(XL);" -echo " ..." -echo " return 1;" -echo "}" -echo -echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" -echo "Due to the way the API is structured, you *should not* link or include lua libraries." -echo -echo "This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY." -echo -echo -cat $0 -echo "*""/" -echo "#include " -echo "typedef struct lua_State lua_State; typedef double lua_Number; typedef int (*lua_CFunction)(lua_State*); typedef ptrdiff_t lua_Integer;" -echo "typedef unsigned long lua_Unsigned; typedef struct luaL_Buffer luaL_Buffer; typedef struct luaL_Reg luaL_Reg; typedef struct lua_Debug lua_Debug;" -echo "typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);" -echo "typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);" -echo "typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud);" -LUA_HEADERS=`pkg-config --cflags lua5.2 | sed 's/^-I//' | sed 's/$/\/*.h/'` -grep -h "^LUA\(LIB\)*_API" $LUA_HEADERS | sed "s/LUA\(LIB\)*_API //" | sed "s/(lua/(*lua/" | grep -v ",\s*$" | sed "s/^/static /" -grep -h "#define luaL*_" $LUA_HEADERS | grep -v "\\\s*$" | grep -v "\(assert\|lock\)" | grep -v "\(asm\|int32\)" | grep -v "#define lua_number2integer(i,n)\s*lua_number2int(i, n)" -echo "#define lua_pushliteral(L, s) lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)" -echo "#define lua_pushglobaltable(L) lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)" -echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*)(__VA_ARGS__))symbol(#name)" -echo "static void lite_xl_plugin_init(void* XL) {" -echo "\tvoid* (*symbol)(const char*) = (void* (*)(const char*))XL;" -grep -h "^LUA\(LIB\)*_API" $LUA_HEADERS | sed "s/LUA\(LIB\)*_API //" | sed "s/(lua/(*lua/" | grep -v ",\s*$" | sed "s/^\([^)]*\)(\*\(lua\w*\))\s*(/\tIMPORT_SYMBOL(\2, \1,/" +#!/bin/bash + +# https://stackoverflow.com/a/13062682 +uncomment() { + [ $# -eq 2 ] && arg="$1" || arg="" + eval file="\$$#" + sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" | \ + gcc -P -E $arg - | \ + sed 's/aC/#/g; s/aB/__/g; s/aA/a/g' +} + +# this is the magic that turns multiline statements into +# single line statements +# LITERALLY DOES NOT WORK WITH PREPROCESSOR +onelineize() { + grep -v '^#' | sed -e ':r;$!{N;br};s/\([^{;]\)\n\s*/\1 /g' +} + +discard_preprocessors() { + grep -v '#\(include\|if\|endif\)' +} + +# sed regex for extracting data from function signature +# if this isn't regex, idk what is +# LUA_API (return type as \2) (function name as \3) (args as \4) +sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\))' + +# get funcptr declarations +ptrize() { + grep '^LUA' | sed -e "s/$sym_regex/static \2(*\3) (\4)/" +} + +export_sym() { + # don't even bother reading this again + grep '^LUA' | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4)/" +} + +decl() { + header="$(uncomment $1 | discard_preprocessors)" + header1="$(onelineize <<< "$header")" + + # typedef + grep -v '^\(LUA\|#\|extern\)' <<< "$header1" + # funcptrs + ptrize <<< "$header1" + # defines + grep '^#' <<< "$header" +} + +decl_export() { + uncomment $1 | onelineize | export_sym +} + +LUA_PATH="$1" + +cat << EOF +/** +The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long +as it has an entrypoint that looks like the following, where xxxxx is the plugin name: +#include "lite_xl_plugin_api.h" +int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) { + lite_xl_plugin_init(XL); + ... + return 1; +} +In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple! +Due to the way the API is structured, you *should not* link or include lua libraries. +This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY. + + +EOF + +cat "$0" + +cat << EOF +**/ + + +#ifndef LITE_XL_PLUGIN_API +#define LITE_XL_PLUGIN_API +EOF + +decl "$LUA_PATH/lua.h" +decl "$LUA_PATH/lauxlib.h" + +echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" +echo "static void lite_xl_plugin_init(void *XL) {" +echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" + +decl_export "$LUA_PATH/lua.h" +decl_export "$LUA_PATH/lauxlib.h" + echo "}" echo "#endif" -*/ -#include -typedef struct lua_State lua_State; typedef double lua_Number; typedef int (*lua_CFunction)(lua_State*); typedef ptrdiff_t lua_Integer; -typedef unsigned long lua_Unsigned; typedef struct luaL_Buffer luaL_Buffer; typedef struct luaL_Reg luaL_Reg; typedef struct lua_Debug lua_Debug; -typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); -typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); +**/ + + +#ifndef LITE_XL_PLUGIN_API +#define LITE_XL_PLUGIN_API +typedef struct lua_State lua_State; +typedef int (*lua_CFunction) (lua_State *L); +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); +typedef LUA_NUMBER lua_Number; +typedef LUA_INTEGER lua_Integer; +typedef LUA_UNSIGNED lua_Unsigned; +typedef struct lua_Debug lua_Debug; +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); +struct lua_Debug { + int event; + const char *name; + const char *namewhat; + const char *what; + const char *source; + int currentline; + int linedefined; + int lastlinedefined; + unsigned char nups; + unsigned char nparams; + char isvararg; + char istailcall; + char short_src[LUA_IDSIZE]; + struct CallInfo *i_ci; +}; +static lua_State *(*lua_newstate) (lua_Alloc f, void *ud); +static void (*lua_close) (lua_State *L); +static lua_State *(*lua_newthread) (lua_State *L); +static lua_CFunction (*lua_atpanic) (lua_State *L, lua_CFunction panicf); +static const lua_Number *(*lua_version) (lua_State *L); +static int (*lua_absindex) (lua_State *L, int idx); +static int (*lua_gettop) (lua_State *L); +static void (*lua_settop) (lua_State *L, int idx); +static void (*lua_pushvalue) (lua_State *L, int idx); +static void (*lua_remove) (lua_State *L, int idx); +static void (*lua_insert) (lua_State *L, int idx); +static void (*lua_replace) (lua_State *L, int idx); +static void (*lua_copy) (lua_State *L, int fromidx, int toidx); +static int (*lua_checkstack) (lua_State *L, int sz); +static void (*lua_xmove) (lua_State *from, lua_State *to, int n); +static int (*lua_isnumber) (lua_State *L, int idx); +static int (*lua_isstring) (lua_State *L, int idx); +static int (*lua_iscfunction) (lua_State *L, int idx); +static int (*lua_isuserdata) (lua_State *L, int idx); +static int (*lua_type) (lua_State *L, int idx); +static const char *(*lua_typename) (lua_State *L, int tp); +static lua_Number (*lua_tonumberx) (lua_State *L, int idx, int *isnum); +static lua_Integer (*lua_tointegerx) (lua_State *L, int idx, int *isnum); +static lua_Unsigned (*lua_tounsignedx) (lua_State *L, int idx, int *isnum); +static int (*lua_toboolean) (lua_State *L, int idx); +static const char *(*lua_tolstring) (lua_State *L, int idx, size_t *len); +static size_t (*lua_rawlen) (lua_State *L, int idx); +static lua_CFunction (*lua_tocfunction) (lua_State *L, int idx); +static void *(*lua_touserdata) (lua_State *L, int idx); +static lua_State *(*lua_tothread) (lua_State *L, int idx); +static const void *(*lua_topointer) (lua_State *L, int idx); +static void (*lua_arith) (lua_State *L, int op); +static int (*lua_rawequal) (lua_State *L, int idx1, int idx2); +static int (*lua_compare) (lua_State *L, int idx1, int idx2, int op); +static void (*lua_pushnil) (lua_State *L); +static void (*lua_pushnumber) (lua_State *L, lua_Number n); +static void (*lua_pushinteger) (lua_State *L, lua_Integer n); +static void (*lua_pushunsigned) (lua_State *L, lua_Unsigned n); +static const char *(*lua_pushlstring) (lua_State *L, const char *s, size_t l); +static const char *(*lua_pushstring) (lua_State *L, const char *s); +static const char *(*lua_pushvfstring) (lua_State *L, const char *fmt, va_list argp); +static const char *(*lua_pushfstring) (lua_State *L, const char *fmt, ...); +static void (*lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +static void (*lua_pushboolean) (lua_State *L, int b); +static void (*lua_pushlightuserdata) (lua_State *L, void *p); +static int (*lua_pushthread) (lua_State *L); +static void (*lua_getglobal) (lua_State *L, const char *var); +static void (*lua_gettable) (lua_State *L, int idx); +static void (*lua_getfield) (lua_State *L, int idx, const char *k); +static void (*lua_rawget) (lua_State *L, int idx); +static void (*lua_rawgeti) (lua_State *L, int idx, int n); +static void (*lua_rawgetp) (lua_State *L, int idx, const void *p); +static void (*lua_createtable) (lua_State *L, int narr, int nrec); +static void *(*lua_newuserdata) (lua_State *L, size_t sz); +static int (*lua_getmetatable) (lua_State *L, int objindex); +static void (*lua_getuservalue) (lua_State *L, int idx); +static void (*lua_setglobal) (lua_State *L, const char *var); +static void (*lua_settable) (lua_State *L, int idx); +static void (*lua_setfield) (lua_State *L, int idx, const char *k); +static void (*lua_rawset) (lua_State *L, int idx); +static void (*lua_rawseti) (lua_State *L, int idx, int n); +static void (*lua_rawsetp) (lua_State *L, int idx, const void *p); +static int (*lua_setmetatable) (lua_State *L, int objindex); +static void (*lua_setuservalue) (lua_State *L, int idx); +static void (*lua_callk) (lua_State *L, int nargs, int nresults, int ctx, lua_CFunction k); +static int (*lua_getctx) (lua_State *L, int *ctx); +static int (*lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k); +static int (*lua_load) (lua_State *L, lua_Reader reader, void *dt, const char *chunkname, const char *mode); +static int (*lua_dump) (lua_State *L, lua_Writer writer, void *data); +static int (*lua_yieldk) (lua_State *L, int nresults, int ctx, lua_CFunction k); +static int (*lua_resume) (lua_State *L, lua_State *from, int narg); +static int (*lua_status) (lua_State *L); +static int (*lua_gc) (lua_State *L, int what, int data); +static int (*lua_error) (lua_State *L); +static int (*lua_next) (lua_State *L, int idx); +static void (*lua_concat) (lua_State *L, int n); +static void (*lua_len) (lua_State *L, int idx); +static lua_Alloc (*lua_getallocf) (lua_State *L, void **ud); +static void (*lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); +static int (*lua_getstack) (lua_State *L, int level, lua_Debug *ar); +static int (*lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); +static const char *(*lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); +static const char *(*lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); +static const char *(*lua_getupvalue) (lua_State *L, int funcindex, int n); +static const char *(*lua_setupvalue) (lua_State *L, int funcindex, int n); +static void *(*lua_upvalueid) (lua_State *L, int fidx, int n); +static void (*lua_upvaluejoin) (lua_State *L, int fidx1, int n1, int fidx2, int n2); +static int (*lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); +static lua_Hook (*lua_gethook) (lua_State *L); +static int (*lua_gethookmask) (lua_State *L); +static int (*lua_gethookcount) (lua_State *L); +#define lua_h +#define LUA_VERSION_MAJOR "5" +#define LUA_VERSION_MINOR "2" +#define LUA_VERSION_NUM 502 +#define LUA_VERSION_RELEASE "4" +#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE +#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2015 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" +#define LUA_SIGNATURE "\033Lua" +#define LUA_MULTRET (-1) +#define LUA_REGISTRYINDEX LUAI_FIRSTPSEUDOIDX +#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) +#define LUA_OK 0 +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRGCMM 5 +#define LUA_ERRERR 6 +#define LUA_TNONE (-1) +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 +#define LUA_NUMTAGS 9 +#define LUA_MINSTACK 20 +#define LUA_RIDX_MAINTHREAD 1 +#define LUA_RIDX_GLOBALS 2 +#define LUA_RIDX_LAST LUA_RIDX_GLOBALS +#define LUA_OPADD 0 +#define LUA_OPSUB 1 +#define LUA_OPMUL 2 +#define LUA_OPDIV 3 +#define LUA_OPMOD 4 +#define LUA_OPPOW 5 +#define LUA_OPUNM 6 +#define LUA_OPEQ 0 +#define LUA_OPLT 1 +#define LUA_OPLE 2 +#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL) +#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL) +#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 +#define LUA_GCSETMAJORINC 8 +#define LUA_GCISRUNNING 9 +#define LUA_GCGEN 10 +#define LUA_GCINC 11 +#define lua_tonumber(L,i) lua_tonumberx(L,i,NULL) +#define lua_tointeger(L,i) lua_tointegerx(L,i,NULL) +#define lua_tounsigned(L,i) lua_tounsignedx(L,i,NULL) +#define lua_pop(L,n) lua_settop(L, -(n)-1) +#define lua_newtable(L) lua_createtable(L, 0, 0) +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) +#define lua_pushliteral(L, s) lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) +#define lua_pushglobaltable(L) lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS) +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILCALL 4 +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; +typedef struct luaL_Buffer { + char *b; + size_t size; + size_t n; + lua_State *L; + char initb[LUAL_BUFFERSIZE]; +} luaL_Buffer; +typedef struct luaL_Stream { + FILE *f; + lua_CFunction closef; +} luaL_Stream; static void (*luaL_checkversion_) (lua_State *L, lua_Number ver); static int (*luaL_getmetafield) (lua_State *L, int obj, const char *e); static int (*luaL_callmeta) (lua_State *L, int obj, const char *e); static const char *(*luaL_tolstring) (lua_State *L, int idx, size_t *len); static int (*luaL_argerror) (lua_State *L, int numarg, const char *extramsg); +static const char *(*luaL_checklstring) (lua_State *L, int numArg, size_t *l); +static const char *(*luaL_optlstring) (lua_State *L, int numArg, const char *def, size_t *l); static lua_Number (*luaL_checknumber) (lua_State *L, int numArg); static lua_Number (*luaL_optnumber) (lua_State *L, int nArg, lua_Number def); static lua_Integer (*luaL_checkinteger) (lua_State *L, int numArg); +static lua_Integer (*luaL_optinteger) (lua_State *L, int nArg, lua_Integer def); static lua_Unsigned (*luaL_checkunsigned) (lua_State *L, int numArg); +static lua_Unsigned (*luaL_optunsigned) (lua_State *L, int numArg, lua_Unsigned def); static void (*luaL_checkstack) (lua_State *L, int sz, const char *msg); static void (*luaL_checktype) (lua_State *L, int narg, int t); static void (*luaL_checkany) (lua_State *L, int narg); -static int (*luaL_newmetatable) (lua_State *L, const char *tname); -static void (*luaL_setmetatable) (lua_State *L, const char *tname); +static int (*luaL_newmetatable) (lua_State *L, const char *tname); +static void (*luaL_setmetatable) (lua_State *L, const char *tname); static void *(*luaL_testudata) (lua_State *L, int ud, const char *tname); static void *(*luaL_checkudata) (lua_State *L, int ud, const char *tname); static void (*luaL_where) (lua_State *L, int lvl); static int (*luaL_error) (lua_State *L, const char *fmt, ...); +static int (*luaL_checkoption) (lua_State *L, int narg, const char *def, const char *const lst[]); static int (*luaL_fileresult) (lua_State *L, int stat, const char *fname); static int (*luaL_execresult) (lua_State *L, int stat); static int (*luaL_ref) (lua_State *L, int t); static void (*luaL_unref) (lua_State *L, int t, int ref); +static int (*luaL_loadfilex) (lua_State *L, const char *filename, const char *mode); +static int (*luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, const char *name, const char *mode); static int (*luaL_loadstring) (lua_State *L, const char *s); static lua_State *(*luaL_newstate) (void); static int (*luaL_len) (lua_State *L, int idx); +static const char *(*luaL_gsub) (lua_State *L, const char *s, const char *p, const char *r); static void (*luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); static int (*luaL_getsubtable) (lua_State *L, int idx, const char *fname); +static void (*luaL_traceback) (lua_State *L, lua_State *L1, const char *msg, int level); +static void (*luaL_requiref) (lua_State *L, const char *modname, lua_CFunction openf, int glb); static void (*luaL_buffinit) (lua_State *L, luaL_Buffer *B); static char *(*luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); static void (*luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); @@ -100,261 +375,174 @@ static void (*luaL_addvalue) (luaL_Buffer *B); static void (*luaL_pushresult) (luaL_Buffer *B); static void (*luaL_pushresultsize) (luaL_Buffer *B, size_t sz); static char *(*luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); -static lua_State *(*lua_newstate) (lua_Alloc f, void *ud); -static void (*lua_close) (lua_State *L); -static lua_State *(*lua_newthread) (lua_State *L); -static lua_CFunction (*lua_atpanic) (lua_State *L, lua_CFunction panicf); -static const lua_Number *(*lua_version) (lua_State *L); -static int (*lua_absindex) (lua_State *L, int idx); -static int (*lua_gettop) (lua_State *L); -static void (*lua_settop) (lua_State *L, int idx); -static void (*lua_pushvalue) (lua_State *L, int idx); -static void (*lua_remove) (lua_State *L, int idx); -static void (*lua_insert) (lua_State *L, int idx); -static void (*lua_replace) (lua_State *L, int idx); -static void (*lua_copy) (lua_State *L, int fromidx, int toidx); -static int (*lua_checkstack) (lua_State *L, int sz); -static void (*lua_xmove) (lua_State *from, lua_State *to, int n); -static int (*lua_isnumber) (lua_State *L, int idx); -static int (*lua_isstring) (lua_State *L, int idx); -static int (*lua_iscfunction) (lua_State *L, int idx); -static int (*lua_isuserdata) (lua_State *L, int idx); -static int (*lua_type) (lua_State *L, int idx); -static const char *(*lua_typename) (lua_State *L, int tp); -static lua_Number (*lua_tonumberx) (lua_State *L, int idx, int *isnum); -static lua_Integer (*lua_tointegerx) (lua_State *L, int idx, int *isnum); -static lua_Unsigned (*lua_tounsignedx) (lua_State *L, int idx, int *isnum); -static int (*lua_toboolean) (lua_State *L, int idx); -static const char *(*lua_tolstring) (lua_State *L, int idx, size_t *len); -static size_t (*lua_rawlen) (lua_State *L, int idx); -static lua_CFunction (*lua_tocfunction) (lua_State *L, int idx); -static void *(*lua_touserdata) (lua_State *L, int idx); -static lua_State *(*lua_tothread) (lua_State *L, int idx); -static const void *(*lua_topointer) (lua_State *L, int idx); -static void (*lua_arith) (lua_State *L, int op); -static int (*lua_rawequal) (lua_State *L, int idx1, int idx2); -static int (*lua_compare) (lua_State *L, int idx1, int idx2, int op); -static void (*lua_pushnil) (lua_State *L); -static void (*lua_pushnumber) (lua_State *L, lua_Number n); -static void (*lua_pushinteger) (lua_State *L, lua_Integer n); -static void (*lua_pushunsigned) (lua_State *L, lua_Unsigned n); -static const char *(*lua_pushlstring) (lua_State *L, const char *s, size_t l); -static const char *(*lua_pushstring) (lua_State *L, const char *s); -static const char *(*lua_pushfstring) (lua_State *L, const char *fmt, ...); -static void (*lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); -static void (*lua_pushboolean) (lua_State *L, int b); -static void (*lua_pushlightuserdata) (lua_State *L, void *p); -static int (*lua_pushthread) (lua_State *L); -static void (*lua_getglobal) (lua_State *L, const char *var); -static void (*lua_gettable) (lua_State *L, int idx); -static void (*lua_getfield) (lua_State *L, int idx, const char *k); -static void (*lua_rawget) (lua_State *L, int idx); -static void (*lua_rawgeti) (lua_State *L, int idx, int n); -static void (*lua_rawgetp) (lua_State *L, int idx, const void *p); -static void (*lua_createtable) (lua_State *L, int narr, int nrec); -static void *(*lua_newuserdata) (lua_State *L, size_t sz); -static int (*lua_getmetatable) (lua_State *L, int objindex); -static void (*lua_getuservalue) (lua_State *L, int idx); -static void (*lua_setglobal) (lua_State *L, const char *var); -static void (*lua_settable) (lua_State *L, int idx); -static void (*lua_setfield) (lua_State *L, int idx, const char *k); -static void (*lua_rawset) (lua_State *L, int idx); -static void (*lua_rawseti) (lua_State *L, int idx, int n); -static void (*lua_rawsetp) (lua_State *L, int idx, const void *p); -static int (*lua_setmetatable) (lua_State *L, int objindex); -static void (*lua_setuservalue) (lua_State *L, int idx); -static int (*lua_getctx) (lua_State *L, int *ctx); -static int (*lua_dump) (lua_State *L, lua_Writer writer, void *data); -static int (*lua_resume) (lua_State *L, lua_State *from, int narg); -static int (*lua_status) (lua_State *L); -static int (*lua_gc) (lua_State *L, int what, int data); -static int (*lua_error) (lua_State *L); -static int (*lua_next) (lua_State *L, int idx); -static void (*lua_concat) (lua_State *L, int n); -static void (*lua_len) (lua_State *L, int idx); -static lua_Alloc (*lua_getallocf) (lua_State *L, void **ud); -static void (*lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); -static int (*lua_getstack) (lua_State *L, int level, lua_Debug *ar); -static int (*lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); -static const char *(*lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); -static const char *(*lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); -static const char *(*lua_getupvalue) (lua_State *L, int funcindex, int n); -static const char *(*lua_setupvalue) (lua_State *L, int funcindex, int n); -static void *(*lua_upvalueid) (lua_State *L, int fidx, int n); -static int (*lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); -static lua_Hook (*lua_gethook) (lua_State *L); -static int (*lua_gethookmask) (lua_State *L); -static int (*lua_gethookcount) (lua_State *L); -static void (*luaL_openlibs) (lua_State *L); -#define luaL_checkversion(L) luaL_checkversion_(L, LUA_VERSION_NUM) -#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) -#define luaL_newlib(L,l) (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) -#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) -#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) -#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) -#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) -#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) -#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) -#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) -#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) -#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) -#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) -#define luaL_addsize(B,s) ((B)->n += (s)) -#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) -#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0)) -#define lua_h -#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) -#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL) -#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL) -#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) -#define lua_tonumber(L,i) lua_tonumberx(L,i,NULL) -#define lua_tointeger(L,i) lua_tointegerx(L,i,NULL) -#define lua_tounsigned(L,i) lua_tounsignedx(L,i,NULL) -#define lua_pop(L,n) lua_settop(L, -(n)-1) -#define lua_newtable(L) lua_createtable(L, 0, 0) -#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) -#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) -#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) -#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) -#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) -#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) -#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) -#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) -#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) -#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) -#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) -#define lua_strlen(L,i) lua_rawlen(L, (i)) -#define lua_objlen(L,i) lua_rawlen(L, (i)) -#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) -#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) -#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) -#define lua_str2number(s,p) strtod((s), (p)) -#define lua_strx2number(s,p) strtod((s), (p)) -#define lua_pushliteral(L, s) lua_pushlstring(L, s, (sizeof(s)/sizeof(char))-1) -#define lua_pushglobaltable(L) lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS) -#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*)(__VA_ARGS__))symbol(#name) -static void lite_xl_plugin_init(void* XL) { - void* (*symbol)(const char*) = (void* (*)(const char*))XL; - IMPORT_SYMBOL(luaL_checkversion_, void ,lua_State *L, lua_Number ver); - IMPORT_SYMBOL(luaL_getmetafield, int ,lua_State *L, int obj, const char *e); - IMPORT_SYMBOL(luaL_callmeta, int ,lua_State *L, int obj, const char *e); - IMPORT_SYMBOL(luaL_tolstring, const char *,lua_State *L, int idx, size_t *len); - IMPORT_SYMBOL(luaL_argerror, int ,lua_State *L, int numarg, const char *extramsg); - IMPORT_SYMBOL(luaL_checknumber, lua_Number ,lua_State *L, int numArg); - IMPORT_SYMBOL(luaL_optnumber, lua_Number ,lua_State *L, int nArg, lua_Number def); - IMPORT_SYMBOL(luaL_checkinteger, lua_Integer ,lua_State *L, int numArg); - IMPORT_SYMBOL(luaL_checkunsigned, lua_Unsigned ,lua_State *L, int numArg); - IMPORT_SYMBOL(luaL_checkstack, void ,lua_State *L, int sz, const char *msg); - IMPORT_SYMBOL(luaL_checktype, void ,lua_State *L, int narg, int t); - IMPORT_SYMBOL(luaL_checkany, void ,lua_State *L, int narg); - IMPORT_SYMBOL(luaL_newmetatable, int ,lua_State *L, const char *tname); - IMPORT_SYMBOL(luaL_setmetatable, void ,lua_State *L, const char *tname); - IMPORT_SYMBOL(luaL_testudata, void *,lua_State *L, int ud, const char *tname); - IMPORT_SYMBOL(luaL_checkudata, void *,lua_State *L, int ud, const char *tname); - IMPORT_SYMBOL(luaL_where, void ,lua_State *L, int lvl); - IMPORT_SYMBOL(luaL_error, int ,lua_State *L, const char *fmt, ...); - IMPORT_SYMBOL(luaL_fileresult, int ,lua_State *L, int stat, const char *fname); - IMPORT_SYMBOL(luaL_execresult, int ,lua_State *L, int stat); - IMPORT_SYMBOL(luaL_ref, int ,lua_State *L, int t); - IMPORT_SYMBOL(luaL_unref, void ,lua_State *L, int t, int ref); - IMPORT_SYMBOL(luaL_loadstring, int ,lua_State *L, const char *s); - IMPORT_SYMBOL(luaL_newstate, lua_State *,void); - IMPORT_SYMBOL(luaL_len, int ,lua_State *L, int idx); - IMPORT_SYMBOL(luaL_setfuncs, void ,lua_State *L, const luaL_Reg *l, int nup); - IMPORT_SYMBOL(luaL_getsubtable, int ,lua_State *L, int idx, const char *fname); - IMPORT_SYMBOL(luaL_buffinit, void ,lua_State *L, luaL_Buffer *B); - IMPORT_SYMBOL(luaL_prepbuffsize, char *,luaL_Buffer *B, size_t sz); - IMPORT_SYMBOL(luaL_addlstring, void ,luaL_Buffer *B, const char *s, size_t l); - IMPORT_SYMBOL(luaL_addstring, void ,luaL_Buffer *B, const char *s); - IMPORT_SYMBOL(luaL_addvalue, void ,luaL_Buffer *B); - IMPORT_SYMBOL(luaL_pushresult, void ,luaL_Buffer *B); - IMPORT_SYMBOL(luaL_pushresultsize, void ,luaL_Buffer *B, size_t sz); - IMPORT_SYMBOL(luaL_buffinitsize, char *,lua_State *L, luaL_Buffer *B, size_t sz); - IMPORT_SYMBOL(lua_newstate, lua_State *,lua_Alloc f, void *ud); - IMPORT_SYMBOL(lua_close, void ,lua_State *L); - IMPORT_SYMBOL(lua_newthread, lua_State *,lua_State *L); - IMPORT_SYMBOL(lua_atpanic, lua_CFunction ,lua_State *L, lua_CFunction panicf); - IMPORT_SYMBOL(lua_version, const lua_Number *,lua_State *L); - IMPORT_SYMBOL(lua_absindex, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_gettop, int ,lua_State *L); - IMPORT_SYMBOL(lua_settop, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_pushvalue, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_remove, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_insert, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_replace, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_copy, void ,lua_State *L, int fromidx, int toidx); - IMPORT_SYMBOL(lua_checkstack, int ,lua_State *L, int sz); - IMPORT_SYMBOL(lua_xmove, void ,lua_State *from, lua_State *to, int n); - IMPORT_SYMBOL(lua_isnumber, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_isstring, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_iscfunction, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_isuserdata, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_type, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_typename, const char *,lua_State *L, int tp); - IMPORT_SYMBOL(lua_tonumberx, lua_Number ,lua_State *L, int idx, int *isnum); - IMPORT_SYMBOL(lua_tointegerx, lua_Integer ,lua_State *L, int idx, int *isnum); - IMPORT_SYMBOL(lua_tounsignedx, lua_Unsigned ,lua_State *L, int idx, int *isnum); - IMPORT_SYMBOL(lua_toboolean, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_tolstring, const char *,lua_State *L, int idx, size_t *len); - IMPORT_SYMBOL(lua_rawlen, size_t ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_tocfunction, lua_CFunction ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_touserdata, void *,lua_State *L, int idx); - IMPORT_SYMBOL(lua_tothread, lua_State *,lua_State *L, int idx); - IMPORT_SYMBOL(lua_topointer, const void *,lua_State *L, int idx); - IMPORT_SYMBOL(lua_arith, void ,lua_State *L, int op); - IMPORT_SYMBOL(lua_rawequal, int ,lua_State *L, int idx1, int idx2); - IMPORT_SYMBOL(lua_compare, int ,lua_State *L, int idx1, int idx2, int op); - IMPORT_SYMBOL(lua_pushnil, void ,lua_State *L); - IMPORT_SYMBOL(lua_pushnumber, void ,lua_State *L, lua_Number n); - IMPORT_SYMBOL(lua_pushinteger, void ,lua_State *L, lua_Integer n); - IMPORT_SYMBOL(lua_pushunsigned, void ,lua_State *L, lua_Unsigned n); - IMPORT_SYMBOL(lua_pushlstring, const char *,lua_State *L, const char *s, size_t l); - IMPORT_SYMBOL(lua_pushstring, const char *,lua_State *L, const char *s); - IMPORT_SYMBOL(lua_pushfstring, const char *,lua_State *L, const char *fmt, ...); - IMPORT_SYMBOL(lua_pushcclosure, void ,lua_State *L, lua_CFunction fn, int n); - IMPORT_SYMBOL(lua_pushboolean, void ,lua_State *L, int b); - IMPORT_SYMBOL(lua_pushlightuserdata, void ,lua_State *L, void *p); - IMPORT_SYMBOL(lua_pushthread, int ,lua_State *L); - IMPORT_SYMBOL(lua_getglobal, void ,lua_State *L, const char *var); - IMPORT_SYMBOL(lua_gettable, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_getfield, void ,lua_State *L, int idx, const char *k); - IMPORT_SYMBOL(lua_rawget, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_rawgeti, void ,lua_State *L, int idx, int n); - IMPORT_SYMBOL(lua_rawgetp, void ,lua_State *L, int idx, const void *p); - IMPORT_SYMBOL(lua_createtable, void ,lua_State *L, int narr, int nrec); - IMPORT_SYMBOL(lua_newuserdata, void *,lua_State *L, size_t sz); - IMPORT_SYMBOL(lua_getmetatable, int ,lua_State *L, int objindex); - IMPORT_SYMBOL(lua_getuservalue, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_setglobal, void ,lua_State *L, const char *var); - IMPORT_SYMBOL(lua_settable, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_setfield, void ,lua_State *L, int idx, const char *k); - IMPORT_SYMBOL(lua_rawset, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_rawseti, void ,lua_State *L, int idx, int n); - IMPORT_SYMBOL(lua_rawsetp, void ,lua_State *L, int idx, const void *p); - IMPORT_SYMBOL(lua_setmetatable, int ,lua_State *L, int objindex); - IMPORT_SYMBOL(lua_setuservalue, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_getctx, int ,lua_State *L, int *ctx); - IMPORT_SYMBOL(lua_dump, int ,lua_State *L, lua_Writer writer, void *data); - IMPORT_SYMBOL(lua_resume, int ,lua_State *L, lua_State *from, int narg); - IMPORT_SYMBOL(lua_status, int ,lua_State *L); - IMPORT_SYMBOL(lua_gc, int ,lua_State *L, int what, int data); - IMPORT_SYMBOL(lua_error, int ,lua_State *L); - IMPORT_SYMBOL(lua_next, int ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_concat, void ,lua_State *L, int n); - IMPORT_SYMBOL(lua_len, void ,lua_State *L, int idx); - IMPORT_SYMBOL(lua_getallocf, lua_Alloc ,lua_State *L, void **ud); - IMPORT_SYMBOL(lua_setallocf, void ,lua_State *L, lua_Alloc f, void *ud); - IMPORT_SYMBOL(lua_getstack, int ,lua_State *L, int level, lua_Debug *ar); - IMPORT_SYMBOL(lua_getinfo, int ,lua_State *L, const char *what, lua_Debug *ar); - IMPORT_SYMBOL(lua_getlocal, const char *,lua_State *L, const lua_Debug *ar, int n); - IMPORT_SYMBOL(lua_setlocal, const char *,lua_State *L, const lua_Debug *ar, int n); - IMPORT_SYMBOL(lua_getupvalue, const char *,lua_State *L, int funcindex, int n); - IMPORT_SYMBOL(lua_setupvalue, const char *,lua_State *L, int funcindex, int n); - IMPORT_SYMBOL(lua_upvalueid, void *,lua_State *L, int fidx, int n); - IMPORT_SYMBOL(lua_sethook, int ,lua_State *L, lua_Hook func, int mask, int count); - IMPORT_SYMBOL(lua_gethook, lua_Hook ,lua_State *L); - IMPORT_SYMBOL(lua_gethookmask, int ,lua_State *L); - IMPORT_SYMBOL(lua_gethookcount, int ,lua_State *L); - IMPORT_SYMBOL(luaL_openlibs, void ,lua_State *L); +static void (*luaL_pushmodule) (lua_State *L, const char *modname, int sizehint); +static void (*luaL_openlib) (lua_State *L, const char *libname, const luaL_Reg *l, int nup); +#define lauxlib_h +#define LUA_ERRFILE (LUA_ERRERR+1) +#define luaL_checkversion(L) luaL_checkversion_(L, LUA_VERSION_NUM) +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) +#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) +#define luaL_newlibtable(L,l) lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) +#define luaL_newlib(L,l) (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) +#define luaL_argcheck(L, cond,numarg,extramsg) ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) +#define luaL_dofile(L, fn) (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) +#define luaL_dostring(L, s) (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) +#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) +#define luaL_addchar(B,c) ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), ((B)->b[(B)->n++] = (c))) +#define luaL_addsize(B,s) ((B)->n += (s)) +#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) +#define LUA_FILEHANDLE "FILE*" +#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0)) +#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name) +static void lite_xl_plugin_init(void *XL) { + void* (*symbol)(const char *) = (void* (*) (const char *)) XL; + IMPORT_SYMBOL(lua_newstate, lua_State *, lua_Alloc f, void *ud); + IMPORT_SYMBOL(lua_close, void , lua_State *L); + IMPORT_SYMBOL(lua_newthread, lua_State *, lua_State *L); + IMPORT_SYMBOL(lua_atpanic, lua_CFunction , lua_State *L, lua_CFunction panicf); + IMPORT_SYMBOL(lua_version, const lua_Number *, lua_State *L); + IMPORT_SYMBOL(lua_absindex, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_gettop, int , lua_State *L); + IMPORT_SYMBOL(lua_settop, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_pushvalue, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_remove, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_insert, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_replace, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_copy, void , lua_State *L, int fromidx, int toidx); + IMPORT_SYMBOL(lua_checkstack, int , lua_State *L, int sz); + IMPORT_SYMBOL(lua_xmove, void , lua_State *from, lua_State *to, int n); + IMPORT_SYMBOL(lua_isnumber, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_isstring, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_iscfunction, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_isuserdata, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_type, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_typename, const char *, lua_State *L, int tp); + IMPORT_SYMBOL(lua_tonumberx, lua_Number , lua_State *L, int idx, int *isnum); + IMPORT_SYMBOL(lua_tointegerx, lua_Integer , lua_State *L, int idx, int *isnum); + IMPORT_SYMBOL(lua_tounsignedx, lua_Unsigned , lua_State *L, int idx, int *isnum); + IMPORT_SYMBOL(lua_toboolean, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_tolstring, const char *, lua_State *L, int idx, size_t *len); + IMPORT_SYMBOL(lua_rawlen, size_t , lua_State *L, int idx); + IMPORT_SYMBOL(lua_tocfunction, lua_CFunction , lua_State *L, int idx); + IMPORT_SYMBOL(lua_touserdata, void *, lua_State *L, int idx); + IMPORT_SYMBOL(lua_tothread, lua_State *, lua_State *L, int idx); + IMPORT_SYMBOL(lua_topointer, const void *, lua_State *L, int idx); + IMPORT_SYMBOL(lua_arith, void , lua_State *L, int op); + IMPORT_SYMBOL(lua_rawequal, int , lua_State *L, int idx1, int idx2); + IMPORT_SYMBOL(lua_compare, int , lua_State *L, int idx1, int idx2, int op); + IMPORT_SYMBOL(lua_pushnil, void , lua_State *L); + IMPORT_SYMBOL(lua_pushnumber, void , lua_State *L, lua_Number n); + IMPORT_SYMBOL(lua_pushinteger, void , lua_State *L, lua_Integer n); + IMPORT_SYMBOL(lua_pushunsigned, void , lua_State *L, lua_Unsigned n); + IMPORT_SYMBOL(lua_pushlstring, const char *, lua_State *L, const char *s, size_t l); + IMPORT_SYMBOL(lua_pushstring, const char *, lua_State *L, const char *s); + IMPORT_SYMBOL(lua_pushvfstring, const char *, lua_State *L, const char *fmt, va_list argp); + IMPORT_SYMBOL(lua_pushfstring, const char *, lua_State *L, const char *fmt, ...); + IMPORT_SYMBOL(lua_pushcclosure, void , lua_State *L, lua_CFunction fn, int n); + IMPORT_SYMBOL(lua_pushboolean, void , lua_State *L, int b); + IMPORT_SYMBOL(lua_pushlightuserdata, void , lua_State *L, void *p); + IMPORT_SYMBOL(lua_pushthread, int , lua_State *L); + IMPORT_SYMBOL(lua_getglobal, void , lua_State *L, const char *var); + IMPORT_SYMBOL(lua_gettable, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_getfield, void , lua_State *L, int idx, const char *k); + IMPORT_SYMBOL(lua_rawget, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_rawgeti, void , lua_State *L, int idx, int n); + IMPORT_SYMBOL(lua_rawgetp, void , lua_State *L, int idx, const void *p); + IMPORT_SYMBOL(lua_createtable, void , lua_State *L, int narr, int nrec); + IMPORT_SYMBOL(lua_newuserdata, void *, lua_State *L, size_t sz); + IMPORT_SYMBOL(lua_getmetatable, int , lua_State *L, int objindex); + IMPORT_SYMBOL(lua_getuservalue, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_setglobal, void , lua_State *L, const char *var); + IMPORT_SYMBOL(lua_settable, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_setfield, void , lua_State *L, int idx, const char *k); + IMPORT_SYMBOL(lua_rawset, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_rawseti, void , lua_State *L, int idx, int n); + IMPORT_SYMBOL(lua_rawsetp, void , lua_State *L, int idx, const void *p); + IMPORT_SYMBOL(lua_setmetatable, int , lua_State *L, int objindex); + IMPORT_SYMBOL(lua_setuservalue, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_callk, void , lua_State *L, int nargs, int nresults, int ctx, lua_CFunction k); + IMPORT_SYMBOL(lua_getctx, int , lua_State *L, int *ctx); + IMPORT_SYMBOL(lua_pcallk, int , lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k); + IMPORT_SYMBOL(lua_load, int , lua_State *L, lua_Reader reader, void *dt, const char *chunkname, const char *mode); + IMPORT_SYMBOL(lua_dump, int , lua_State *L, lua_Writer writer, void *data); + IMPORT_SYMBOL(lua_yieldk, int , lua_State *L, int nresults, int ctx, lua_CFunction k); + IMPORT_SYMBOL(lua_resume, int , lua_State *L, lua_State *from, int narg); + IMPORT_SYMBOL(lua_status, int , lua_State *L); + IMPORT_SYMBOL(lua_gc, int , lua_State *L, int what, int data); + IMPORT_SYMBOL(lua_error, int , lua_State *L); + IMPORT_SYMBOL(lua_next, int , lua_State *L, int idx); + IMPORT_SYMBOL(lua_concat, void , lua_State *L, int n); + IMPORT_SYMBOL(lua_len, void , lua_State *L, int idx); + IMPORT_SYMBOL(lua_getallocf, lua_Alloc , lua_State *L, void **ud); + IMPORT_SYMBOL(lua_setallocf, void , lua_State *L, lua_Alloc f, void *ud); + IMPORT_SYMBOL(lua_getstack, int , lua_State *L, int level, lua_Debug *ar); + IMPORT_SYMBOL(lua_getinfo, int , lua_State *L, const char *what, lua_Debug *ar); + IMPORT_SYMBOL(lua_getlocal, const char *, lua_State *L, const lua_Debug *ar, int n); + IMPORT_SYMBOL(lua_setlocal, const char *, lua_State *L, const lua_Debug *ar, int n); + IMPORT_SYMBOL(lua_getupvalue, const char *, lua_State *L, int funcindex, int n); + IMPORT_SYMBOL(lua_setupvalue, const char *, lua_State *L, int funcindex, int n); + IMPORT_SYMBOL(lua_upvalueid, void *, lua_State *L, int fidx, int n); + IMPORT_SYMBOL(lua_upvaluejoin, void , lua_State *L, int fidx1, int n1, int fidx2, int n2); + IMPORT_SYMBOL(lua_sethook, int , lua_State *L, lua_Hook func, int mask, int count); + IMPORT_SYMBOL(lua_gethook, lua_Hook , lua_State *L); + IMPORT_SYMBOL(lua_gethookmask, int , lua_State *L); + IMPORT_SYMBOL(lua_gethookcount, int , lua_State *L); + IMPORT_SYMBOL(luaL_checkversion_, void , lua_State *L, lua_Number ver); + IMPORT_SYMBOL(luaL_getmetafield, int , lua_State *L, int obj, const char *e); + IMPORT_SYMBOL(luaL_callmeta, int , lua_State *L, int obj, const char *e); + IMPORT_SYMBOL(luaL_tolstring, const char *, lua_State *L, int idx, size_t *len); + IMPORT_SYMBOL(luaL_argerror, int , lua_State *L, int numarg, const char *extramsg); + IMPORT_SYMBOL(luaL_checklstring, const char *, lua_State *L, int numArg, size_t *l); + IMPORT_SYMBOL(luaL_optlstring, const char *, lua_State *L, int numArg, const char *def, size_t *l); + IMPORT_SYMBOL(luaL_checknumber, lua_Number , lua_State *L, int numArg); + IMPORT_SYMBOL(luaL_optnumber, lua_Number , lua_State *L, int nArg, lua_Number def); + IMPORT_SYMBOL(luaL_checkinteger, lua_Integer , lua_State *L, int numArg); + IMPORT_SYMBOL(luaL_optinteger, lua_Integer , lua_State *L, int nArg, lua_Integer def); + IMPORT_SYMBOL(luaL_checkunsigned, lua_Unsigned , lua_State *L, int numArg); + IMPORT_SYMBOL(luaL_optunsigned, lua_Unsigned , lua_State *L, int numArg, lua_Unsigned def); + IMPORT_SYMBOL(luaL_checkstack, void , lua_State *L, int sz, const char *msg); + IMPORT_SYMBOL(luaL_checktype, void , lua_State *L, int narg, int t); + IMPORT_SYMBOL(luaL_checkany, void , lua_State *L, int narg); + IMPORT_SYMBOL(luaL_newmetatable, int , lua_State *L, const char *tname); + IMPORT_SYMBOL(luaL_setmetatable, void , lua_State *L, const char *tname); + IMPORT_SYMBOL(luaL_testudata, void *, lua_State *L, int ud, const char *tname); + IMPORT_SYMBOL(luaL_checkudata, void *, lua_State *L, int ud, const char *tname); + IMPORT_SYMBOL(luaL_where, void , lua_State *L, int lvl); + IMPORT_SYMBOL(luaL_error, int , lua_State *L, const char *fmt, ...); + IMPORT_SYMBOL(luaL_checkoption, int , lua_State *L, int narg, const char *def, const char *const lst[]); + IMPORT_SYMBOL(luaL_fileresult, int , lua_State *L, int stat, const char *fname); + IMPORT_SYMBOL(luaL_execresult, int , lua_State *L, int stat); + IMPORT_SYMBOL(luaL_ref, int , lua_State *L, int t); + IMPORT_SYMBOL(luaL_unref, void , lua_State *L, int t, int ref); + IMPORT_SYMBOL(luaL_loadfilex, int , lua_State *L, const char *filename, const char *mode); + IMPORT_SYMBOL(luaL_loadbufferx, int , lua_State *L, const char *buff, size_t sz, const char *name, const char *mode); + IMPORT_SYMBOL(luaL_loadstring, int , lua_State *L, const char *s); + IMPORT_SYMBOL(luaL_newstate, lua_State *, void); + IMPORT_SYMBOL(luaL_len, int , lua_State *L, int idx); + IMPORT_SYMBOL(luaL_gsub, const char *, lua_State *L, const char *s, const char *p, const char *r); + IMPORT_SYMBOL(luaL_setfuncs, void , lua_State *L, const luaL_Reg *l, int nup); + IMPORT_SYMBOL(luaL_getsubtable, int , lua_State *L, int idx, const char *fname); + IMPORT_SYMBOL(luaL_traceback, void , lua_State *L, lua_State *L1, const char *msg, int level); + IMPORT_SYMBOL(luaL_requiref, void , lua_State *L, const char *modname, lua_CFunction openf, int glb); + IMPORT_SYMBOL(luaL_buffinit, void , lua_State *L, luaL_Buffer *B); + IMPORT_SYMBOL(luaL_prepbuffsize, char *, luaL_Buffer *B, size_t sz); + IMPORT_SYMBOL(luaL_addlstring, void , luaL_Buffer *B, const char *s, size_t l); + IMPORT_SYMBOL(luaL_addstring, void , luaL_Buffer *B, const char *s); + IMPORT_SYMBOL(luaL_addvalue, void , luaL_Buffer *B); + IMPORT_SYMBOL(luaL_pushresult, void , luaL_Buffer *B); + IMPORT_SYMBOL(luaL_pushresultsize, void , luaL_Buffer *B, size_t sz); + IMPORT_SYMBOL(luaL_buffinitsize, char *, lua_State *L, luaL_Buffer *B, size_t sz); + IMPORT_SYMBOL(luaL_pushmodule, void , lua_State *L, const char *modname, int sizehint); + IMPORT_SYMBOL(luaL_openlib, void , lua_State *L, const char *libname, const luaL_Reg *l, int nup); } #endif diff --git a/scripts/README.md b/scripts/README.md index a236599c..bd41f7f1 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -22,6 +22,7 @@ Various scripts and configurations used to configure, build, and package Lite XL and run Lite XL, mainly useful for CI and documentation purpose. Preferably not to be used in user systems. - **fontello-config.json**: Used by the icons generator. +- **generate_header.sh**: Generates a header file for native plugin API [1]: https://github.com/LinusU/node-appdmg [2]: https://docs.appimage.org/ diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh new file mode 100755 index 00000000..afabad93 --- /dev/null +++ b/scripts/generate_header.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# https://stackoverflow.com/a/13062682 +uncomment() { + [ $# -eq 2 ] && arg="$1" || arg="" + eval file="\$$#" + sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" | \ + gcc -P -E $arg - | \ + sed 's/aC/#/g; s/aB/__/g; s/aA/a/g' +} + +# this is the magic that turns multiline statements into +# single line statements +# LITERALLY DOES NOT WORK WITH PREPROCESSOR +onelineize() { + grep -v '^#' | sed -e ':r;$!{N;br};s/\([^{;]\)\n\s*/\1 /g' +} + +discard_preprocessors() { + grep -v '#\(include\|if\|endif\)' +} + +# sed regex for extracting data from function signature +# if this isn't regex, idk what is +# LUA_API (return type as \2) (function name as \3) (args as \4) +sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\))' + +# get funcptr declarations +ptrize() { + grep '^LUA' | sed -e "s/$sym_regex/static \2(*\3) (\4)/" +} + +export_sym() { + # don't even bother reading this again + grep '^LUA' | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4)/" +} + +decl() { + header="$(uncomment $1 | discard_preprocessors)" + header1="$(onelineize <<< "$header")" + + # typedef + grep -v '^\(LUA\|#\|extern\)' <<< "$header1" + # funcptrs + ptrize <<< "$header1" + # defines + grep '^#' <<< "$header" +} + +decl_export() { + uncomment $1 | onelineize | export_sym +} + +LUA_PATH="$1" + +cat << EOF +/** +The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long +as it has an entrypoint that looks like the following, where xxxxx is the plugin name: +#include "lite_xl_plugin_api.h" +int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) { + lite_xl_plugin_init(XL); + ... + return 1; +} +In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple! +Due to the way the API is structured, you *should not* link or include lua libraries. +This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY. + + +EOF + +cat "$0" + +cat << EOF +**/ + + +#ifndef LITE_XL_PLUGIN_API +#define LITE_XL_PLUGIN_API +EOF + +decl "$LUA_PATH/lua.h" +decl "$LUA_PATH/lauxlib.h" + +echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" +echo "static void lite_xl_plugin_init(void *XL) {" +echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" + +decl_export "$LUA_PATH/lua.h" +decl_export "$LUA_PATH/lauxlib.h" + +echo "}" +echo "#endif" From a9d7ddc6e1c96a1c0b7f80d1d52b770029f5c8cb Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 19:22:55 +0800 Subject: [PATCH 02/15] add support for export and import symbols adds a lot of improvement to the script - proper CLI - generate a api_require.h which contains a function that export the symbols --- scripts/generate_header.sh | 159 +++++++++++++++++++++++++++++-------- 1 file changed, 124 insertions(+), 35 deletions(-) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index afabad93..e250085d 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -23,16 +23,19 @@ discard_preprocessors() { # sed regex for extracting data from function signature # if this isn't regex, idk what is # LUA_API (return type as \2) (function name as \3) (args as \4) -sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\))' +sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\));' # get funcptr declarations ptrize() { - grep '^LUA' | sed -e "s/$sym_regex/static \2(*\3) (\4)/" + grep '^LUA' | sed -e "s/$sym_regex/static \2(*\3) (\4);/" +} + +import_sym() { + grep '^LUA' | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" } export_sym() { - # don't even bother reading this again - grep '^LUA' | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4)/" + grep '^LUA' | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" } decl() { @@ -47,48 +50,134 @@ decl() { grep '^#' <<< "$header" } +decl_import() { + uncomment $1 | onelineize | import_sym +} + decl_export() { uncomment $1 | onelineize | export_sym } -LUA_PATH="$1" -cat << EOF -/** -The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long -as it has an entrypoint that looks like the following, where xxxxx is the plugin name: -#include "lite_xl_plugin_api.h" -int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) { - lite_xl_plugin_init(XL); - ... - return 1; +generate_header() { + local LUA_PATH="$1" + echo "#ifndef LITE_XL_PLUGIN_API" + echo "#define LITE_XL_PLUGIN_API" + echo "/**" + echo "The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long" + echo "as it has an entrypoint that looks like the following, where xxxxx is the plugin name:" + echo '#include "lite_xl_plugin_api.h"' + echo "int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {" + echo " lite_xl_plugin_init(XL);" + echo " ..." + echo " return 1;" + echo "}" + echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" + echo "Due to the way the API is structured, you *should not* link or include lua libraries." + echo "This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY." + echo + echo + cat "$0" + echo "**/" + echo "#include " + + decl "$LUA_PATH/lua.h" + decl "$LUA_PATH/lauxlib.h" + + echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" + echo "static void lite_xl_plugin_init(void *XL) {" + echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" + + decl_import "$LUA_PATH/lua.h" + decl_import "$LUA_PATH/lauxlib.h" + + echo "}" + echo "#endif" } -In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple! -Due to the way the API is structured, you *should not* link or include lua libraries. -This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY. +generate_api_require() { + local LUA_PATH="$1" + echo "#ifndef API_REQUIRE_H" + echo "#define API_REQUIRE_H" + echo "/**" + echo "This file contains the function api_require that" + echo "returns a function pointer with it's corresponding name." + echo + echo "This file is automatically generated. DO NOT MODIFY." + echo "*/" + echo "#include " + echo "#include " + echo '#include "lua.h"' + echo '#include "lauxlib.h"' + echo + echo "typedef struct fnptr_s {" + echo -e "\tconst char* name;" + echo -e "\tvoid *addr;" + echo "} fnptr_t;" + echo + echo "#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) }" + echo "static void *api_require(const char *symbol) {" + echo -e "\tstatic fnptr_t nodes[] = {" -EOF + decl_export "$LUA_PATH/lua.h" + decl_export "$LUA_PATH/lauxlib.h" -cat "$0" + echo -e "\t};" + echo -e "\tfor (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)" + echo -e "\t\tif (strcmp(nodes[i].name, symbol) == 0)" + echo -e "\t\t\treturn nodes[i].addr;" + echo -e "\treturn NULL;" + echo "}" + echo "#endif" +} -cat << EOF -**/ +show_help() { + echo -e "Usage: $0 prefix" + echo + echo -e "Available options:" + echo + echo -e "-a\t--api-header\tGenerate lite_xl_plugin_api.h" + echo -e "-b\t--api-require\tGenerate api_require.h" + echo -e "-p\t--prefix\tSet prefix (where to find lua.h and lauxlib.h)" +} +main() { + local header=0 + local require=0 + local prefix="" -#ifndef LITE_XL_PLUGIN_API -#define LITE_XL_PLUGIN_API -EOF + for i in "$@"; do + case $i in + -h|--help) + show_help + exit 0 + ;; + -a|--api-header) + header=1 + shift + ;; + -b|--api-require) + require=1 + shift + ;; + -p|--prefix) + prefix="$2" + shift + shift + ;; + *) + ;; + esac + done -decl "$LUA_PATH/lua.h" -decl "$LUA_PATH/lauxlib.h" + if [[ "$header" -eq 1 ]]; then + generate_header "$prefix" + elif [[ "$require" -eq 1 ]]; then + generate_api_require "$prefix" + else + show_help + exit 1 + fi +} -echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" -echo "static void lite_xl_plugin_init(void *XL) {" -echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" - -decl_export "$LUA_PATH/lua.h" -decl_export "$LUA_PATH/lauxlib.h" - -echo "}" -echo "#endif" +main "$@" From 9003a9124aefe9bb29198572e35c0e580152dfa3 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 19:24:12 +0800 Subject: [PATCH 03/15] refactor api_require function into a machine generated file --- src/api/system.c | 45 +------------ src/api_require.h | 166 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+), 44 deletions(-) create mode 100644 src/api_require.h diff --git a/src/api/system.c b/src/api/system.c index bcd1b997..e5ada1f9 100644 --- a/src/api/system.c +++ b/src/api/system.c @@ -7,6 +7,7 @@ #include #include "api.h" #include "rencache.h" +#include "api_require.h" #ifdef _WIN32 #include #include @@ -651,50 +652,6 @@ static int f_set_window_opacity(lua_State *L) { return 1; } -// Symbol table for native plugin loading. Allows for a statically -// bound lua library to be used by native plugins. -typedef struct { - const char* symbol; - void* address; -} lua_function_node; - -#define P(FUNC) { "lua_" #FUNC, (void*)(lua_##FUNC) } -#define U(FUNC) { "luaL_" #FUNC, (void*)(luaL_##FUNC) } -static void* api_require(const char* symbol) { - static lua_function_node nodes[] = { - P(absindex), P(arith), P(atpanic), P(callk), P(checkstack), - P(close), P(compare), P(concat), P(copy), P(createtable), P(dump), - P(error), P(gc), P(getallocf), P(getctx), P(getfield), P(getglobal), - P(gethook), P(gethookcount), P(gethookmask), P(getinfo), P(getlocal), - P(getmetatable), P(getstack), P(gettable), P(gettop), P(getupvalue), - P(getuservalue), P(insert), P(isnumber), P(isstring), P(isuserdata), - P(len), P(load), P(newstate), P(newthread), P(newuserdata), P(next), - P(pcallk), P(pushboolean), P(pushcclosure), P(pushfstring), P(pushinteger), - P(pushlightuserdata), P(pushlstring), P(pushnil), P(pushnumber), - P(pushstring), P(pushthread), P(pushunsigned), P(pushvalue), - P(pushvfstring), P(rawequal), P(rawget), P(rawgeti), P(rawgetp), P(rawlen), - P(rawset), P(rawseti), P(rawsetp), P(remove), P(replace), P(resume), - P(setallocf), P(setfield), P(setglobal), P(sethook), P(setlocal), - P(setmetatable), P(settable), P(settop), P(setupvalue), P(setuservalue), - P(status), P(tocfunction), P(tointegerx), P(tolstring), P(toboolean), - P(tonumberx), P(topointer), P(tothread), P(tounsignedx), P(touserdata), - P(type), P(typename), P(upvalueid), P(upvaluejoin), P(version), P(xmove), - P(yieldk), U(checkversion_), U(getmetafield), U(callmeta), U(tolstring), - U(argerror), U(checknumber), U(optnumber), U(checkinteger), - U(checkunsigned), U(checkstack), U(checktype), U(checkany), - U(newmetatable), U(setmetatable), U(testudata), U(checkudata), U(where), - U(error), U(fileresult), U(execresult), U(ref), U(unref), U(loadstring), - U(newstate), U(len), U(setfuncs), U(getsubtable), U(buffinit), - U(prepbuffsize), U(addlstring), U(addstring), U(addvalue), U(pushresult), - U(pushresultsize), U(buffinitsize) - }; - for (int i = 0; i < sizeof(nodes) / sizeof(lua_function_node); ++i) { - if (strcmp(nodes[i].symbol, symbol) == 0) - return nodes[i].address; - } - return NULL; -} - static int f_load_native_plugin(lua_State *L) { char entrypoint_name[512]; entrypoint_name[sizeof(entrypoint_name) - 1] = '\0'; int result; diff --git a/src/api_require.h b/src/api_require.h new file mode 100644 index 00000000..76b17a9d --- /dev/null +++ b/src/api_require.h @@ -0,0 +1,166 @@ +#ifndef API_REQUIRE_H +#define API_REQUIRE_H +/** +This file contains the function api_require that +returns a function pointer with it's corresponding name. + +This file is automatically generated. DO NOT MODIFY. +*/ +#include +#include +#include "lua.h" +#include "lauxlib.h" + +typedef struct fnptr_s { + const char* name; + void *addr; +} fnptr_t; + +#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) } +static void *api_require(const char *symbol) { + static fnptr_t nodes[] = { + EXPORT_SYMBOL(lua_newstate), + EXPORT_SYMBOL(lua_close), + EXPORT_SYMBOL(lua_newthread), + EXPORT_SYMBOL(lua_atpanic), + EXPORT_SYMBOL(lua_version), + EXPORT_SYMBOL(lua_absindex), + EXPORT_SYMBOL(lua_gettop), + EXPORT_SYMBOL(lua_settop), + EXPORT_SYMBOL(lua_pushvalue), + EXPORT_SYMBOL(lua_remove), + EXPORT_SYMBOL(lua_insert), + EXPORT_SYMBOL(lua_replace), + EXPORT_SYMBOL(lua_copy), + EXPORT_SYMBOL(lua_checkstack), + EXPORT_SYMBOL(lua_xmove), + EXPORT_SYMBOL(lua_isnumber), + EXPORT_SYMBOL(lua_isstring), + EXPORT_SYMBOL(lua_iscfunction), + EXPORT_SYMBOL(lua_isuserdata), + EXPORT_SYMBOL(lua_type), + EXPORT_SYMBOL(lua_typename), + EXPORT_SYMBOL(lua_tonumberx), + EXPORT_SYMBOL(lua_tointegerx), + EXPORT_SYMBOL(lua_tounsignedx), + EXPORT_SYMBOL(lua_toboolean), + EXPORT_SYMBOL(lua_tolstring), + EXPORT_SYMBOL(lua_rawlen), + EXPORT_SYMBOL(lua_tocfunction), + EXPORT_SYMBOL(lua_touserdata), + EXPORT_SYMBOL(lua_tothread), + EXPORT_SYMBOL(lua_topointer), + EXPORT_SYMBOL(lua_arith), + EXPORT_SYMBOL(lua_rawequal), + EXPORT_SYMBOL(lua_compare), + EXPORT_SYMBOL(lua_pushnil), + EXPORT_SYMBOL(lua_pushnumber), + EXPORT_SYMBOL(lua_pushinteger), + EXPORT_SYMBOL(lua_pushunsigned), + EXPORT_SYMBOL(lua_pushlstring), + EXPORT_SYMBOL(lua_pushstring), + EXPORT_SYMBOL(lua_pushvfstring), + EXPORT_SYMBOL(lua_pushfstring), + EXPORT_SYMBOL(lua_pushcclosure), + EXPORT_SYMBOL(lua_pushboolean), + EXPORT_SYMBOL(lua_pushlightuserdata), + EXPORT_SYMBOL(lua_pushthread), + EXPORT_SYMBOL(lua_getglobal), + EXPORT_SYMBOL(lua_gettable), + EXPORT_SYMBOL(lua_getfield), + EXPORT_SYMBOL(lua_rawget), + EXPORT_SYMBOL(lua_rawgeti), + EXPORT_SYMBOL(lua_rawgetp), + EXPORT_SYMBOL(lua_createtable), + EXPORT_SYMBOL(lua_newuserdata), + EXPORT_SYMBOL(lua_getmetatable), + EXPORT_SYMBOL(lua_getuservalue), + EXPORT_SYMBOL(lua_setglobal), + EXPORT_SYMBOL(lua_settable), + EXPORT_SYMBOL(lua_setfield), + EXPORT_SYMBOL(lua_rawset), + EXPORT_SYMBOL(lua_rawseti), + EXPORT_SYMBOL(lua_rawsetp), + EXPORT_SYMBOL(lua_setmetatable), + EXPORT_SYMBOL(lua_setuservalue), + EXPORT_SYMBOL(lua_callk), + EXPORT_SYMBOL(lua_getctx), + EXPORT_SYMBOL(lua_pcallk), + EXPORT_SYMBOL(lua_load), + EXPORT_SYMBOL(lua_dump), + EXPORT_SYMBOL(lua_yieldk), + EXPORT_SYMBOL(lua_resume), + EXPORT_SYMBOL(lua_status), + EXPORT_SYMBOL(lua_gc), + EXPORT_SYMBOL(lua_error), + EXPORT_SYMBOL(lua_next), + EXPORT_SYMBOL(lua_concat), + EXPORT_SYMBOL(lua_len), + EXPORT_SYMBOL(lua_getallocf), + EXPORT_SYMBOL(lua_setallocf), + EXPORT_SYMBOL(lua_getstack), + EXPORT_SYMBOL(lua_getinfo), + EXPORT_SYMBOL(lua_getlocal), + EXPORT_SYMBOL(lua_setlocal), + EXPORT_SYMBOL(lua_getupvalue), + EXPORT_SYMBOL(lua_setupvalue), + EXPORT_SYMBOL(lua_upvalueid), + EXPORT_SYMBOL(lua_upvaluejoin), + EXPORT_SYMBOL(lua_sethook), + EXPORT_SYMBOL(lua_gethook), + EXPORT_SYMBOL(lua_gethookmask), + EXPORT_SYMBOL(lua_gethookcount), + EXPORT_SYMBOL(luaL_checkversion_), + EXPORT_SYMBOL(luaL_getmetafield), + EXPORT_SYMBOL(luaL_callmeta), + EXPORT_SYMBOL(luaL_tolstring), + EXPORT_SYMBOL(luaL_argerror), + EXPORT_SYMBOL(luaL_checklstring), + EXPORT_SYMBOL(luaL_optlstring), + EXPORT_SYMBOL(luaL_checknumber), + EXPORT_SYMBOL(luaL_optnumber), + EXPORT_SYMBOL(luaL_checkinteger), + EXPORT_SYMBOL(luaL_optinteger), + EXPORT_SYMBOL(luaL_checkunsigned), + EXPORT_SYMBOL(luaL_optunsigned), + EXPORT_SYMBOL(luaL_checkstack), + EXPORT_SYMBOL(luaL_checktype), + EXPORT_SYMBOL(luaL_checkany), + EXPORT_SYMBOL(luaL_newmetatable), + EXPORT_SYMBOL(luaL_setmetatable), + EXPORT_SYMBOL(luaL_testudata), + EXPORT_SYMBOL(luaL_checkudata), + EXPORT_SYMBOL(luaL_where), + EXPORT_SYMBOL(luaL_error), + EXPORT_SYMBOL(luaL_checkoption), + EXPORT_SYMBOL(luaL_fileresult), + EXPORT_SYMBOL(luaL_execresult), + EXPORT_SYMBOL(luaL_ref), + EXPORT_SYMBOL(luaL_unref), + EXPORT_SYMBOL(luaL_loadfilex), + EXPORT_SYMBOL(luaL_loadbufferx), + EXPORT_SYMBOL(luaL_loadstring), + EXPORT_SYMBOL(luaL_newstate), + EXPORT_SYMBOL(luaL_len), + EXPORT_SYMBOL(luaL_gsub), + EXPORT_SYMBOL(luaL_setfuncs), + EXPORT_SYMBOL(luaL_getsubtable), + EXPORT_SYMBOL(luaL_traceback), + EXPORT_SYMBOL(luaL_requiref), + EXPORT_SYMBOL(luaL_buffinit), + EXPORT_SYMBOL(luaL_prepbuffsize), + EXPORT_SYMBOL(luaL_addlstring), + EXPORT_SYMBOL(luaL_addstring), + EXPORT_SYMBOL(luaL_addvalue), + EXPORT_SYMBOL(luaL_pushresult), + EXPORT_SYMBOL(luaL_pushresultsize), + EXPORT_SYMBOL(luaL_buffinitsize), + EXPORT_SYMBOL(luaL_pushmodule), + EXPORT_SYMBOL(luaL_openlib), + }; + for (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++) + if (strcmp(nodes[i].name, symbol) == 0) + return nodes[i].addr; + return NULL; +} +#endif From acab4e3b262e3ed500ceb7af8bba08a8139966a8 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 20:20:36 +0800 Subject: [PATCH 04/15] support ignoring certain symbols --- scripts/generate_header.sh | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index e250085d..469d4dbf 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -1,5 +1,13 @@ #!/bin/bash +##### CONFIG + +# symbols to ignore +IGNORE_SYM='luaL_pushmodule\|luaL_openlib' + +##### CONFIG + + # https://stackoverflow.com/a/13062682 uncomment() { [ $# -eq 2 ] && arg="$1" || arg="" @@ -27,15 +35,15 @@ sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\));' # get funcptr declarations ptrize() { - grep '^LUA' | sed -e "s/$sym_regex/static \2(*\3) (\4);/" + grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static \2(*\3) (\4);/" } import_sym() { - grep '^LUA' | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" + grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" } export_sym() { - grep '^LUA' | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" + grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" } decl() { @@ -47,7 +55,7 @@ decl() { # funcptrs ptrize <<< "$header1" # defines - grep '^#' <<< "$header" + (grep '^#' | grep -v "$IGNORE_SYM") <<< "$header" } decl_import() { From 3982a8b31c496f1b575a7813250b5475a3b35a13 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 20:24:17 +0800 Subject: [PATCH 05/15] fix possible nested comment --- scripts/generate_header.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index 469d4dbf..c4789e15 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -66,6 +66,9 @@ decl_export() { uncomment $1 | onelineize | export_sym } +print_self() { + cat "$0" | sed -e 's#^#// #' +} generate_header() { local LUA_PATH="$1" @@ -83,10 +86,10 @@ generate_header() { echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" echo "Due to the way the API is structured, you *should not* link or include lua libraries." echo "This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY." - echo - echo - cat "$0" echo "**/" + echo + print_self + echo echo "#include " decl "$LUA_PATH/lua.h" @@ -112,7 +115,10 @@ generate_api_require() { echo "returns a function pointer with it's corresponding name." echo echo "This file is automatically generated. DO NOT MODIFY." - echo "*/" + echo "**/" + echo + print_self + echo echo "#include " echo "#include " echo '#include "lua.h"' From ac50404337612defa94d9f81b9de1fb09bd87948 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 20:24:40 +0800 Subject: [PATCH 06/15] print luaconf.h into the output --- scripts/generate_header.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index c4789e15..0856c46d 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -90,8 +90,10 @@ generate_header() { echo print_self echo - echo "#include " + echo "#include " + echo "#include // for BUFSIZ? this is kinda weird" + cat "$LUA_PATH/luaconf.h" decl "$LUA_PATH/lua.h" decl "$LUA_PATH/lauxlib.h" From d0a54227d85bac9abbad6860e04ec399543b6302 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 20:25:20 +0800 Subject: [PATCH 07/15] update generated headers --- resources/lite_xl_plugin_api.h | 855 +++++++++++++++++++++++++++++---- src/api_require.h | 205 +++++++- 2 files changed, 955 insertions(+), 105 deletions(-) diff --git a/resources/lite_xl_plugin_api.h b/resources/lite_xl_plugin_api.h index fbef3502..0b922346 100644 --- a/resources/lite_xl_plugin_api.h +++ b/resources/lite_xl_plugin_api.h @@ -1,3 +1,5 @@ +#ifndef LITE_XL_PLUGIN_API +#define LITE_XL_PLUGIN_API /** The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long as it has an entrypoint that looks like the following, where xxxxx is the plugin name: @@ -9,108 +11,762 @@ int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) { } In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple! Due to the way the API is structured, you *should not* link or include lua libraries. -This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY. - - -#!/bin/bash - -# https://stackoverflow.com/a/13062682 -uncomment() { - [ $# -eq 2 ] && arg="$1" || arg="" - eval file="\$$#" - sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" | \ - gcc -P -E $arg - | \ - sed 's/aC/#/g; s/aB/__/g; s/aA/a/g' -} - -# this is the magic that turns multiline statements into -# single line statements -# LITERALLY DOES NOT WORK WITH PREPROCESSOR -onelineize() { - grep -v '^#' | sed -e ':r;$!{N;br};s/\([^{;]\)\n\s*/\1 /g' -} - -discard_preprocessors() { - grep -v '#\(include\|if\|endif\)' -} - -# sed regex for extracting data from function signature -# if this isn't regex, idk what is -# LUA_API (return type as \2) (function name as \3) (args as \4) -sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\))' - -# get funcptr declarations -ptrize() { - grep '^LUA' | sed -e "s/$sym_regex/static \2(*\3) (\4)/" -} - -export_sym() { - # don't even bother reading this again - grep '^LUA' | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4)/" -} - -decl() { - header="$(uncomment $1 | discard_preprocessors)" - header1="$(onelineize <<< "$header")" - - # typedef - grep -v '^\(LUA\|#\|extern\)' <<< "$header1" - # funcptrs - ptrize <<< "$header1" - # defines - grep '^#' <<< "$header" -} - -decl_export() { - uncomment $1 | onelineize | export_sym -} - -LUA_PATH="$1" - -cat << EOF -/** -The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long -as it has an entrypoint that looks like the following, where xxxxx is the plugin name: -#include "lite_xl_plugin_api.h" -int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) { - lite_xl_plugin_init(XL); - ... - return 1; -} -In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple! -Due to the way the API is structured, you *should not* link or include lua libraries. -This file was automatically generated by the below code. Do NOT MODIFY DIRECTLY. - - -EOF - -cat "$0" - -cat << EOF +This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY. **/ +// #!/bin/bash +// +// ##### CONFIG +// +// # symbols to ignore +// IGNORE_SYM='luaL_pushmodule\|luaL_openlib' +// +// ##### CONFIG +// +// +// # https://stackoverflow.com/a/13062682 +// uncomment() { +// [ $# -eq 2 ] && arg="$1" || arg="" +// eval file="\$$#" +// sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" | \ +// gcc -P -E $arg - | \ +// sed 's/aC/#/g; s/aB/__/g; s/aA/a/g' +// } +// +// # this is the magic that turns multiline statements into +// # single line statements +// # LITERALLY DOES NOT WORK WITH PREPROCESSOR +// onelineize() { +// grep -v '^#' | sed -e ':r;$!{N;br};s/\([^{;]\)\n\s*/\1 /g' +// } +// +// discard_preprocessors() { +// grep -v '#\(include\|if\|endif\)' +// } +// +// # sed regex for extracting data from function signature +// # if this isn't regex, idk what is +// # LUA_API (return type as \2) (function name as \3) (args as \4) +// sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\));' +// +// # get funcptr declarations +// ptrize() { +// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static \2(*\3) (\4);/" +// } +// +// import_sym() { +// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" +// } +// +// export_sym() { +// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" +// } +// +// decl() { +// header="$(uncomment $1 | discard_preprocessors)" +// header1="$(onelineize <<< "$header")" +// +// # typedef +// grep -v '^\(LUA\|#\|extern\)' <<< "$header1" +// # funcptrs +// ptrize <<< "$header1" +// # defines +// (grep '^#' | grep -v "$IGNORE_SYM") <<< "$header" +// } +// +// decl_import() { +// uncomment $1 | onelineize | import_sym +// } +// +// decl_export() { +// uncomment $1 | onelineize | export_sym +// } +// +// print_self() { +// cat "$0" | sed -e 's#^#// #' +// } +// +// generate_header() { +// local LUA_PATH="$1" +// echo "#ifndef LITE_XL_PLUGIN_API" +// echo "#define LITE_XL_PLUGIN_API" +// echo "/**" +// echo "The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long" +// echo "as it has an entrypoint that looks like the following, where xxxxx is the plugin name:" +// echo '#include "lite_xl_plugin_api.h"' +// echo "int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {" +// echo " lite_xl_plugin_init(XL);" +// echo " ..." +// echo " return 1;" +// echo "}" +// echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" +// echo "Due to the way the API is structured, you *should not* link or include lua libraries." +// echo "This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY." +// echo "**/" +// echo +// print_self +// echo +// echo "#include " +// echo "#include // for BUFSIZ? this is kinda weird" +// +// cat "$LUA_PATH/luaconf.h" +// decl "$LUA_PATH/lua.h" +// decl "$LUA_PATH/lauxlib.h" +// +// echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" +// echo "static void lite_xl_plugin_init(void *XL) {" +// echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" +// +// decl_import "$LUA_PATH/lua.h" +// decl_import "$LUA_PATH/lauxlib.h" +// +// echo "}" +// echo "#endif" +// } +// +// generate_api_require() { +// local LUA_PATH="$1" +// echo "#ifndef API_REQUIRE_H" +// echo "#define API_REQUIRE_H" +// echo "/**" +// echo "This file contains the function api_require that" +// echo "returns a function pointer with it's corresponding name." +// echo +// echo "This file is automatically generated. DO NOT MODIFY." +// echo "**/" +// echo +// print_self +// echo +// echo "#include " +// echo "#include " +// echo '#include "lua.h"' +// echo '#include "lauxlib.h"' +// echo +// echo "typedef struct fnptr_s {" +// echo -e "\tconst char* name;" +// echo -e "\tvoid *addr;" +// echo "} fnptr_t;" +// echo +// echo "#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) }" +// echo "static void *api_require(const char *symbol) {" +// echo -e "\tstatic fnptr_t nodes[] = {" +// +// decl_export "$LUA_PATH/lua.h" +// decl_export "$LUA_PATH/lauxlib.h" +// +// echo -e "\t};" +// echo -e "\tfor (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)" +// echo -e "\t\tif (strcmp(nodes[i].name, symbol) == 0)" +// echo -e "\t\t\treturn nodes[i].addr;" +// echo -e "\treturn NULL;" +// echo "}" +// echo "#endif" +// } +// +// show_help() { +// echo -e "Usage: $0 prefix" +// echo +// echo -e "Available options:" +// echo +// echo -e "-a\t--api-header\tGenerate lite_xl_plugin_api.h" +// echo -e "-b\t--api-require\tGenerate api_require.h" +// echo -e "-p\t--prefix\tSet prefix (where to find lua.h and lauxlib.h)" +// } +// +// main() { +// local header=0 +// local require=0 +// local prefix="" +// +// for i in "$@"; do +// case $i in +// -h|--help) +// show_help +// exit 0 +// ;; +// -a|--api-header) +// header=1 +// shift +// ;; +// -b|--api-require) +// require=1 +// shift +// ;; +// -p|--prefix) +// prefix="$2" +// shift +// shift +// ;; +// *) +// ;; +// esac +// done +// +// if [[ "$header" -eq 1 ]]; then +// generate_header "$prefix" +// elif [[ "$require" -eq 1 ]]; then +// generate_api_require "$prefix" +// else +// show_help +// exit 1 +// fi +// } +// +// main "$@" -#ifndef LITE_XL_PLUGIN_API -#define LITE_XL_PLUGIN_API -EOF - -decl "$LUA_PATH/lua.h" -decl "$LUA_PATH/lauxlib.h" - -echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" -echo "static void lite_xl_plugin_init(void *XL) {" -echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" - -decl_export "$LUA_PATH/lua.h" -decl_export "$LUA_PATH/lauxlib.h" - -echo "}" -echo "#endif" -**/ +#include +#include // for BUFSIZ? this is kinda weird +/* +** $Id: luaconf.h,v 1.176.1.2 2013/11/21 17:26:16 roberto Exp $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ -#ifndef LITE_XL_PLUGIN_API -#define LITE_XL_PLUGIN_API +#ifndef lconfig_h +#define lconfig_h + +#include +#include + + +/* +** ================================================================== +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +@@ LUA_ANSI controls the use of non-ansi features. +** CHANGE it (define it) if you want Lua to avoid the use of any +** non-ansi feature or library. +*/ +#if !defined(LUA_ANSI) && defined(__STRICT_ANSI__) +#define LUA_ANSI +#endif + + +#if !defined(LUA_ANSI) && defined(_WIN32) && !defined(_WIN32_WCE) +#define LUA_WIN /* enable goodies for regular Windows platforms */ +#endif + +#if defined(LUA_WIN) +#define LUA_DL_DLL +#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */ +#endif + + + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#define LUA_USE_READLINE /* needs some extra libraries */ +#define LUA_USE_STRTODHEX /* assume 'strtod' handles hex formats */ +#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */ +#define LUA_USE_LONGLONG /* assume support for long long */ +#endif + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* does not need -ldl */ +#define LUA_USE_READLINE /* needs an extra library: -lreadline */ +#define LUA_USE_STRTODHEX /* assume 'strtod' handles hex formats */ +#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */ +#define LUA_USE_LONGLONG /* assume support for long long */ +#endif + + + +/* +@@ LUA_USE_POSIX includes all functionality listed as X/Open System +@* Interfaces Extension (XSI). +** CHANGE it (define it) if your system is XSI compatible. +*/ +#if defined(LUA_USE_POSIX) +#define LUA_USE_MKSTEMP +#define LUA_USE_ISATTY +#define LUA_USE_POPEN +#define LUA_USE_ULONGJMP +#define LUA_USE_GMTIME_R +#endif + + + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +@* Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +@* C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ +#if defined(_WIN32) /* { */ +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" ".\\?.lua" +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll;" ".\\?.dll" + +#else /* }{ */ + +#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "/" +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" "./?.lua" +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" +#endif /* } */ + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + + +/* +@@ LUA_ENV is the name of the variable that holds the current +@@ environment, used to access global names. +** CHANGE it if you do not like this name. +*/ +#define LUA_ENV "_ENV" + + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all auxiliary library functions. +@@ LUAMOD_API is a mark for all standard library opening functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) /* { */ + +#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#define LUA_API __declspec(dllexport) +#else /* }{ */ +#define LUA_API __declspec(dllimport) +#endif /* } */ + +#else /* }{ */ + +#define LUA_API extern + +#endif /* } */ + + +/* more often than not the libs go together with the core */ +#define LUALIB_API LUA_API +#define LUAMOD_API LUALIB_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +@* exported to outside modules. +@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables +@* that are not to be exported to outside modules (LUAI_DDEF for +@* definitions and LUAI_DDEC for declarations). +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. Not all elf targets support +** this attribute. Unfortunately, gcc does not offer a way to check +** whether the target offers that support, and those without support +** give a warning about it. To avoid these warnings, change to the +** default definition. +*/ +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) /* { */ +#define LUAI_FUNC __attribute__((visibility("hidden"))) extern +#define LUAI_DDEC LUAI_FUNC +#define LUAI_DDEF /* empty */ + +#else /* }{ */ +#define LUAI_FUNC extern +#define LUAI_DDEC extern +#define LUAI_DDEF /* empty */ +#endif /* } */ + + + +/* +@@ LUA_QL describes how error messages quote program elements. +** CHANGE it if you want a different appearance. +*/ +#define LUA_QL(x) "'" x "'" +#define LUA_QS LUA_QL("%s") + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +@* of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +@@ luai_writestring/luai_writeline define how 'print' prints its results. +** They are only used in libraries and the stand-alone program. (The #if +** avoids including 'stdio.h' everywhere.) +*/ +#if defined(LUA_LIB) || defined(lua_c) +#include +#define luai_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) +#define luai_writeline() (luai_writestring("\n", 1), fflush(stdout)) +#endif + +/* +@@ luai_writestringerror defines how to print error messages. +** (A format string with one argument is enough for Lua...) +*/ +#define luai_writestringerror(s,p) \ + (fprintf(stderr, (s), (p)), fflush(stderr)) + + +/* +@@ LUAI_MAXSHORTLEN is the maximum length for short strings, that is, +** strings that are internalized. (Cannot be smaller than reserved words +** or tags for metamethods, as these strings must be internalized; +** #("function") = 8, #("__newindex") = 10.) +*/ +#define LUAI_MAXSHORTLEN 40 + + + +/* +** {================================================================== +** Compatibility with previous versions +** =================================================================== +*/ + +/* +@@ LUA_COMPAT_ALL controls all compatibility options. +** You can define it to get all options, or change specific options +** to fit your specific needs. +*/ +#if defined(LUA_COMPAT_ALL) /* { */ + +/* +@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'. +** You can replace it with 'table.unpack'. +*/ +#define LUA_COMPAT_UNPACK + +/* +@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'. +** You can replace it with 'package.searchers'. +*/ +#define LUA_COMPAT_LOADERS + +/* +@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall. +** You can call your C function directly (with light C functions). +*/ +#define lua_cpcall(L,f,u) \ + (lua_pushcfunction(L, (f)), \ + lua_pushlightuserdata(L,(u)), \ + lua_pcall(L,1,0,0)) + + +/* +@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library. +** You can rewrite 'log10(x)' as 'log(x, 10)'. +*/ +#define LUA_COMPAT_LOG10 + +/* +@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base +** library. You can rewrite 'loadstring(s)' as 'load(s)'. +*/ +#define LUA_COMPAT_LOADSTRING + +/* +@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library. +*/ +#define LUA_COMPAT_MAXN + +/* +@@ The following macros supply trivial compatibility for some +** changes in the API. The macros themselves document how to +** change your code to avoid using them. +*/ +#define lua_strlen(L,i) lua_rawlen(L, (i)) + +#define lua_objlen(L,i) lua_rawlen(L, (i)) + +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) +#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) + +/* +@@ LUA_COMPAT_MODULE controls compatibility with previous +** module functions 'module' (Lua) and 'luaL_register' (C). +*/ +#define LUA_COMPAT_MODULE + +#endif /* } */ + +/* }================================================================== */ + + + +/* +@@ LUAI_BITSINT defines the number of bits in an int. +** CHANGE here if Lua cannot automatically detect the number of bits of +** your machine. Probably you do not need to change this. +*/ +/* avoid overflows in comparison */ +#if INT_MAX-20 < 32760 /* { */ +#define LUAI_BITSINT 16 +#elif INT_MAX > 2147483640L /* }{ */ +/* int has at least 32 bits */ +#define LUAI_BITSINT 32 +#else /* }{ */ +#error "you must define LUA_BITSINT with number of bits in an integer" +#endif /* } */ + + +/* +@@ LUA_INT32 is a signed integer with exactly 32 bits. +@@ LUAI_UMEM is an unsigned integer big enough to count the total +@* memory used by Lua. +@@ LUAI_MEM is a signed integer big enough to count the total memory +@* used by Lua. +** CHANGE here if for some weird reason the default definitions are not +** good enough for your machine. Probably you do not need to change +** this. +*/ +#if LUAI_BITSINT >= 32 /* { */ +#define LUA_INT32 int +#define LUAI_UMEM size_t +#define LUAI_MEM ptrdiff_t +#else /* }{ */ +/* 16-bit ints */ +#define LUA_INT32 long +#define LUAI_UMEM unsigned long +#define LUAI_MEM long +#endif /* } */ + + +/* +@@ LUAI_MAXSTACK limits the size of the Lua stack. +** CHANGE it if you need a different limit. This limit is arbitrary; +** its only purpose is to stop Lua from consuming unlimited stack +** space (and to reserve some numbers for pseudo-indices). +*/ +#if LUAI_BITSINT >= 32 +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK 15000 +#endif + +/* reserve some space for error handling */ +#define LUAI_FIRSTPSEUDOIDX (-LUAI_MAXSTACK - 1000) + + + + +/* +@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. +** CHANGE it if it uses too much C-stack space. +*/ +#define LUAL_BUFFERSIZE BUFSIZ + + + + +/* +** {================================================================== +@@ LUA_NUMBER is the type of numbers in Lua. +** CHANGE the following definitions only if you want to build Lua +** with a number type different from double. You may also need to +** change lua_number2int & lua_number2integer. +** =================================================================== +*/ + +#define LUA_NUMBER_DOUBLE +#define LUA_NUMBER double + +/* +@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' +@* over a number. +*/ +#define LUAI_UACNUMBER double + + +/* +@@ LUA_NUMBER_SCAN is the format for reading numbers. +@@ LUA_NUMBER_FMT is the format for writing numbers. +@@ lua_number2str converts a number to a string. +@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. +*/ +#define LUA_NUMBER_SCAN "%lf" +#define LUA_NUMBER_FMT "%.14g" +#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) +#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ + + +/* +@@ l_mathop allows the addition of an 'l' or 'f' to all math operations +*/ +#define l_mathop(x) (x) + + +/* +@@ lua_str2number converts a decimal numeric string to a number. +@@ lua_strx2number converts an hexadecimal numeric string to a number. +** In C99, 'strtod' does both conversions. C89, however, has no function +** to convert floating hexadecimal strings to numbers. For these +** systems, you can leave 'lua_strx2number' undefined and Lua will +** provide its own implementation. +*/ +#define lua_str2number(s,p) strtod((s), (p)) + +#if defined(LUA_USE_STRTODHEX) +#define lua_strx2number(s,p) strtod((s), (p)) +#endif + + +/* +@@ The luai_num* macros define the primitive operations over numbers. +*/ + +/* the following operations need the math library */ +#if defined(lobject_c) || defined(lvm_c) +#include +#define luai_nummod(L,a,b) ((a) - l_mathop(floor)((a)/(b))*(b)) +#define luai_numpow(L,a,b) (l_mathop(pow)(a,b)) +#endif + +/* these are quite standard operations */ +#if defined(LUA_CORE) +#define luai_numadd(L,a,b) ((a)+(b)) +#define luai_numsub(L,a,b) ((a)-(b)) +#define luai_nummul(L,a,b) ((a)*(b)) +#define luai_numdiv(L,a,b) ((a)/(b)) +#define luai_numunm(L,a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(L,a,b) ((a)<(b)) +#define luai_numle(L,a,b) ((a)<=(b)) +#define luai_numisnan(L,a) (!luai_numeq((a), (a))) +#endif + + + +/* +@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. +** CHANGE that if ptrdiff_t is not adequate on your machine. (On most +** machines, ptrdiff_t gives a good choice between int or long.) +*/ +#define LUA_INTEGER ptrdiff_t + +/* +@@ LUA_UNSIGNED is the integral type used by lua_pushunsigned/lua_tounsigned. +** It must have at least 32 bits. +*/ +#define LUA_UNSIGNED unsigned LUA_INT32 + + + +/* +** Some tricks with doubles +*/ + +#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) /* { */ +/* +** The next definitions activate some tricks to speed up the +** conversion from doubles to integer types, mainly to LUA_UNSIGNED. +** +@@ LUA_MSASMTRICK uses Microsoft assembler to avoid clashes with a +** DirectX idiosyncrasy. +** +@@ LUA_IEEE754TRICK uses a trick that should work on any machine +** using IEEE754 with a 32-bit integer type. +** +@@ LUA_IEEELL extends the trick to LUA_INTEGER; should only be +** defined when LUA_INTEGER is a 32-bit integer. +** +@@ LUA_IEEEENDIAN is the endianness of doubles in your machine +** (0 for little endian, 1 for big endian); if not defined, Lua will +** check it dynamically for LUA_IEEE754TRICK (but not for LUA_NANTRICK). +** +@@ LUA_NANTRICK controls the use of a trick to pack all types into +** a single double value, using NaN values to represent non-number +** values. The trick only works on 32-bit machines (ints and pointers +** are 32-bit values) with numbers represented as IEEE 754-2008 doubles +** with conventional endianess (12345678 or 87654321), in CPUs that do +** not produce signaling NaN values (all NaNs are quiet). +*/ + +/* Microsoft compiler on a Pentium (32 bit) ? */ +#if defined(LUA_WIN) && defined(_MSC_VER) && defined(_M_IX86) /* { */ + +#define LUA_MSASMTRICK +#define LUA_IEEEENDIAN 0 +#define LUA_NANTRICK + + +/* pentium 32 bits? */ +#elif defined(__i386__) || defined(__i386) || defined(__X86__) /* }{ */ + +#define LUA_IEEE754TRICK +#define LUA_IEEELL +#define LUA_IEEEENDIAN 0 +#define LUA_NANTRICK + +/* pentium 64 bits? */ +#elif defined(__x86_64) /* }{ */ + +#define LUA_IEEE754TRICK +#define LUA_IEEEENDIAN 0 + +#elif defined(__POWERPC__) || defined(__ppc__) /* }{ */ + +#define LUA_IEEE754TRICK +#define LUA_IEEEENDIAN 1 + +#else /* }{ */ + +/* assume IEEE754 and a 32-bit integer type */ +#define LUA_IEEE754TRICK + +#endif /* } */ + +#endif /* } */ + +/* }================================================================== */ + + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + +#endif + typedef struct lua_State lua_State; typedef int (*lua_CFunction) (lua_State *L); typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); @@ -375,8 +1031,6 @@ static void (*luaL_addvalue) (luaL_Buffer *B); static void (*luaL_pushresult) (luaL_Buffer *B); static void (*luaL_pushresultsize) (luaL_Buffer *B, size_t sz); static char *(*luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); -static void (*luaL_pushmodule) (lua_State *L, const char *modname, int sizehint); -static void (*luaL_openlib) (lua_State *L, const char *libname, const luaL_Reg *l, int nup); #define lauxlib_h #define LUA_ERRFILE (LUA_ERRERR+1) #define luaL_checkversion(L) luaL_checkversion_(L, LUA_VERSION_NUM) @@ -402,7 +1056,6 @@ static void (*luaL_openlib) (lua_State *L, const char *libname, const luaL_Reg * #define luaL_addsize(B,s) ((B)->n += (s)) #define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) #define LUA_FILEHANDLE "FILE*" -#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0)) #define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name) static void lite_xl_plugin_init(void *XL) { void* (*symbol)(const char *) = (void* (*) (const char *)) XL; @@ -542,7 +1195,5 @@ static void lite_xl_plugin_init(void *XL) { IMPORT_SYMBOL(luaL_pushresult, void , luaL_Buffer *B); IMPORT_SYMBOL(luaL_pushresultsize, void , luaL_Buffer *B, size_t sz); IMPORT_SYMBOL(luaL_buffinitsize, char *, lua_State *L, luaL_Buffer *B, size_t sz); - IMPORT_SYMBOL(luaL_pushmodule, void , lua_State *L, const char *modname, int sizehint); - IMPORT_SYMBOL(luaL_openlib, void , lua_State *L, const char *libname, const luaL_Reg *l, int nup); } #endif diff --git a/src/api_require.h b/src/api_require.h index 76b17a9d..daff7aa7 100644 --- a/src/api_require.h +++ b/src/api_require.h @@ -5,7 +5,208 @@ This file contains the function api_require that returns a function pointer with it's corresponding name. This file is automatically generated. DO NOT MODIFY. -*/ +**/ + +// #!/bin/bash +// +// ##### CONFIG +// +// # symbols to ignore +// IGNORE_SYM='luaL_pushmodule\|luaL_openlib' +// +// ##### CONFIG +// +// +// # https://stackoverflow.com/a/13062682 +// uncomment() { +// [ $# -eq 2 ] && arg="$1" || arg="" +// eval file="\$$#" +// sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" | \ +// gcc -P -E $arg - | \ +// sed 's/aC/#/g; s/aB/__/g; s/aA/a/g' +// } +// +// # this is the magic that turns multiline statements into +// # single line statements +// # LITERALLY DOES NOT WORK WITH PREPROCESSOR +// onelineize() { +// grep -v '^#' | sed -e ':r;$!{N;br};s/\([^{;]\)\n\s*/\1 /g' +// } +// +// discard_preprocessors() { +// grep -v '#\(include\|if\|endif\)' +// } +// +// # sed regex for extracting data from function signature +// # if this isn't regex, idk what is +// # LUA_API (return type as \2) (function name as \3) (args as \4) +// sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\));' +// +// # get funcptr declarations +// ptrize() { +// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static \2(*\3) (\4);/" +// } +// +// import_sym() { +// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" +// } +// +// export_sym() { +// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" +// } +// +// decl() { +// header="$(uncomment $1 | discard_preprocessors)" +// header1="$(onelineize <<< "$header")" +// +// # typedef +// grep -v '^\(LUA\|#\|extern\)' <<< "$header1" +// # funcptrs +// ptrize <<< "$header1" +// # defines +// (grep '^#' | grep -v "$IGNORE_SYM") <<< "$header" +// } +// +// decl_import() { +// uncomment $1 | onelineize | import_sym +// } +// +// decl_export() { +// uncomment $1 | onelineize | export_sym +// } +// +// print_self() { +// cat "$0" | sed -e 's#^#// #' +// } +// +// generate_header() { +// local LUA_PATH="$1" +// echo "#ifndef LITE_XL_PLUGIN_API" +// echo "#define LITE_XL_PLUGIN_API" +// echo "/**" +// echo "The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long" +// echo "as it has an entrypoint that looks like the following, where xxxxx is the plugin name:" +// echo '#include "lite_xl_plugin_api.h"' +// echo "int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {" +// echo " lite_xl_plugin_init(XL);" +// echo " ..." +// echo " return 1;" +// echo "}" +// echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" +// echo "Due to the way the API is structured, you *should not* link or include lua libraries." +// echo "This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY." +// echo "**/" +// echo +// print_self +// echo +// echo "#include " +// echo "#include // for BUFSIZ? this is kinda weird" +// +// cat "$LUA_PATH/luaconf.h" +// decl "$LUA_PATH/lua.h" +// decl "$LUA_PATH/lauxlib.h" +// +// echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" +// echo "static void lite_xl_plugin_init(void *XL) {" +// echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" +// +// decl_import "$LUA_PATH/lua.h" +// decl_import "$LUA_PATH/lauxlib.h" +// +// echo "}" +// echo "#endif" +// } +// +// generate_api_require() { +// local LUA_PATH="$1" +// echo "#ifndef API_REQUIRE_H" +// echo "#define API_REQUIRE_H" +// echo "/**" +// echo "This file contains the function api_require that" +// echo "returns a function pointer with it's corresponding name." +// echo +// echo "This file is automatically generated. DO NOT MODIFY." +// echo "**/" +// echo +// print_self +// echo +// echo "#include " +// echo "#include " +// echo '#include "lua.h"' +// echo '#include "lauxlib.h"' +// echo +// echo "typedef struct fnptr_s {" +// echo -e "\tconst char* name;" +// echo -e "\tvoid *addr;" +// echo "} fnptr_t;" +// echo +// echo "#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) }" +// echo "static void *api_require(const char *symbol) {" +// echo -e "\tstatic fnptr_t nodes[] = {" +// +// decl_export "$LUA_PATH/lua.h" +// decl_export "$LUA_PATH/lauxlib.h" +// +// echo -e "\t};" +// echo -e "\tfor (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)" +// echo -e "\t\tif (strcmp(nodes[i].name, symbol) == 0)" +// echo -e "\t\t\treturn nodes[i].addr;" +// echo -e "\treturn NULL;" +// echo "}" +// echo "#endif" +// } +// +// show_help() { +// echo -e "Usage: $0 prefix" +// echo +// echo -e "Available options:" +// echo +// echo -e "-a\t--api-header\tGenerate lite_xl_plugin_api.h" +// echo -e "-b\t--api-require\tGenerate api_require.h" +// echo -e "-p\t--prefix\tSet prefix (where to find lua.h and lauxlib.h)" +// } +// +// main() { +// local header=0 +// local require=0 +// local prefix="" +// +// for i in "$@"; do +// case $i in +// -h|--help) +// show_help +// exit 0 +// ;; +// -a|--api-header) +// header=1 +// shift +// ;; +// -b|--api-require) +// require=1 +// shift +// ;; +// -p|--prefix) +// prefix="$2" +// shift +// shift +// ;; +// *) +// ;; +// esac +// done +// +// if [[ "$header" -eq 1 ]]; then +// generate_header "$prefix" +// elif [[ "$require" -eq 1 ]]; then +// generate_api_require "$prefix" +// else +// show_help +// exit 1 +// fi +// } +// +// main "$@" + #include #include #include "lua.h" @@ -155,8 +356,6 @@ static void *api_require(const char *symbol) { EXPORT_SYMBOL(luaL_pushresult), EXPORT_SYMBOL(luaL_pushresultsize), EXPORT_SYMBOL(luaL_buffinitsize), - EXPORT_SYMBOL(luaL_pushmodule), - EXPORT_SYMBOL(luaL_openlib), }; for (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++) if (strcmp(nodes[i].name, symbol) == 0) From ad58f8898fb2a8fcf75dd84c56de936dceb4a049 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 20:36:33 +0800 Subject: [PATCH 08/15] make some stylistic changes self printing isn't really needed now the script is in scripts/. This will also fix a gcc warning --- scripts/generate_header.sh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index 0856c46d..94807472 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -35,7 +35,7 @@ sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\));' # get funcptr declarations ptrize() { - grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static \2(*\3) (\4);/" + grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static\t\2(*\3)\t(\4);/" } import_sym() { @@ -66,9 +66,6 @@ decl_export() { uncomment $1 | onelineize | export_sym } -print_self() { - cat "$0" | sed -e 's#^#// #' -} generate_header() { local LUA_PATH="$1" @@ -85,13 +82,14 @@ generate_header() { echo "}" echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" echo "Due to the way the API is structured, you *should not* link or include lua libraries." - echo "This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY." + echo "This file was automatically generated. DO NOT MODIFY DIRECTLY." echo "**/" echo - print_self echo echo "#include " echo "#include // for BUFSIZ? this is kinda weird" + echo + echo cat "$LUA_PATH/luaconf.h" decl "$LUA_PATH/lua.h" @@ -119,7 +117,6 @@ generate_api_require() { echo "This file is automatically generated. DO NOT MODIFY." echo "**/" echo - print_self echo echo "#include " echo "#include " From e785bbf1bf19ae1e7963e050d21d13bb2c4b865a Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Sat, 6 Nov 2021 20:39:10 +0800 Subject: [PATCH 09/15] update generated headers --- resources/lite_xl_plugin_api.h | 475 ++++++++++----------------------- src/api_require.h | 199 -------------- 2 files changed, 139 insertions(+), 535 deletions(-) diff --git a/resources/lite_xl_plugin_api.h b/resources/lite_xl_plugin_api.h index 0b922346..e0a9b5a7 100644 --- a/resources/lite_xl_plugin_api.h +++ b/resources/lite_xl_plugin_api.h @@ -11,211 +11,14 @@ int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) { } In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple! Due to the way the API is structured, you *should not* link or include lua libraries. -This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY. +This file was automatically generated. DO NOT MODIFY DIRECTLY. **/ -// #!/bin/bash -// -// ##### CONFIG -// -// # symbols to ignore -// IGNORE_SYM='luaL_pushmodule\|luaL_openlib' -// -// ##### CONFIG -// -// -// # https://stackoverflow.com/a/13062682 -// uncomment() { -// [ $# -eq 2 ] && arg="$1" || arg="" -// eval file="\$$#" -// sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" | \ -// gcc -P -E $arg - | \ -// sed 's/aC/#/g; s/aB/__/g; s/aA/a/g' -// } -// -// # this is the magic that turns multiline statements into -// # single line statements -// # LITERALLY DOES NOT WORK WITH PREPROCESSOR -// onelineize() { -// grep -v '^#' | sed -e ':r;$!{N;br};s/\([^{;]\)\n\s*/\1 /g' -// } -// -// discard_preprocessors() { -// grep -v '#\(include\|if\|endif\)' -// } -// -// # sed regex for extracting data from function signature -// # if this isn't regex, idk what is -// # LUA_API (return type as \2) (function name as \3) (args as \4) -// sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\));' -// -// # get funcptr declarations -// ptrize() { -// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static \2(*\3) (\4);/" -// } -// -// import_sym() { -// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" -// } -// -// export_sym() { -// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" -// } -// -// decl() { -// header="$(uncomment $1 | discard_preprocessors)" -// header1="$(onelineize <<< "$header")" -// -// # typedef -// grep -v '^\(LUA\|#\|extern\)' <<< "$header1" -// # funcptrs -// ptrize <<< "$header1" -// # defines -// (grep '^#' | grep -v "$IGNORE_SYM") <<< "$header" -// } -// -// decl_import() { -// uncomment $1 | onelineize | import_sym -// } -// -// decl_export() { -// uncomment $1 | onelineize | export_sym -// } -// -// print_self() { -// cat "$0" | sed -e 's#^#// #' -// } -// -// generate_header() { -// local LUA_PATH="$1" -// echo "#ifndef LITE_XL_PLUGIN_API" -// echo "#define LITE_XL_PLUGIN_API" -// echo "/**" -// echo "The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long" -// echo "as it has an entrypoint that looks like the following, where xxxxx is the plugin name:" -// echo '#include "lite_xl_plugin_api.h"' -// echo "int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {" -// echo " lite_xl_plugin_init(XL);" -// echo " ..." -// echo " return 1;" -// echo "}" -// echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" -// echo "Due to the way the API is structured, you *should not* link or include lua libraries." -// echo "This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY." -// echo "**/" -// echo -// print_self -// echo -// echo "#include " -// echo "#include // for BUFSIZ? this is kinda weird" -// -// cat "$LUA_PATH/luaconf.h" -// decl "$LUA_PATH/lua.h" -// decl "$LUA_PATH/lauxlib.h" -// -// echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" -// echo "static void lite_xl_plugin_init(void *XL) {" -// echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" -// -// decl_import "$LUA_PATH/lua.h" -// decl_import "$LUA_PATH/lauxlib.h" -// -// echo "}" -// echo "#endif" -// } -// -// generate_api_require() { -// local LUA_PATH="$1" -// echo "#ifndef API_REQUIRE_H" -// echo "#define API_REQUIRE_H" -// echo "/**" -// echo "This file contains the function api_require that" -// echo "returns a function pointer with it's corresponding name." -// echo -// echo "This file is automatically generated. DO NOT MODIFY." -// echo "**/" -// echo -// print_self -// echo -// echo "#include " -// echo "#include " -// echo '#include "lua.h"' -// echo '#include "lauxlib.h"' -// echo -// echo "typedef struct fnptr_s {" -// echo -e "\tconst char* name;" -// echo -e "\tvoid *addr;" -// echo "} fnptr_t;" -// echo -// echo "#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) }" -// echo "static void *api_require(const char *symbol) {" -// echo -e "\tstatic fnptr_t nodes[] = {" -// -// decl_export "$LUA_PATH/lua.h" -// decl_export "$LUA_PATH/lauxlib.h" -// -// echo -e "\t};" -// echo -e "\tfor (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)" -// echo -e "\t\tif (strcmp(nodes[i].name, symbol) == 0)" -// echo -e "\t\t\treturn nodes[i].addr;" -// echo -e "\treturn NULL;" -// echo "}" -// echo "#endif" -// } -// -// show_help() { -// echo -e "Usage: $0 prefix" -// echo -// echo -e "Available options:" -// echo -// echo -e "-a\t--api-header\tGenerate lite_xl_plugin_api.h" -// echo -e "-b\t--api-require\tGenerate api_require.h" -// echo -e "-p\t--prefix\tSet prefix (where to find lua.h and lauxlib.h)" -// } -// -// main() { -// local header=0 -// local require=0 -// local prefix="" -// -// for i in "$@"; do -// case $i in -// -h|--help) -// show_help -// exit 0 -// ;; -// -a|--api-header) -// header=1 -// shift -// ;; -// -b|--api-require) -// require=1 -// shift -// ;; -// -p|--prefix) -// prefix="$2" -// shift -// shift -// ;; -// *) -// ;; -// esac -// done -// -// if [[ "$header" -eq 1 ]]; then -// generate_header "$prefix" -// elif [[ "$require" -eq 1 ]]; then -// generate_api_require "$prefix" -// else -// show_help -// exit 1 -// fi -// } -// -// main "$@" #include #include // for BUFSIZ? this is kinda weird + + /* ** $Id: luaconf.h,v 1.176.1.2 2013/11/21 17:26:16 roberto Exp $ ** Configuration file for Lua @@ -793,97 +596,97 @@ struct lua_Debug { char short_src[LUA_IDSIZE]; struct CallInfo *i_ci; }; -static lua_State *(*lua_newstate) (lua_Alloc f, void *ud); -static void (*lua_close) (lua_State *L); -static lua_State *(*lua_newthread) (lua_State *L); -static lua_CFunction (*lua_atpanic) (lua_State *L, lua_CFunction panicf); -static const lua_Number *(*lua_version) (lua_State *L); -static int (*lua_absindex) (lua_State *L, int idx); -static int (*lua_gettop) (lua_State *L); -static void (*lua_settop) (lua_State *L, int idx); -static void (*lua_pushvalue) (lua_State *L, int idx); -static void (*lua_remove) (lua_State *L, int idx); -static void (*lua_insert) (lua_State *L, int idx); -static void (*lua_replace) (lua_State *L, int idx); -static void (*lua_copy) (lua_State *L, int fromidx, int toidx); -static int (*lua_checkstack) (lua_State *L, int sz); -static void (*lua_xmove) (lua_State *from, lua_State *to, int n); -static int (*lua_isnumber) (lua_State *L, int idx); -static int (*lua_isstring) (lua_State *L, int idx); -static int (*lua_iscfunction) (lua_State *L, int idx); -static int (*lua_isuserdata) (lua_State *L, int idx); -static int (*lua_type) (lua_State *L, int idx); -static const char *(*lua_typename) (lua_State *L, int tp); -static lua_Number (*lua_tonumberx) (lua_State *L, int idx, int *isnum); -static lua_Integer (*lua_tointegerx) (lua_State *L, int idx, int *isnum); -static lua_Unsigned (*lua_tounsignedx) (lua_State *L, int idx, int *isnum); -static int (*lua_toboolean) (lua_State *L, int idx); -static const char *(*lua_tolstring) (lua_State *L, int idx, size_t *len); -static size_t (*lua_rawlen) (lua_State *L, int idx); -static lua_CFunction (*lua_tocfunction) (lua_State *L, int idx); -static void *(*lua_touserdata) (lua_State *L, int idx); -static lua_State *(*lua_tothread) (lua_State *L, int idx); -static const void *(*lua_topointer) (lua_State *L, int idx); -static void (*lua_arith) (lua_State *L, int op); -static int (*lua_rawequal) (lua_State *L, int idx1, int idx2); -static int (*lua_compare) (lua_State *L, int idx1, int idx2, int op); -static void (*lua_pushnil) (lua_State *L); -static void (*lua_pushnumber) (lua_State *L, lua_Number n); -static void (*lua_pushinteger) (lua_State *L, lua_Integer n); -static void (*lua_pushunsigned) (lua_State *L, lua_Unsigned n); -static const char *(*lua_pushlstring) (lua_State *L, const char *s, size_t l); -static const char *(*lua_pushstring) (lua_State *L, const char *s); -static const char *(*lua_pushvfstring) (lua_State *L, const char *fmt, va_list argp); -static const char *(*lua_pushfstring) (lua_State *L, const char *fmt, ...); -static void (*lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); -static void (*lua_pushboolean) (lua_State *L, int b); -static void (*lua_pushlightuserdata) (lua_State *L, void *p); -static int (*lua_pushthread) (lua_State *L); -static void (*lua_getglobal) (lua_State *L, const char *var); -static void (*lua_gettable) (lua_State *L, int idx); -static void (*lua_getfield) (lua_State *L, int idx, const char *k); -static void (*lua_rawget) (lua_State *L, int idx); -static void (*lua_rawgeti) (lua_State *L, int idx, int n); -static void (*lua_rawgetp) (lua_State *L, int idx, const void *p); -static void (*lua_createtable) (lua_State *L, int narr, int nrec); -static void *(*lua_newuserdata) (lua_State *L, size_t sz); -static int (*lua_getmetatable) (lua_State *L, int objindex); -static void (*lua_getuservalue) (lua_State *L, int idx); -static void (*lua_setglobal) (lua_State *L, const char *var); -static void (*lua_settable) (lua_State *L, int idx); -static void (*lua_setfield) (lua_State *L, int idx, const char *k); -static void (*lua_rawset) (lua_State *L, int idx); -static void (*lua_rawseti) (lua_State *L, int idx, int n); -static void (*lua_rawsetp) (lua_State *L, int idx, const void *p); -static int (*lua_setmetatable) (lua_State *L, int objindex); -static void (*lua_setuservalue) (lua_State *L, int idx); -static void (*lua_callk) (lua_State *L, int nargs, int nresults, int ctx, lua_CFunction k); -static int (*lua_getctx) (lua_State *L, int *ctx); -static int (*lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k); -static int (*lua_load) (lua_State *L, lua_Reader reader, void *dt, const char *chunkname, const char *mode); -static int (*lua_dump) (lua_State *L, lua_Writer writer, void *data); -static int (*lua_yieldk) (lua_State *L, int nresults, int ctx, lua_CFunction k); -static int (*lua_resume) (lua_State *L, lua_State *from, int narg); -static int (*lua_status) (lua_State *L); -static int (*lua_gc) (lua_State *L, int what, int data); -static int (*lua_error) (lua_State *L); -static int (*lua_next) (lua_State *L, int idx); -static void (*lua_concat) (lua_State *L, int n); -static void (*lua_len) (lua_State *L, int idx); -static lua_Alloc (*lua_getallocf) (lua_State *L, void **ud); -static void (*lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); -static int (*lua_getstack) (lua_State *L, int level, lua_Debug *ar); -static int (*lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); -static const char *(*lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); -static const char *(*lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); -static const char *(*lua_getupvalue) (lua_State *L, int funcindex, int n); -static const char *(*lua_setupvalue) (lua_State *L, int funcindex, int n); -static void *(*lua_upvalueid) (lua_State *L, int fidx, int n); -static void (*lua_upvaluejoin) (lua_State *L, int fidx1, int n1, int fidx2, int n2); -static int (*lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); -static lua_Hook (*lua_gethook) (lua_State *L); -static int (*lua_gethookmask) (lua_State *L); -static int (*lua_gethookcount) (lua_State *L); +static lua_State *(*lua_newstate) (lua_Alloc f, void *ud); +static void (*lua_close) (lua_State *L); +static lua_State *(*lua_newthread) (lua_State *L); +static lua_CFunction (*lua_atpanic) (lua_State *L, lua_CFunction panicf); +static const lua_Number *(*lua_version) (lua_State *L); +static int (*lua_absindex) (lua_State *L, int idx); +static int (*lua_gettop) (lua_State *L); +static void (*lua_settop) (lua_State *L, int idx); +static void (*lua_pushvalue) (lua_State *L, int idx); +static void (*lua_remove) (lua_State *L, int idx); +static void (*lua_insert) (lua_State *L, int idx); +static void (*lua_replace) (lua_State *L, int idx); +static void (*lua_copy) (lua_State *L, int fromidx, int toidx); +static int (*lua_checkstack) (lua_State *L, int sz); +static void (*lua_xmove) (lua_State *from, lua_State *to, int n); +static int (*lua_isnumber) (lua_State *L, int idx); +static int (*lua_isstring) (lua_State *L, int idx); +static int (*lua_iscfunction) (lua_State *L, int idx); +static int (*lua_isuserdata) (lua_State *L, int idx); +static int (*lua_type) (lua_State *L, int idx); +static const char *(*lua_typename) (lua_State *L, int tp); +static lua_Number (*lua_tonumberx) (lua_State *L, int idx, int *isnum); +static lua_Integer (*lua_tointegerx) (lua_State *L, int idx, int *isnum); +static lua_Unsigned (*lua_tounsignedx) (lua_State *L, int idx, int *isnum); +static int (*lua_toboolean) (lua_State *L, int idx); +static const char *(*lua_tolstring) (lua_State *L, int idx, size_t *len); +static size_t (*lua_rawlen) (lua_State *L, int idx); +static lua_CFunction (*lua_tocfunction) (lua_State *L, int idx); +static void *(*lua_touserdata) (lua_State *L, int idx); +static lua_State *(*lua_tothread) (lua_State *L, int idx); +static const void *(*lua_topointer) (lua_State *L, int idx); +static void (*lua_arith) (lua_State *L, int op); +static int (*lua_rawequal) (lua_State *L, int idx1, int idx2); +static int (*lua_compare) (lua_State *L, int idx1, int idx2, int op); +static void (*lua_pushnil) (lua_State *L); +static void (*lua_pushnumber) (lua_State *L, lua_Number n); +static void (*lua_pushinteger) (lua_State *L, lua_Integer n); +static void (*lua_pushunsigned) (lua_State *L, lua_Unsigned n); +static const char *(*lua_pushlstring) (lua_State *L, const char *s, size_t l); +static const char *(*lua_pushstring) (lua_State *L, const char *s); +static const char *(*lua_pushvfstring) (lua_State *L, const char *fmt, va_list argp); +static const char *(*lua_pushfstring) (lua_State *L, const char *fmt, ...); +static void (*lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +static void (*lua_pushboolean) (lua_State *L, int b); +static void (*lua_pushlightuserdata) (lua_State *L, void *p); +static int (*lua_pushthread) (lua_State *L); +static void (*lua_getglobal) (lua_State *L, const char *var); +static void (*lua_gettable) (lua_State *L, int idx); +static void (*lua_getfield) (lua_State *L, int idx, const char *k); +static void (*lua_rawget) (lua_State *L, int idx); +static void (*lua_rawgeti) (lua_State *L, int idx, int n); +static void (*lua_rawgetp) (lua_State *L, int idx, const void *p); +static void (*lua_createtable) (lua_State *L, int narr, int nrec); +static void *(*lua_newuserdata) (lua_State *L, size_t sz); +static int (*lua_getmetatable) (lua_State *L, int objindex); +static void (*lua_getuservalue) (lua_State *L, int idx); +static void (*lua_setglobal) (lua_State *L, const char *var); +static void (*lua_settable) (lua_State *L, int idx); +static void (*lua_setfield) (lua_State *L, int idx, const char *k); +static void (*lua_rawset) (lua_State *L, int idx); +static void (*lua_rawseti) (lua_State *L, int idx, int n); +static void (*lua_rawsetp) (lua_State *L, int idx, const void *p); +static int (*lua_setmetatable) (lua_State *L, int objindex); +static void (*lua_setuservalue) (lua_State *L, int idx); +static void (*lua_callk) (lua_State *L, int nargs, int nresults, int ctx, lua_CFunction k); +static int (*lua_getctx) (lua_State *L, int *ctx); +static int (*lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k); +static int (*lua_load) (lua_State *L, lua_Reader reader, void *dt, const char *chunkname, const char *mode); +static int (*lua_dump) (lua_State *L, lua_Writer writer, void *data); +static int (*lua_yieldk) (lua_State *L, int nresults, int ctx, lua_CFunction k); +static int (*lua_resume) (lua_State *L, lua_State *from, int narg); +static int (*lua_status) (lua_State *L); +static int (*lua_gc) (lua_State *L, int what, int data); +static int (*lua_error) (lua_State *L); +static int (*lua_next) (lua_State *L, int idx); +static void (*lua_concat) (lua_State *L, int n); +static void (*lua_len) (lua_State *L, int idx); +static lua_Alloc (*lua_getallocf) (lua_State *L, void **ud); +static void (*lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); +static int (*lua_getstack) (lua_State *L, int level, lua_Debug *ar); +static int (*lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); +static const char *(*lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); +static const char *(*lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); +static const char *(*lua_getupvalue) (lua_State *L, int funcindex, int n); +static const char *(*lua_setupvalue) (lua_State *L, int funcindex, int n); +static void *(*lua_upvalueid) (lua_State *L, int fidx, int n); +static void (*lua_upvaluejoin) (lua_State *L, int fidx1, int n1, int fidx2, int n2); +static int (*lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); +static lua_Hook (*lua_gethook) (lua_State *L); +static int (*lua_gethookmask) (lua_State *L); +static int (*lua_gethookcount) (lua_State *L); #define lua_h #define LUA_VERSION_MAJOR "5" #define LUA_VERSION_MINOR "2" @@ -986,51 +789,51 @@ typedef struct luaL_Stream { FILE *f; lua_CFunction closef; } luaL_Stream; -static void (*luaL_checkversion_) (lua_State *L, lua_Number ver); -static int (*luaL_getmetafield) (lua_State *L, int obj, const char *e); -static int (*luaL_callmeta) (lua_State *L, int obj, const char *e); -static const char *(*luaL_tolstring) (lua_State *L, int idx, size_t *len); -static int (*luaL_argerror) (lua_State *L, int numarg, const char *extramsg); -static const char *(*luaL_checklstring) (lua_State *L, int numArg, size_t *l); -static const char *(*luaL_optlstring) (lua_State *L, int numArg, const char *def, size_t *l); -static lua_Number (*luaL_checknumber) (lua_State *L, int numArg); -static lua_Number (*luaL_optnumber) (lua_State *L, int nArg, lua_Number def); -static lua_Integer (*luaL_checkinteger) (lua_State *L, int numArg); -static lua_Integer (*luaL_optinteger) (lua_State *L, int nArg, lua_Integer def); -static lua_Unsigned (*luaL_checkunsigned) (lua_State *L, int numArg); -static lua_Unsigned (*luaL_optunsigned) (lua_State *L, int numArg, lua_Unsigned def); -static void (*luaL_checkstack) (lua_State *L, int sz, const char *msg); -static void (*luaL_checktype) (lua_State *L, int narg, int t); -static void (*luaL_checkany) (lua_State *L, int narg); -static int (*luaL_newmetatable) (lua_State *L, const char *tname); -static void (*luaL_setmetatable) (lua_State *L, const char *tname); -static void *(*luaL_testudata) (lua_State *L, int ud, const char *tname); -static void *(*luaL_checkudata) (lua_State *L, int ud, const char *tname); -static void (*luaL_where) (lua_State *L, int lvl); -static int (*luaL_error) (lua_State *L, const char *fmt, ...); -static int (*luaL_checkoption) (lua_State *L, int narg, const char *def, const char *const lst[]); -static int (*luaL_fileresult) (lua_State *L, int stat, const char *fname); -static int (*luaL_execresult) (lua_State *L, int stat); -static int (*luaL_ref) (lua_State *L, int t); -static void (*luaL_unref) (lua_State *L, int t, int ref); -static int (*luaL_loadfilex) (lua_State *L, const char *filename, const char *mode); -static int (*luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, const char *name, const char *mode); -static int (*luaL_loadstring) (lua_State *L, const char *s); -static lua_State *(*luaL_newstate) (void); -static int (*luaL_len) (lua_State *L, int idx); -static const char *(*luaL_gsub) (lua_State *L, const char *s, const char *p, const char *r); -static void (*luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); -static int (*luaL_getsubtable) (lua_State *L, int idx, const char *fname); -static void (*luaL_traceback) (lua_State *L, lua_State *L1, const char *msg, int level); -static void (*luaL_requiref) (lua_State *L, const char *modname, lua_CFunction openf, int glb); -static void (*luaL_buffinit) (lua_State *L, luaL_Buffer *B); -static char *(*luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); -static void (*luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); -static void (*luaL_addstring) (luaL_Buffer *B, const char *s); -static void (*luaL_addvalue) (luaL_Buffer *B); -static void (*luaL_pushresult) (luaL_Buffer *B); -static void (*luaL_pushresultsize) (luaL_Buffer *B, size_t sz); -static char *(*luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); +static void (*luaL_checkversion_) (lua_State *L, lua_Number ver); +static int (*luaL_getmetafield) (lua_State *L, int obj, const char *e); +static int (*luaL_callmeta) (lua_State *L, int obj, const char *e); +static const char *(*luaL_tolstring) (lua_State *L, int idx, size_t *len); +static int (*luaL_argerror) (lua_State *L, int numarg, const char *extramsg); +static const char *(*luaL_checklstring) (lua_State *L, int numArg, size_t *l); +static const char *(*luaL_optlstring) (lua_State *L, int numArg, const char *def, size_t *l); +static lua_Number (*luaL_checknumber) (lua_State *L, int numArg); +static lua_Number (*luaL_optnumber) (lua_State *L, int nArg, lua_Number def); +static lua_Integer (*luaL_checkinteger) (lua_State *L, int numArg); +static lua_Integer (*luaL_optinteger) (lua_State *L, int nArg, lua_Integer def); +static lua_Unsigned (*luaL_checkunsigned) (lua_State *L, int numArg); +static lua_Unsigned (*luaL_optunsigned) (lua_State *L, int numArg, lua_Unsigned def); +static void (*luaL_checkstack) (lua_State *L, int sz, const char *msg); +static void (*luaL_checktype) (lua_State *L, int narg, int t); +static void (*luaL_checkany) (lua_State *L, int narg); +static int (*luaL_newmetatable) (lua_State *L, const char *tname); +static void (*luaL_setmetatable) (lua_State *L, const char *tname); +static void *(*luaL_testudata) (lua_State *L, int ud, const char *tname); +static void *(*luaL_checkudata) (lua_State *L, int ud, const char *tname); +static void (*luaL_where) (lua_State *L, int lvl); +static int (*luaL_error) (lua_State *L, const char *fmt, ...); +static int (*luaL_checkoption) (lua_State *L, int narg, const char *def, const char *const lst[]); +static int (*luaL_fileresult) (lua_State *L, int stat, const char *fname); +static int (*luaL_execresult) (lua_State *L, int stat); +static int (*luaL_ref) (lua_State *L, int t); +static void (*luaL_unref) (lua_State *L, int t, int ref); +static int (*luaL_loadfilex) (lua_State *L, const char *filename, const char *mode); +static int (*luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, const char *name, const char *mode); +static int (*luaL_loadstring) (lua_State *L, const char *s); +static lua_State *(*luaL_newstate) (void); +static int (*luaL_len) (lua_State *L, int idx); +static const char *(*luaL_gsub) (lua_State *L, const char *s, const char *p, const char *r); +static void (*luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); +static int (*luaL_getsubtable) (lua_State *L, int idx, const char *fname); +static void (*luaL_traceback) (lua_State *L, lua_State *L1, const char *msg, int level); +static void (*luaL_requiref) (lua_State *L, const char *modname, lua_CFunction openf, int glb); +static void (*luaL_buffinit) (lua_State *L, luaL_Buffer *B); +static char *(*luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); +static void (*luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +static void (*luaL_addstring) (luaL_Buffer *B, const char *s); +static void (*luaL_addvalue) (luaL_Buffer *B); +static void (*luaL_pushresult) (luaL_Buffer *B); +static void (*luaL_pushresultsize) (luaL_Buffer *B, size_t sz); +static char *(*luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); #define lauxlib_h #define LUA_ERRFILE (LUA_ERRERR+1) #define luaL_checkversion(L) luaL_checkversion_(L, LUA_VERSION_NUM) diff --git a/src/api_require.h b/src/api_require.h index daff7aa7..9ff56233 100644 --- a/src/api_require.h +++ b/src/api_require.h @@ -7,205 +7,6 @@ returns a function pointer with it's corresponding name. This file is automatically generated. DO NOT MODIFY. **/ -// #!/bin/bash -// -// ##### CONFIG -// -// # symbols to ignore -// IGNORE_SYM='luaL_pushmodule\|luaL_openlib' -// -// ##### CONFIG -// -// -// # https://stackoverflow.com/a/13062682 -// uncomment() { -// [ $# -eq 2 ] && arg="$1" || arg="" -// eval file="\$$#" -// sed 's/a/aA/g; s/__/aB/g; s/#/aC/g' "$file" | \ -// gcc -P -E $arg - | \ -// sed 's/aC/#/g; s/aB/__/g; s/aA/a/g' -// } -// -// # this is the magic that turns multiline statements into -// # single line statements -// # LITERALLY DOES NOT WORK WITH PREPROCESSOR -// onelineize() { -// grep -v '^#' | sed -e ':r;$!{N;br};s/\([^{;]\)\n\s*/\1 /g' -// } -// -// discard_preprocessors() { -// grep -v '#\(include\|if\|endif\)' -// } -// -// # sed regex for extracting data from function signature -// # if this isn't regex, idk what is -// # LUA_API (return type as \2) (function name as \3) (args as \4) -// sym_regex='^LUA\(LIB\)\?_API\s\+\([^(]\+\)\s*(\([^)]\+\))\s\+(\([^)]\+\));' -// -// # get funcptr declarations -// ptrize() { -// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static \2(*\3) (\4);/" -// } -// -// import_sym() { -// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" -// } -// -// export_sym() { -// grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" -// } -// -// decl() { -// header="$(uncomment $1 | discard_preprocessors)" -// header1="$(onelineize <<< "$header")" -// -// # typedef -// grep -v '^\(LUA\|#\|extern\)' <<< "$header1" -// # funcptrs -// ptrize <<< "$header1" -// # defines -// (grep '^#' | grep -v "$IGNORE_SYM") <<< "$header" -// } -// -// decl_import() { -// uncomment $1 | onelineize | import_sym -// } -// -// decl_export() { -// uncomment $1 | onelineize | export_sym -// } -// -// print_self() { -// cat "$0" | sed -e 's#^#// #' -// } -// -// generate_header() { -// local LUA_PATH="$1" -// echo "#ifndef LITE_XL_PLUGIN_API" -// echo "#define LITE_XL_PLUGIN_API" -// echo "/**" -// echo "The lite_xl plugin API is quite simple. Any shared library can be a plugin file, so long" -// echo "as it has an entrypoint that looks like the following, where xxxxx is the plugin name:" -// echo '#include "lite_xl_plugin_api.h"' -// echo "int lua_open_lite_xl_xxxxx(lua_State* L, void* XL) {" -// echo " lite_xl_plugin_init(XL);" -// echo " ..." -// echo " return 1;" -// echo "}" -// echo "In linux, to compile this file, you'd do: 'gcc -o xxxxx.so -shared xxxxx.c'. Simple!" -// echo "Due to the way the API is structured, you *should not* link or include lua libraries." -// echo "This file was automatically generated by the below code. DO NOT MODIFY DIRECTLY." -// echo "**/" -// echo -// print_self -// echo -// echo "#include " -// echo "#include // for BUFSIZ? this is kinda weird" -// -// cat "$LUA_PATH/luaconf.h" -// decl "$LUA_PATH/lua.h" -// decl "$LUA_PATH/lauxlib.h" -// -// echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" -// echo "static void lite_xl_plugin_init(void *XL) {" -// echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" -// -// decl_import "$LUA_PATH/lua.h" -// decl_import "$LUA_PATH/lauxlib.h" -// -// echo "}" -// echo "#endif" -// } -// -// generate_api_require() { -// local LUA_PATH="$1" -// echo "#ifndef API_REQUIRE_H" -// echo "#define API_REQUIRE_H" -// echo "/**" -// echo "This file contains the function api_require that" -// echo "returns a function pointer with it's corresponding name." -// echo -// echo "This file is automatically generated. DO NOT MODIFY." -// echo "**/" -// echo -// print_self -// echo -// echo "#include " -// echo "#include " -// echo '#include "lua.h"' -// echo '#include "lauxlib.h"' -// echo -// echo "typedef struct fnptr_s {" -// echo -e "\tconst char* name;" -// echo -e "\tvoid *addr;" -// echo "} fnptr_t;" -// echo -// echo "#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) }" -// echo "static void *api_require(const char *symbol) {" -// echo -e "\tstatic fnptr_t nodes[] = {" -// -// decl_export "$LUA_PATH/lua.h" -// decl_export "$LUA_PATH/lauxlib.h" -// -// echo -e "\t};" -// echo -e "\tfor (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)" -// echo -e "\t\tif (strcmp(nodes[i].name, symbol) == 0)" -// echo -e "\t\t\treturn nodes[i].addr;" -// echo -e "\treturn NULL;" -// echo "}" -// echo "#endif" -// } -// -// show_help() { -// echo -e "Usage: $0 prefix" -// echo -// echo -e "Available options:" -// echo -// echo -e "-a\t--api-header\tGenerate lite_xl_plugin_api.h" -// echo -e "-b\t--api-require\tGenerate api_require.h" -// echo -e "-p\t--prefix\tSet prefix (where to find lua.h and lauxlib.h)" -// } -// -// main() { -// local header=0 -// local require=0 -// local prefix="" -// -// for i in "$@"; do -// case $i in -// -h|--help) -// show_help -// exit 0 -// ;; -// -a|--api-header) -// header=1 -// shift -// ;; -// -b|--api-require) -// require=1 -// shift -// ;; -// -p|--prefix) -// prefix="$2" -// shift -// shift -// ;; -// *) -// ;; -// esac -// done -// -// if [[ "$header" -eq 1 ]]; then -// generate_header "$prefix" -// elif [[ "$require" -eq 1 ]]; then -// generate_api_require "$prefix" -// else -// show_help -// exit 1 -// fi -// } -// -// main "$@" #include #include From 8bcc2d20f413818c75e6ed76843d22a1020529d3 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Mon, 8 Nov 2021 12:17:26 +0800 Subject: [PATCH 10/15] stylistic changes removes comment from luaconf.h add comment to signify filename --- scripts/generate_header.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index 94807472..c4f784de 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -47,6 +47,9 @@ export_sym() { } decl() { + echo "/** $(basename "$1") **/" + echo + header="$(uncomment $1 | discard_preprocessors)" header1="$(onelineize <<< "$header")" @@ -89,11 +92,15 @@ generate_header() { echo "#include " echo "#include // for BUFSIZ? this is kinda weird" echo + echo "/** luaconf.h **/" + echo + uncomment "$LUA_PATH/luaconf.h" echo - cat "$LUA_PATH/luaconf.h" decl "$LUA_PATH/lua.h" + echo decl "$LUA_PATH/lauxlib.h" + echo echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" echo "static void lite_xl_plugin_init(void *XL) {" From b26ffb473175a41d61af6d22485a23d14c9a722f Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Mon, 8 Nov 2021 12:17:50 +0800 Subject: [PATCH 11/15] add warning if the symbol cannot be exported --- scripts/generate_header.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index c4f784de..de22bb16 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -146,6 +146,7 @@ generate_api_require() { echo -e "\tfor (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)" echo -e "\t\tif (strcmp(nodes[i].name, symbol) == 0)" echo -e "\t\t\treturn nodes[i].addr;" + echo -e "\tfprintf(stderr, \"warning: %s cannot be exported.\", symbol);" echo -e "\treturn NULL;" echo "}" echo "#endif" From 68eb6810d96bd4c476a45e773209234fa896b52e Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Mon, 8 Nov 2021 12:18:13 +0800 Subject: [PATCH 12/15] update headers --- resources/lite_xl_plugin_api.h | 614 +++++++-------------------------- src/api_require.h | 1 + 2 files changed, 123 insertions(+), 492 deletions(-) diff --git a/resources/lite_xl_plugin_api.h b/resources/lite_xl_plugin_api.h index e0a9b5a7..31ffb755 100644 --- a/resources/lite_xl_plugin_api.h +++ b/resources/lite_xl_plugin_api.h @@ -18,74 +18,38 @@ This file was automatically generated. DO NOT MODIFY DIRECTLY. #include #include // for BUFSIZ? this is kinda weird - -/* -** $Id: luaconf.h,v 1.176.1.2 2013/11/21 17:26:16 roberto Exp $ -** Configuration file for Lua -** See Copyright Notice in lua.h -*/ - +/** luaconf.h **/ #ifndef lconfig_h #define lconfig_h - #include #include - - -/* -** ================================================================== -** Search for "@@" to find all configurable definitions. -** =================================================================== -*/ - - -/* -@@ LUA_ANSI controls the use of non-ansi features. -** CHANGE it (define it) if you want Lua to avoid the use of any -** non-ansi feature or library. -*/ #if !defined(LUA_ANSI) && defined(__STRICT_ANSI__) #define LUA_ANSI #endif - - #if !defined(LUA_ANSI) && defined(_WIN32) && !defined(_WIN32_WCE) -#define LUA_WIN /* enable goodies for regular Windows platforms */ +#define LUA_WIN #endif - #if defined(LUA_WIN) #define LUA_DL_DLL -#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */ +#define LUA_USE_AFORMAT #endif - - - #if defined(LUA_USE_LINUX) #define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ -#define LUA_USE_READLINE /* needs some extra libraries */ -#define LUA_USE_STRTODHEX /* assume 'strtod' handles hex formats */ -#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */ -#define LUA_USE_LONGLONG /* assume support for long long */ +#define LUA_USE_DLOPEN +#define LUA_USE_READLINE +#define LUA_USE_STRTODHEX +#define LUA_USE_AFORMAT +#define LUA_USE_LONGLONG #endif - #if defined(LUA_USE_MACOSX) #define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* does not need -ldl */ -#define LUA_USE_READLINE /* needs an extra library: -lreadline */ -#define LUA_USE_STRTODHEX /* assume 'strtod' handles hex formats */ -#define LUA_USE_AFORMAT /* assume 'printf' handles 'aA' specifiers */ -#define LUA_USE_LONGLONG /* assume support for long long */ +#define LUA_USE_DLOPEN +#define LUA_USE_READLINE +#define LUA_USE_STRTODHEX +#define LUA_USE_AFORMAT +#define LUA_USE_LONGLONG #endif - - - -/* -@@ LUA_USE_POSIX includes all functionality listed as X/Open System -@* Interfaces Extension (XSI). -** CHANGE it (define it) if your system is XSI compatible. -*/ #if defined(LUA_USE_POSIX) #define LUA_USE_MKSTEMP #define LUA_USE_ISATTY @@ -93,482 +57,144 @@ This file was automatically generated. DO NOT MODIFY DIRECTLY. #define LUA_USE_ULONGJMP #define LUA_USE_GMTIME_R #endif - - - -/* -@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for -@* Lua libraries. -@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for -@* C libraries. -** CHANGE them if your machine has a non-conventional directory -** hierarchy or if you want to install your libraries in -** non-conventional directories. -*/ -#if defined(_WIN32) /* { */ -/* -** In Windows, any exclamation mark ('!') in the path is replaced by the -** path of the directory of the executable file of the current process. -*/ -#define LUA_LDIR "!\\lua\\" -#define LUA_CDIR "!\\" -#define LUA_PATH_DEFAULT \ - LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" ".\\?.lua" -#define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll;" ".\\?.dll" - -#else /* }{ */ - -#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "/" -#define LUA_ROOT "/usr/local/" -#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR -#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR -#define LUA_PATH_DEFAULT \ - LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" "./?.lua" -#define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" -#endif /* } */ - - -/* -@@ LUA_DIRSEP is the directory separator (for submodules). -** CHANGE it if your machine does not use "/" as the directory separator -** and is not Windows. (On Windows Lua automatically uses "\".) -*/ #if defined(_WIN32) -#define LUA_DIRSEP "\\" +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_PATH_DEFAULT LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" ".\\?.lua" +#define LUA_CPATH_DEFAULT LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll;" ".\\?.dll" #else -#define LUA_DIRSEP "/" +#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "/" +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR +#define LUA_PATH_DEFAULT LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" "./?.lua" +#define LUA_CPATH_DEFAULT LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" #endif - - -/* -@@ LUA_ENV is the name of the variable that holds the current -@@ environment, used to access global names. -** CHANGE it if you do not like this name. -*/ -#define LUA_ENV "_ENV" - - -/* -@@ LUA_API is a mark for all core API functions. -@@ LUALIB_API is a mark for all auxiliary library functions. -@@ LUAMOD_API is a mark for all standard library opening functions. -** CHANGE them if you need to define those functions in some special way. -** For instance, if you want to create one Windows DLL with the core and -** the libraries, you may want to use the following definition (define -** LUA_BUILD_AS_DLL to get it). -*/ -#if defined(LUA_BUILD_AS_DLL) /* { */ - -#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif +#define LUA_ENV "_ENV" +#if defined(LUA_BUILD_AS_DLL) +#if defined(LUA_CORE) || defined(LUA_LIB) #define LUA_API __declspec(dllexport) -#else /* }{ */ +#else #define LUA_API __declspec(dllimport) -#endif /* } */ - -#else /* }{ */ - -#define LUA_API extern - -#endif /* } */ - - -/* more often than not the libs go together with the core */ -#define LUALIB_API LUA_API -#define LUAMOD_API LUALIB_API - - -/* -@@ LUAI_FUNC is a mark for all extern functions that are not to be -@* exported to outside modules. -@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables -@* that are not to be exported to outside modules (LUAI_DDEF for -@* definitions and LUAI_DDEC for declarations). -** CHANGE them if you need to mark them in some special way. Elf/gcc -** (versions 3.2 and later) mark them as "hidden" to optimize access -** when Lua is compiled as a shared library. Not all elf targets support -** this attribute. Unfortunately, gcc does not offer a way to check -** whether the target offers that support, and those without support -** give a warning about it. To avoid these warnings, change to the -** default definition. -*/ -#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ - defined(__ELF__) /* { */ -#define LUAI_FUNC __attribute__((visibility("hidden"))) extern -#define LUAI_DDEC LUAI_FUNC -#define LUAI_DDEF /* empty */ - -#else /* }{ */ -#define LUAI_FUNC extern -#define LUAI_DDEC extern -#define LUAI_DDEF /* empty */ -#endif /* } */ - - - -/* -@@ LUA_QL describes how error messages quote program elements. -** CHANGE it if you want a different appearance. -*/ -#define LUA_QL(x) "'" x "'" -#define LUA_QS LUA_QL("%s") - - -/* -@@ LUA_IDSIZE gives the maximum size for the description of the source -@* of a function in debug information. -** CHANGE it if you want a different size. -*/ -#define LUA_IDSIZE 60 - - -/* -@@ luai_writestring/luai_writeline define how 'print' prints its results. -** They are only used in libraries and the stand-alone program. (The #if -** avoids including 'stdio.h' everywhere.) -*/ +#endif +#else +#define LUA_API extern +#endif +#define LUALIB_API LUA_API +#define LUAMOD_API LUALIB_API +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && defined(__ELF__) +#define LUAI_FUNC __attribute__((visibility("hidden"))) extern +#define LUAI_DDEC LUAI_FUNC +#define LUAI_DDEF +#else +#define LUAI_FUNC extern +#define LUAI_DDEC extern +#define LUAI_DDEF +#endif +#define LUA_QL(x) "'" x "'" +#define LUA_QS LUA_QL("%s") +#define LUA_IDSIZE 60 #if defined(LUA_LIB) || defined(lua_c) #include -#define luai_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) -#define luai_writeline() (luai_writestring("\n", 1), fflush(stdout)) +#define luai_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) +#define luai_writeline() (luai_writestring("\n", 1), fflush(stdout)) #endif - -/* -@@ luai_writestringerror defines how to print error messages. -** (A format string with one argument is enough for Lua...) -*/ -#define luai_writestringerror(s,p) \ - (fprintf(stderr, (s), (p)), fflush(stderr)) - - -/* -@@ LUAI_MAXSHORTLEN is the maximum length for short strings, that is, -** strings that are internalized. (Cannot be smaller than reserved words -** or tags for metamethods, as these strings must be internalized; -** #("function") = 8, #("__newindex") = 10.) -*/ -#define LUAI_MAXSHORTLEN 40 - - - -/* -** {================================================================== -** Compatibility with previous versions -** =================================================================== -*/ - -/* -@@ LUA_COMPAT_ALL controls all compatibility options. -** You can define it to get all options, or change specific options -** to fit your specific needs. -*/ -#if defined(LUA_COMPAT_ALL) /* { */ - -/* -@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'. -** You can replace it with 'table.unpack'. -*/ +#define luai_writestringerror(s,p) (fprintf(stderr, (s), (p)), fflush(stderr)) +#define LUAI_MAXSHORTLEN 40 +#if defined(LUA_COMPAT_ALL) #define LUA_COMPAT_UNPACK - -/* -@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'. -** You can replace it with 'package.searchers'. -*/ #define LUA_COMPAT_LOADERS - -/* -@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall. -** You can call your C function directly (with light C functions). -*/ -#define lua_cpcall(L,f,u) \ - (lua_pushcfunction(L, (f)), \ - lua_pushlightuserdata(L,(u)), \ - lua_pcall(L,1,0,0)) - - -/* -@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library. -** You can rewrite 'log10(x)' as 'log(x, 10)'. -*/ +#define lua_cpcall(L,f,u) (lua_pushcfunction(L, (f)), lua_pushlightuserdata(L,(u)), lua_pcall(L,1,0,0)) #define LUA_COMPAT_LOG10 - -/* -@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base -** library. You can rewrite 'loadstring(s)' as 'load(s)'. -*/ #define LUA_COMPAT_LOADSTRING - -/* -@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library. -*/ #define LUA_COMPAT_MAXN - -/* -@@ The following macros supply trivial compatibility for some -** changes in the API. The macros themselves document how to -** change your code to avoid using them. -*/ -#define lua_strlen(L,i) lua_rawlen(L, (i)) - -#define lua_objlen(L,i) lua_rawlen(L, (i)) - -#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) -#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) - -/* -@@ LUA_COMPAT_MODULE controls compatibility with previous -** module functions 'module' (Lua) and 'luaL_register' (C). -*/ +#define lua_strlen(L,i) lua_rawlen(L, (i)) +#define lua_objlen(L,i) lua_rawlen(L, (i)) +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) +#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) #define LUA_COMPAT_MODULE - -#endif /* } */ - -/* }================================================================== */ - - - -/* -@@ LUAI_BITSINT defines the number of bits in an int. -** CHANGE here if Lua cannot automatically detect the number of bits of -** your machine. Probably you do not need to change this. -*/ -/* avoid overflows in comparison */ -#if INT_MAX-20 < 32760 /* { */ -#define LUAI_BITSINT 16 -#elif INT_MAX > 2147483640L /* }{ */ -/* int has at least 32 bits */ -#define LUAI_BITSINT 32 -#else /* }{ */ -#error "you must define LUA_BITSINT with number of bits in an integer" -#endif /* } */ - - -/* -@@ LUA_INT32 is a signed integer with exactly 32 bits. -@@ LUAI_UMEM is an unsigned integer big enough to count the total -@* memory used by Lua. -@@ LUAI_MEM is a signed integer big enough to count the total memory -@* used by Lua. -** CHANGE here if for some weird reason the default definitions are not -** good enough for your machine. Probably you do not need to change -** this. -*/ -#if LUAI_BITSINT >= 32 /* { */ -#define LUA_INT32 int -#define LUAI_UMEM size_t -#define LUAI_MEM ptrdiff_t -#else /* }{ */ -/* 16-bit ints */ -#define LUA_INT32 long -#define LUAI_UMEM unsigned long -#define LUAI_MEM long -#endif /* } */ - - -/* -@@ LUAI_MAXSTACK limits the size of the Lua stack. -** CHANGE it if you need a different limit. This limit is arbitrary; -** its only purpose is to stop Lua from consuming unlimited stack -** space (and to reserve some numbers for pseudo-indices). -*/ -#if LUAI_BITSINT >= 32 -#define LUAI_MAXSTACK 1000000 +#endif +#if INT_MAX-20 < 32760 +#define LUAI_BITSINT 16 +#elif INT_MAX > 2147483640L +#define LUAI_BITSINT 32 #else -#define LUAI_MAXSTACK 15000 +#error "you must define LUA_BITSINT with number of bits in an integer" #endif - -/* reserve some space for error handling */ -#define LUAI_FIRSTPSEUDOIDX (-LUAI_MAXSTACK - 1000) - - - - -/* -@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. -** CHANGE it if it uses too much C-stack space. -*/ -#define LUAL_BUFFERSIZE BUFSIZ - - - - -/* -** {================================================================== -@@ LUA_NUMBER is the type of numbers in Lua. -** CHANGE the following definitions only if you want to build Lua -** with a number type different from double. You may also need to -** change lua_number2int & lua_number2integer. -** =================================================================== -*/ - +#if LUAI_BITSINT >= 32 +#define LUA_INT32 int +#define LUAI_UMEM size_t +#define LUAI_MEM ptrdiff_t +#else +#define LUA_INT32 long +#define LUAI_UMEM unsigned long +#define LUAI_MEM long +#endif +#if LUAI_BITSINT >= 32 +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK 15000 +#endif +#define LUAI_FIRSTPSEUDOIDX (-LUAI_MAXSTACK - 1000) +#define LUAL_BUFFERSIZE BUFSIZ #define LUA_NUMBER_DOUBLE -#define LUA_NUMBER double - -/* -@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' -@* over a number. -*/ -#define LUAI_UACNUMBER double - - -/* -@@ LUA_NUMBER_SCAN is the format for reading numbers. -@@ LUA_NUMBER_FMT is the format for writing numbers. -@@ lua_number2str converts a number to a string. -@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. -*/ -#define LUA_NUMBER_SCAN "%lf" -#define LUA_NUMBER_FMT "%.14g" -#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) -#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ - - -/* -@@ l_mathop allows the addition of an 'l' or 'f' to all math operations -*/ -#define l_mathop(x) (x) - - -/* -@@ lua_str2number converts a decimal numeric string to a number. -@@ lua_strx2number converts an hexadecimal numeric string to a number. -** In C99, 'strtod' does both conversions. C89, however, has no function -** to convert floating hexadecimal strings to numbers. For these -** systems, you can leave 'lua_strx2number' undefined and Lua will -** provide its own implementation. -*/ -#define lua_str2number(s,p) strtod((s), (p)) - +#define LUA_NUMBER double +#define LUAI_UACNUMBER double +#define LUA_NUMBER_SCAN "%lf" +#define LUA_NUMBER_FMT "%.14g" +#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) +#define LUAI_MAXNUMBER2STR 32 +#define l_mathop(x) (x) +#define lua_str2number(s,p) strtod((s), (p)) #if defined(LUA_USE_STRTODHEX) -#define lua_strx2number(s,p) strtod((s), (p)) +#define lua_strx2number(s,p) strtod((s), (p)) #endif - - -/* -@@ The luai_num* macros define the primitive operations over numbers. -*/ - -/* the following operations need the math library */ #if defined(lobject_c) || defined(lvm_c) #include -#define luai_nummod(L,a,b) ((a) - l_mathop(floor)((a)/(b))*(b)) -#define luai_numpow(L,a,b) (l_mathop(pow)(a,b)) +#define luai_nummod(L,a,b) ((a) - l_mathop(floor)((a)/(b))*(b)) +#define luai_numpow(L,a,b) (l_mathop(pow)(a,b)) #endif - -/* these are quite standard operations */ #if defined(LUA_CORE) -#define luai_numadd(L,a,b) ((a)+(b)) -#define luai_numsub(L,a,b) ((a)-(b)) -#define luai_nummul(L,a,b) ((a)*(b)) -#define luai_numdiv(L,a,b) ((a)/(b)) -#define luai_numunm(L,a) (-(a)) -#define luai_numeq(a,b) ((a)==(b)) -#define luai_numlt(L,a,b) ((a)<(b)) -#define luai_numle(L,a,b) ((a)<=(b)) -#define luai_numisnan(L,a) (!luai_numeq((a), (a))) +#define luai_numadd(L,a,b) ((a)+(b)) +#define luai_numsub(L,a,b) ((a)-(b)) +#define luai_nummul(L,a,b) ((a)*(b)) +#define luai_numdiv(L,a,b) ((a)/(b)) +#define luai_numunm(L,a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(L,a,b) ((a)<(b)) +#define luai_numle(L,a,b) ((a)<=(b)) +#define luai_numisnan(L,a) (!luai_numeq((a), (a))) #endif - - - -/* -@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. -** CHANGE that if ptrdiff_t is not adequate on your machine. (On most -** machines, ptrdiff_t gives a good choice between int or long.) -*/ -#define LUA_INTEGER ptrdiff_t - -/* -@@ LUA_UNSIGNED is the integral type used by lua_pushunsigned/lua_tounsigned. -** It must have at least 32 bits. -*/ -#define LUA_UNSIGNED unsigned LUA_INT32 - - - -/* -** Some tricks with doubles -*/ - -#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) /* { */ -/* -** The next definitions activate some tricks to speed up the -** conversion from doubles to integer types, mainly to LUA_UNSIGNED. -** -@@ LUA_MSASMTRICK uses Microsoft assembler to avoid clashes with a -** DirectX idiosyncrasy. -** -@@ LUA_IEEE754TRICK uses a trick that should work on any machine -** using IEEE754 with a 32-bit integer type. -** -@@ LUA_IEEELL extends the trick to LUA_INTEGER; should only be -** defined when LUA_INTEGER is a 32-bit integer. -** -@@ LUA_IEEEENDIAN is the endianness of doubles in your machine -** (0 for little endian, 1 for big endian); if not defined, Lua will -** check it dynamically for LUA_IEEE754TRICK (but not for LUA_NANTRICK). -** -@@ LUA_NANTRICK controls the use of a trick to pack all types into -** a single double value, using NaN values to represent non-number -** values. The trick only works on 32-bit machines (ints and pointers -** are 32-bit values) with numbers represented as IEEE 754-2008 doubles -** with conventional endianess (12345678 or 87654321), in CPUs that do -** not produce signaling NaN values (all NaNs are quiet). -*/ - -/* Microsoft compiler on a Pentium (32 bit) ? */ -#if defined(LUA_WIN) && defined(_MSC_VER) && defined(_M_IX86) /* { */ - +#define LUA_INTEGER ptrdiff_t +#define LUA_UNSIGNED unsigned LUA_INT32 +#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) +#if defined(LUA_WIN) && defined(_MSC_VER) && defined(_M_IX86) #define LUA_MSASMTRICK -#define LUA_IEEEENDIAN 0 +#define LUA_IEEEENDIAN 0 #define LUA_NANTRICK - - -/* pentium 32 bits? */ -#elif defined(__i386__) || defined(__i386) || defined(__X86__) /* }{ */ - +#elif defined(__i386__) || defined(__i386) || defined(__X86__) #define LUA_IEEE754TRICK #define LUA_IEEELL -#define LUA_IEEEENDIAN 0 +#define LUA_IEEEENDIAN 0 #define LUA_NANTRICK - -/* pentium 64 bits? */ -#elif defined(__x86_64) /* }{ */ - +#elif defined(__x86_64) #define LUA_IEEE754TRICK -#define LUA_IEEEENDIAN 0 - -#elif defined(__POWERPC__) || defined(__ppc__) /* }{ */ - +#define LUA_IEEEENDIAN 0 +#elif defined(__POWERPC__) || defined(__ppc__) #define LUA_IEEE754TRICK -#define LUA_IEEEENDIAN 1 - -#else /* }{ */ - -/* assume IEEE754 and a 32-bit integer type */ +#define LUA_IEEEENDIAN 1 +#else #define LUA_IEEE754TRICK - -#endif /* } */ - -#endif /* } */ - -/* }================================================================== */ - - - - -/* =================================================================== */ - -/* -** Local configuration. You can use this space to add your redefinitions -** without modifying the main part of the file. -*/ - - - #endif +#endif +#endif + +/** lua.h **/ typedef struct lua_State lua_State; typedef int (*lua_CFunction) (lua_State *L); @@ -774,6 +400,9 @@ static int (*lua_gethookcount) (lua_State *L); #define LUA_MASKRET (1 << LUA_HOOKRET) #define LUA_MASKLINE (1 << LUA_HOOKLINE) #define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + +/** lauxlib.h **/ + typedef struct luaL_Reg { const char *name; lua_CFunction func; @@ -859,6 +488,7 @@ static char *(*luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); #define luaL_addsize(B,s) ((B)->n += (s)) #define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) #define LUA_FILEHANDLE "FILE*" + #define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name) static void lite_xl_plugin_init(void *XL) { void* (*symbol)(const char *) = (void* (*) (const char *)) XL; diff --git a/src/api_require.h b/src/api_require.h index 9ff56233..76e2e6ba 100644 --- a/src/api_require.h +++ b/src/api_require.h @@ -161,6 +161,7 @@ static void *api_require(const char *symbol) { for (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++) if (strcmp(nodes[i].name, symbol) == 0) return nodes[i].addr; + fprintf(stderr, "warning: %s cannot be exported.", symbol); return NULL; } #endif From b42f48782bc0be3bc2d61337b34289421e05d3fb Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Wed, 17 Nov 2021 08:58:44 +0800 Subject: [PATCH 13/15] revert system.c do not generate the exported symbols with the script --- scripts/generate_header.sh | 70 +--------------- src/api/system.c | 53 +++++++++++- src/api_require.h | 167 ------------------------------------- 3 files changed, 53 insertions(+), 237 deletions(-) delete mode 100644 src/api_require.h diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index de22bb16..3613de17 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -42,10 +42,6 @@ import_sym() { grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" } -export_sym() { - grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\t\tEXPORT_SYMBOL(\3),/" -} - decl() { echo "/** $(basename "$1") **/" echo @@ -65,11 +61,6 @@ decl_import() { uncomment $1 | onelineize | import_sym } -decl_export() { - uncomment $1 | onelineize | export_sym -} - - generate_header() { local LUA_PATH="$1" echo "#ifndef LITE_XL_PLUGIN_API" @@ -113,58 +104,14 @@ generate_header() { echo "#endif" } -generate_api_require() { - local LUA_PATH="$1" - echo "#ifndef API_REQUIRE_H" - echo "#define API_REQUIRE_H" - echo "/**" - echo "This file contains the function api_require that" - echo "returns a function pointer with it's corresponding name." - echo - echo "This file is automatically generated. DO NOT MODIFY." - echo "**/" - echo - echo - echo "#include " - echo "#include " - echo '#include "lua.h"' - echo '#include "lauxlib.h"' - echo - echo "typedef struct fnptr_s {" - echo -e "\tconst char* name;" - echo -e "\tvoid *addr;" - echo "} fnptr_t;" - echo - echo "#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) }" - echo "static void *api_require(const char *symbol) {" - echo -e "\tstatic fnptr_t nodes[] = {" - - decl_export "$LUA_PATH/lua.h" - decl_export "$LUA_PATH/lauxlib.h" - - echo -e "\t};" - echo -e "\tfor (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)" - echo -e "\t\tif (strcmp(nodes[i].name, symbol) == 0)" - echo -e "\t\t\treturn nodes[i].addr;" - echo -e "\tfprintf(stderr, \"warning: %s cannot be exported.\", symbol);" - echo -e "\treturn NULL;" - echo "}" - echo "#endif" -} - show_help() { echo -e "Usage: $0 prefix" echo echo -e "Available options:" - echo - echo -e "-a\t--api-header\tGenerate lite_xl_plugin_api.h" - echo -e "-b\t--api-require\tGenerate api_require.h" echo -e "-p\t--prefix\tSet prefix (where to find lua.h and lauxlib.h)" } main() { - local header=0 - local require=0 local prefix="" for i in "$@"; do @@ -173,14 +120,6 @@ main() { show_help exit 0 ;; - -a|--api-header) - header=1 - shift - ;; - -b|--api-require) - require=1 - shift - ;; -p|--prefix) prefix="$2" shift @@ -191,14 +130,7 @@ main() { esac done - if [[ "$header" -eq 1 ]]; then - generate_header "$prefix" - elif [[ "$require" -eq 1 ]]; then - generate_api_require "$prefix" - else - show_help - exit 1 - fi + generate_header "$prefix" } main "$@" diff --git a/src/api/system.c b/src/api/system.c index e5ada1f9..f42a46d2 100644 --- a/src/api/system.c +++ b/src/api/system.c @@ -7,7 +7,6 @@ #include #include "api.h" #include "rencache.h" -#include "api_require.h" #ifdef _WIN32 #include #include @@ -652,6 +651,58 @@ static int f_set_window_opacity(lua_State *L) { return 1; } +typedef struct lua_function_node { + const char *symbol; + void *address; +} lua_function_node; + +#define P(FUNC) { "lua_" #FUNC, (void*)(lua_##FUNC) } +#define U(FUNC) { "luaL_" #FUNC, (void*)(luaL_##FUNC) } +static void* api_require(const char* symbol) { + static lua_function_node nodes[] = { + P(atpanic), P(checkstack), + P(close), P(concat), P(copy), P(createtable), P(dump), + P(error), P(gc), P(getallocf), P(getfield), + P(gethook), P(gethookcount), P(gethookmask), P(getinfo), P(getlocal), + P(getmetatable), P(getstack), P(gettable), P(gettop), P(getupvalue), + P(insert), P(isnumber), P(isstring), P(isuserdata), + P(load), P(newstate), P(newthread), P(newuserdata), P(next), + P(pushboolean), P(pushcclosure), P(pushfstring), P(pushinteger), + P(pushlightuserdata), P(pushlstring), P(pushnil), P(pushnumber), + P(pushstring), P(pushthread), P(pushvalue), + P(pushvfstring), P(rawequal), P(rawget), P(rawgeti), + P(rawset), P(rawseti), P(remove), P(replace), P(resume), + P(setallocf), P(setfield), P(sethook), P(setlocal), + P(setmetatable), P(settable), P(settop), P(setupvalue), + P(status), P(tocfunction), P(tointegerx), P(tolstring), P(toboolean), + P(tonumberx), P(topointer), P(tothread), P(touserdata), + P(type), P(typename), P(upvalueid), P(upvaluejoin), P(version), P(xmove), + U(getmetafield), U(callmeta), U(argerror), U(checknumber), U(optnumber), + U(checkinteger), U(checkstack), U(checktype), U(checkany), + U(newmetatable), U(setmetatable), U(testudata), U(checkudata), U(where), + U(error), U(fileresult), U(execresult), U(ref), U(unref), U(loadstring), + U(newstate), U(setfuncs), U(buffinit), U(addlstring), U(addstring), + U(addvalue), U(pushresult), + #if LUA_VERSION_NUM >= 502 + P(absindex), P(arith), P(callk), P(compare), P(getctx), P(getglobal), P(getuservalue), + P(len), P(pcallk), P(pushunsigned), P(rawgetp), P(rawlen), P(rawsetp), P(setglobal), + P(iscfunction), P(setuservalue), P(tounsignedx), P(yieldk), + U(checkversion_), U(tolstring), U(checkunsigned), U(len), U(getsubtable), U(prepbuffsize), + U(pushresultsize), U(buffinitsize), U(checklstring), U(checkoption), U(gsub), U(loadbufferx), + U(loadfilex), U(optinteger), U(optlstring), U(optunsigned), U(requiref), U(traceback) + #else + P(objlen) + #endif + + }; + for (int i = 0; i < sizeof(nodes) / sizeof(lua_function_node); ++i) { + if (strcmp(nodes[i].symbol, symbol) == 0) + return nodes[i].address; + } + fprintf(stderr, "WARNING: %s is not available\n", symbol); + return NULL; +} + static int f_load_native_plugin(lua_State *L) { char entrypoint_name[512]; entrypoint_name[sizeof(entrypoint_name) - 1] = '\0'; int result; diff --git a/src/api_require.h b/src/api_require.h deleted file mode 100644 index 76e2e6ba..00000000 --- a/src/api_require.h +++ /dev/null @@ -1,167 +0,0 @@ -#ifndef API_REQUIRE_H -#define API_REQUIRE_H -/** -This file contains the function api_require that -returns a function pointer with it's corresponding name. - -This file is automatically generated. DO NOT MODIFY. -**/ - - -#include -#include -#include "lua.h" -#include "lauxlib.h" - -typedef struct fnptr_s { - const char* name; - void *addr; -} fnptr_t; - -#define EXPORT_SYMBOL(SYM) { #SYM, (void*)(SYM) } -static void *api_require(const char *symbol) { - static fnptr_t nodes[] = { - EXPORT_SYMBOL(lua_newstate), - EXPORT_SYMBOL(lua_close), - EXPORT_SYMBOL(lua_newthread), - EXPORT_SYMBOL(lua_atpanic), - EXPORT_SYMBOL(lua_version), - EXPORT_SYMBOL(lua_absindex), - EXPORT_SYMBOL(lua_gettop), - EXPORT_SYMBOL(lua_settop), - EXPORT_SYMBOL(lua_pushvalue), - EXPORT_SYMBOL(lua_remove), - EXPORT_SYMBOL(lua_insert), - EXPORT_SYMBOL(lua_replace), - EXPORT_SYMBOL(lua_copy), - EXPORT_SYMBOL(lua_checkstack), - EXPORT_SYMBOL(lua_xmove), - EXPORT_SYMBOL(lua_isnumber), - EXPORT_SYMBOL(lua_isstring), - EXPORT_SYMBOL(lua_iscfunction), - EXPORT_SYMBOL(lua_isuserdata), - EXPORT_SYMBOL(lua_type), - EXPORT_SYMBOL(lua_typename), - EXPORT_SYMBOL(lua_tonumberx), - EXPORT_SYMBOL(lua_tointegerx), - EXPORT_SYMBOL(lua_tounsignedx), - EXPORT_SYMBOL(lua_toboolean), - EXPORT_SYMBOL(lua_tolstring), - EXPORT_SYMBOL(lua_rawlen), - EXPORT_SYMBOL(lua_tocfunction), - EXPORT_SYMBOL(lua_touserdata), - EXPORT_SYMBOL(lua_tothread), - EXPORT_SYMBOL(lua_topointer), - EXPORT_SYMBOL(lua_arith), - EXPORT_SYMBOL(lua_rawequal), - EXPORT_SYMBOL(lua_compare), - EXPORT_SYMBOL(lua_pushnil), - EXPORT_SYMBOL(lua_pushnumber), - EXPORT_SYMBOL(lua_pushinteger), - EXPORT_SYMBOL(lua_pushunsigned), - EXPORT_SYMBOL(lua_pushlstring), - EXPORT_SYMBOL(lua_pushstring), - EXPORT_SYMBOL(lua_pushvfstring), - EXPORT_SYMBOL(lua_pushfstring), - EXPORT_SYMBOL(lua_pushcclosure), - EXPORT_SYMBOL(lua_pushboolean), - EXPORT_SYMBOL(lua_pushlightuserdata), - EXPORT_SYMBOL(lua_pushthread), - EXPORT_SYMBOL(lua_getglobal), - EXPORT_SYMBOL(lua_gettable), - EXPORT_SYMBOL(lua_getfield), - EXPORT_SYMBOL(lua_rawget), - EXPORT_SYMBOL(lua_rawgeti), - EXPORT_SYMBOL(lua_rawgetp), - EXPORT_SYMBOL(lua_createtable), - EXPORT_SYMBOL(lua_newuserdata), - EXPORT_SYMBOL(lua_getmetatable), - EXPORT_SYMBOL(lua_getuservalue), - EXPORT_SYMBOL(lua_setglobal), - EXPORT_SYMBOL(lua_settable), - EXPORT_SYMBOL(lua_setfield), - EXPORT_SYMBOL(lua_rawset), - EXPORT_SYMBOL(lua_rawseti), - EXPORT_SYMBOL(lua_rawsetp), - EXPORT_SYMBOL(lua_setmetatable), - EXPORT_SYMBOL(lua_setuservalue), - EXPORT_SYMBOL(lua_callk), - EXPORT_SYMBOL(lua_getctx), - EXPORT_SYMBOL(lua_pcallk), - EXPORT_SYMBOL(lua_load), - EXPORT_SYMBOL(lua_dump), - EXPORT_SYMBOL(lua_yieldk), - EXPORT_SYMBOL(lua_resume), - EXPORT_SYMBOL(lua_status), - EXPORT_SYMBOL(lua_gc), - EXPORT_SYMBOL(lua_error), - EXPORT_SYMBOL(lua_next), - EXPORT_SYMBOL(lua_concat), - EXPORT_SYMBOL(lua_len), - EXPORT_SYMBOL(lua_getallocf), - EXPORT_SYMBOL(lua_setallocf), - EXPORT_SYMBOL(lua_getstack), - EXPORT_SYMBOL(lua_getinfo), - EXPORT_SYMBOL(lua_getlocal), - EXPORT_SYMBOL(lua_setlocal), - EXPORT_SYMBOL(lua_getupvalue), - EXPORT_SYMBOL(lua_setupvalue), - EXPORT_SYMBOL(lua_upvalueid), - EXPORT_SYMBOL(lua_upvaluejoin), - EXPORT_SYMBOL(lua_sethook), - EXPORT_SYMBOL(lua_gethook), - EXPORT_SYMBOL(lua_gethookmask), - EXPORT_SYMBOL(lua_gethookcount), - EXPORT_SYMBOL(luaL_checkversion_), - EXPORT_SYMBOL(luaL_getmetafield), - EXPORT_SYMBOL(luaL_callmeta), - EXPORT_SYMBOL(luaL_tolstring), - EXPORT_SYMBOL(luaL_argerror), - EXPORT_SYMBOL(luaL_checklstring), - EXPORT_SYMBOL(luaL_optlstring), - EXPORT_SYMBOL(luaL_checknumber), - EXPORT_SYMBOL(luaL_optnumber), - EXPORT_SYMBOL(luaL_checkinteger), - EXPORT_SYMBOL(luaL_optinteger), - EXPORT_SYMBOL(luaL_checkunsigned), - EXPORT_SYMBOL(luaL_optunsigned), - EXPORT_SYMBOL(luaL_checkstack), - EXPORT_SYMBOL(luaL_checktype), - EXPORT_SYMBOL(luaL_checkany), - EXPORT_SYMBOL(luaL_newmetatable), - EXPORT_SYMBOL(luaL_setmetatable), - EXPORT_SYMBOL(luaL_testudata), - EXPORT_SYMBOL(luaL_checkudata), - EXPORT_SYMBOL(luaL_where), - EXPORT_SYMBOL(luaL_error), - EXPORT_SYMBOL(luaL_checkoption), - EXPORT_SYMBOL(luaL_fileresult), - EXPORT_SYMBOL(luaL_execresult), - EXPORT_SYMBOL(luaL_ref), - EXPORT_SYMBOL(luaL_unref), - EXPORT_SYMBOL(luaL_loadfilex), - EXPORT_SYMBOL(luaL_loadbufferx), - EXPORT_SYMBOL(luaL_loadstring), - EXPORT_SYMBOL(luaL_newstate), - EXPORT_SYMBOL(luaL_len), - EXPORT_SYMBOL(luaL_gsub), - EXPORT_SYMBOL(luaL_setfuncs), - EXPORT_SYMBOL(luaL_getsubtable), - EXPORT_SYMBOL(luaL_traceback), - EXPORT_SYMBOL(luaL_requiref), - EXPORT_SYMBOL(luaL_buffinit), - EXPORT_SYMBOL(luaL_prepbuffsize), - EXPORT_SYMBOL(luaL_addlstring), - EXPORT_SYMBOL(luaL_addstring), - EXPORT_SYMBOL(luaL_addvalue), - EXPORT_SYMBOL(luaL_pushresult), - EXPORT_SYMBOL(luaL_pushresultsize), - EXPORT_SYMBOL(luaL_buffinitsize), - }; - for (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++) - if (strcmp(nodes[i].name, symbol) == 0) - return nodes[i].addr; - fprintf(stderr, "warning: %s cannot be exported.", symbol); - return NULL; -} -#endif From aff1261b08a8e106a0e8ccd7be7499b6bb11a078 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Wed, 1 Dec 2021 20:41:27 +0800 Subject: [PATCH 14/15] move NULL check to import side --- scripts/generate_header.sh | 10 +++++++++- src/api/system.c | 1 - 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/generate_header.sh b/scripts/generate_header.sh index 3613de17..8d5da527 100755 --- a/scripts/generate_header.sh +++ b/scripts/generate_header.sh @@ -38,6 +38,11 @@ ptrize() { grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static\t\2(*\3)\t(\4);/" } +# create a stub function that warns user when calling it +makestub() { + grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/static\t\2\t__lite_xl_fallback_\3\t(\4) { fputs(\"warning: \3 is a stub\", stderr); }/" +} + import_sym() { grep '^LUA' | grep -v "$IGNORE_SYM" | sed -e "s/$sym_regex/\tIMPORT_SYMBOL(\3, \2, \4);/" } @@ -55,6 +60,8 @@ decl() { ptrize <<< "$header1" # defines (grep '^#' | grep -v "$IGNORE_SYM") <<< "$header" + # stubs + makestub <<< "$header1" } decl_import() { @@ -93,7 +100,7 @@ generate_header() { decl "$LUA_PATH/lauxlib.h" echo - echo "#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)" + echo "#define IMPORT_SYMBOL(name, ret, ...) name = (name = (ret (*) (__VA_ARGS__)) symbol(#name), name == NULL ? &__lite_xl_fallback_##name : name)" echo "static void lite_xl_plugin_init(void *XL) {" echo -e "\tvoid* (*symbol)(const char *) = (void* (*) (const char *)) XL;" @@ -134,3 +141,4 @@ main() { } main "$@" +# create a stub function that warns user when calling it diff --git a/src/api/system.c b/src/api/system.c index f42a46d2..70b5b01c 100644 --- a/src/api/system.c +++ b/src/api/system.c @@ -699,7 +699,6 @@ static void* api_require(const char* symbol) { if (strcmp(nodes[i].symbol, symbol) == 0) return nodes[i].address; } - fprintf(stderr, "WARNING: %s is not available\n", symbol); return NULL; } From d307c57d0531084cdd0e17aa3ee457d63a10cf54 Mon Sep 17 00:00:00 2001 From: takase1121 <20792268+takase1121@users.noreply.github.com> Date: Wed, 1 Dec 2021 20:44:17 +0800 Subject: [PATCH 15/15] update header --- resources/lite_xl_plugin_api.h | 138 ++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/resources/lite_xl_plugin_api.h b/resources/lite_xl_plugin_api.h index 31ffb755..285720c4 100644 --- a/resources/lite_xl_plugin_api.h +++ b/resources/lite_xl_plugin_api.h @@ -400,6 +400,97 @@ static int (*lua_gethookcount) (lua_State *L); #define LUA_MASKRET (1 << LUA_HOOKRET) #define LUA_MASKLINE (1 << LUA_HOOKLINE) #define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) +static lua_State * __lite_xl_fallback_lua_newstate (lua_Alloc f, void *ud) { fputs("warning: lua_newstate is a stub", stderr); } +static void __lite_xl_fallback_lua_close (lua_State *L) { fputs("warning: lua_close is a stub", stderr); } +static lua_State * __lite_xl_fallback_lua_newthread (lua_State *L) { fputs("warning: lua_newthread is a stub", stderr); } +static lua_CFunction __lite_xl_fallback_lua_atpanic (lua_State *L, lua_CFunction panicf) { fputs("warning: lua_atpanic is a stub", stderr); } +static const lua_Number * __lite_xl_fallback_lua_version (lua_State *L) { fputs("warning: lua_version is a stub", stderr); } +static int __lite_xl_fallback_lua_absindex (lua_State *L, int idx) { fputs("warning: lua_absindex is a stub", stderr); } +static int __lite_xl_fallback_lua_gettop (lua_State *L) { fputs("warning: lua_gettop is a stub", stderr); } +static void __lite_xl_fallback_lua_settop (lua_State *L, int idx) { fputs("warning: lua_settop is a stub", stderr); } +static void __lite_xl_fallback_lua_pushvalue (lua_State *L, int idx) { fputs("warning: lua_pushvalue is a stub", stderr); } +static void __lite_xl_fallback_lua_remove (lua_State *L, int idx) { fputs("warning: lua_remove is a stub", stderr); } +static void __lite_xl_fallback_lua_insert (lua_State *L, int idx) { fputs("warning: lua_insert is a stub", stderr); } +static void __lite_xl_fallback_lua_replace (lua_State *L, int idx) { fputs("warning: lua_replace is a stub", stderr); } +static void __lite_xl_fallback_lua_copy (lua_State *L, int fromidx, int toidx) { fputs("warning: lua_copy is a stub", stderr); } +static int __lite_xl_fallback_lua_checkstack (lua_State *L, int sz) { fputs("warning: lua_checkstack is a stub", stderr); } +static void __lite_xl_fallback_lua_xmove (lua_State *from, lua_State *to, int n) { fputs("warning: lua_xmove is a stub", stderr); } +static int __lite_xl_fallback_lua_isnumber (lua_State *L, int idx) { fputs("warning: lua_isnumber is a stub", stderr); } +static int __lite_xl_fallback_lua_isstring (lua_State *L, int idx) { fputs("warning: lua_isstring is a stub", stderr); } +static int __lite_xl_fallback_lua_iscfunction (lua_State *L, int idx) { fputs("warning: lua_iscfunction is a stub", stderr); } +static int __lite_xl_fallback_lua_isuserdata (lua_State *L, int idx) { fputs("warning: lua_isuserdata is a stub", stderr); } +static int __lite_xl_fallback_lua_type (lua_State *L, int idx) { fputs("warning: lua_type is a stub", stderr); } +static const char * __lite_xl_fallback_lua_typename (lua_State *L, int tp) { fputs("warning: lua_typename is a stub", stderr); } +static lua_Number __lite_xl_fallback_lua_tonumberx (lua_State *L, int idx, int *isnum) { fputs("warning: lua_tonumberx is a stub", stderr); } +static lua_Integer __lite_xl_fallback_lua_tointegerx (lua_State *L, int idx, int *isnum) { fputs("warning: lua_tointegerx is a stub", stderr); } +static lua_Unsigned __lite_xl_fallback_lua_tounsignedx (lua_State *L, int idx, int *isnum) { fputs("warning: lua_tounsignedx is a stub", stderr); } +static int __lite_xl_fallback_lua_toboolean (lua_State *L, int idx) { fputs("warning: lua_toboolean is a stub", stderr); } +static const char * __lite_xl_fallback_lua_tolstring (lua_State *L, int idx, size_t *len) { fputs("warning: lua_tolstring is a stub", stderr); } +static size_t __lite_xl_fallback_lua_rawlen (lua_State *L, int idx) { fputs("warning: lua_rawlen is a stub", stderr); } +static lua_CFunction __lite_xl_fallback_lua_tocfunction (lua_State *L, int idx) { fputs("warning: lua_tocfunction is a stub", stderr); } +static void * __lite_xl_fallback_lua_touserdata (lua_State *L, int idx) { fputs("warning: lua_touserdata is a stub", stderr); } +static lua_State * __lite_xl_fallback_lua_tothread (lua_State *L, int idx) { fputs("warning: lua_tothread is a stub", stderr); } +static const void * __lite_xl_fallback_lua_topointer (lua_State *L, int idx) { fputs("warning: lua_topointer is a stub", stderr); } +static void __lite_xl_fallback_lua_arith (lua_State *L, int op) { fputs("warning: lua_arith is a stub", stderr); } +static int __lite_xl_fallback_lua_rawequal (lua_State *L, int idx1, int idx2) { fputs("warning: lua_rawequal is a stub", stderr); } +static int __lite_xl_fallback_lua_compare (lua_State *L, int idx1, int idx2, int op) { fputs("warning: lua_compare is a stub", stderr); } +static void __lite_xl_fallback_lua_pushnil (lua_State *L) { fputs("warning: lua_pushnil is a stub", stderr); } +static void __lite_xl_fallback_lua_pushnumber (lua_State *L, lua_Number n) { fputs("warning: lua_pushnumber is a stub", stderr); } +static void __lite_xl_fallback_lua_pushinteger (lua_State *L, lua_Integer n) { fputs("warning: lua_pushinteger is a stub", stderr); } +static void __lite_xl_fallback_lua_pushunsigned (lua_State *L, lua_Unsigned n) { fputs("warning: lua_pushunsigned is a stub", stderr); } +static const char * __lite_xl_fallback_lua_pushlstring (lua_State *L, const char *s, size_t l) { fputs("warning: lua_pushlstring is a stub", stderr); } +static const char * __lite_xl_fallback_lua_pushstring (lua_State *L, const char *s) { fputs("warning: lua_pushstring is a stub", stderr); } +static const char * __lite_xl_fallback_lua_pushvfstring (lua_State *L, const char *fmt, va_list argp) { fputs("warning: lua_pushvfstring is a stub", stderr); } +static const char * __lite_xl_fallback_lua_pushfstring (lua_State *L, const char *fmt, ...) { fputs("warning: lua_pushfstring is a stub", stderr); } +static void __lite_xl_fallback_lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { fputs("warning: lua_pushcclosure is a stub", stderr); } +static void __lite_xl_fallback_lua_pushboolean (lua_State *L, int b) { fputs("warning: lua_pushboolean is a stub", stderr); } +static void __lite_xl_fallback_lua_pushlightuserdata (lua_State *L, void *p) { fputs("warning: lua_pushlightuserdata is a stub", stderr); } +static int __lite_xl_fallback_lua_pushthread (lua_State *L) { fputs("warning: lua_pushthread is a stub", stderr); } +static void __lite_xl_fallback_lua_getglobal (lua_State *L, const char *var) { fputs("warning: lua_getglobal is a stub", stderr); } +static void __lite_xl_fallback_lua_gettable (lua_State *L, int idx) { fputs("warning: lua_gettable is a stub", stderr); } +static void __lite_xl_fallback_lua_getfield (lua_State *L, int idx, const char *k) { fputs("warning: lua_getfield is a stub", stderr); } +static void __lite_xl_fallback_lua_rawget (lua_State *L, int idx) { fputs("warning: lua_rawget is a stub", stderr); } +static void __lite_xl_fallback_lua_rawgeti (lua_State *L, int idx, int n) { fputs("warning: lua_rawgeti is a stub", stderr); } +static void __lite_xl_fallback_lua_rawgetp (lua_State *L, int idx, const void *p) { fputs("warning: lua_rawgetp is a stub", stderr); } +static void __lite_xl_fallback_lua_createtable (lua_State *L, int narr, int nrec) { fputs("warning: lua_createtable is a stub", stderr); } +static void * __lite_xl_fallback_lua_newuserdata (lua_State *L, size_t sz) { fputs("warning: lua_newuserdata is a stub", stderr); } +static int __lite_xl_fallback_lua_getmetatable (lua_State *L, int objindex) { fputs("warning: lua_getmetatable is a stub", stderr); } +static void __lite_xl_fallback_lua_getuservalue (lua_State *L, int idx) { fputs("warning: lua_getuservalue is a stub", stderr); } +static void __lite_xl_fallback_lua_setglobal (lua_State *L, const char *var) { fputs("warning: lua_setglobal is a stub", stderr); } +static void __lite_xl_fallback_lua_settable (lua_State *L, int idx) { fputs("warning: lua_settable is a stub", stderr); } +static void __lite_xl_fallback_lua_setfield (lua_State *L, int idx, const char *k) { fputs("warning: lua_setfield is a stub", stderr); } +static void __lite_xl_fallback_lua_rawset (lua_State *L, int idx) { fputs("warning: lua_rawset is a stub", stderr); } +static void __lite_xl_fallback_lua_rawseti (lua_State *L, int idx, int n) { fputs("warning: lua_rawseti is a stub", stderr); } +static void __lite_xl_fallback_lua_rawsetp (lua_State *L, int idx, const void *p) { fputs("warning: lua_rawsetp is a stub", stderr); } +static int __lite_xl_fallback_lua_setmetatable (lua_State *L, int objindex) { fputs("warning: lua_setmetatable is a stub", stderr); } +static void __lite_xl_fallback_lua_setuservalue (lua_State *L, int idx) { fputs("warning: lua_setuservalue is a stub", stderr); } +static void __lite_xl_fallback_lua_callk (lua_State *L, int nargs, int nresults, int ctx, lua_CFunction k) { fputs("warning: lua_callk is a stub", stderr); } +static int __lite_xl_fallback_lua_getctx (lua_State *L, int *ctx) { fputs("warning: lua_getctx is a stub", stderr); } +static int __lite_xl_fallback_lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, int ctx, lua_CFunction k) { fputs("warning: lua_pcallk is a stub", stderr); } +static int __lite_xl_fallback_lua_load (lua_State *L, lua_Reader reader, void *dt, const char *chunkname, const char *mode) { fputs("warning: lua_load is a stub", stderr); } +static int __lite_xl_fallback_lua_dump (lua_State *L, lua_Writer writer, void *data) { fputs("warning: lua_dump is a stub", stderr); } +static int __lite_xl_fallback_lua_yieldk (lua_State *L, int nresults, int ctx, lua_CFunction k) { fputs("warning: lua_yieldk is a stub", stderr); } +static int __lite_xl_fallback_lua_resume (lua_State *L, lua_State *from, int narg) { fputs("warning: lua_resume is a stub", stderr); } +static int __lite_xl_fallback_lua_status (lua_State *L) { fputs("warning: lua_status is a stub", stderr); } +static int __lite_xl_fallback_lua_gc (lua_State *L, int what, int data) { fputs("warning: lua_gc is a stub", stderr); } +static int __lite_xl_fallback_lua_error (lua_State *L) { fputs("warning: lua_error is a stub", stderr); } +static int __lite_xl_fallback_lua_next (lua_State *L, int idx) { fputs("warning: lua_next is a stub", stderr); } +static void __lite_xl_fallback_lua_concat (lua_State *L, int n) { fputs("warning: lua_concat is a stub", stderr); } +static void __lite_xl_fallback_lua_len (lua_State *L, int idx) { fputs("warning: lua_len is a stub", stderr); } +static lua_Alloc __lite_xl_fallback_lua_getallocf (lua_State *L, void **ud) { fputs("warning: lua_getallocf is a stub", stderr); } +static void __lite_xl_fallback_lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { fputs("warning: lua_setallocf is a stub", stderr); } +static int __lite_xl_fallback_lua_getstack (lua_State *L, int level, lua_Debug *ar) { fputs("warning: lua_getstack is a stub", stderr); } +static int __lite_xl_fallback_lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { fputs("warning: lua_getinfo is a stub", stderr); } +static const char * __lite_xl_fallback_lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { fputs("warning: lua_getlocal is a stub", stderr); } +static const char * __lite_xl_fallback_lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { fputs("warning: lua_setlocal is a stub", stderr); } +static const char * __lite_xl_fallback_lua_getupvalue (lua_State *L, int funcindex, int n) { fputs("warning: lua_getupvalue is a stub", stderr); } +static const char * __lite_xl_fallback_lua_setupvalue (lua_State *L, int funcindex, int n) { fputs("warning: lua_setupvalue is a stub", stderr); } +static void * __lite_xl_fallback_lua_upvalueid (lua_State *L, int fidx, int n) { fputs("warning: lua_upvalueid is a stub", stderr); } +static void __lite_xl_fallback_lua_upvaluejoin (lua_State *L, int fidx1, int n1, int fidx2, int n2) { fputs("warning: lua_upvaluejoin is a stub", stderr); } +static int __lite_xl_fallback_lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { fputs("warning: lua_sethook is a stub", stderr); } +static lua_Hook __lite_xl_fallback_lua_gethook (lua_State *L) { fputs("warning: lua_gethook is a stub", stderr); } +static int __lite_xl_fallback_lua_gethookmask (lua_State *L) { fputs("warning: lua_gethookmask is a stub", stderr); } +static int __lite_xl_fallback_lua_gethookcount (lua_State *L) { fputs("warning: lua_gethookcount is a stub", stderr); } /** lauxlib.h **/ @@ -488,8 +579,53 @@ static char *(*luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); #define luaL_addsize(B,s) ((B)->n += (s)) #define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) #define LUA_FILEHANDLE "FILE*" +static void __lite_xl_fallback_luaL_checkversion_ (lua_State *L, lua_Number ver) { fputs("warning: luaL_checkversion_ is a stub", stderr); } +static int __lite_xl_fallback_luaL_getmetafield (lua_State *L, int obj, const char *e) { fputs("warning: luaL_getmetafield is a stub", stderr); } +static int __lite_xl_fallback_luaL_callmeta (lua_State *L, int obj, const char *e) { fputs("warning: luaL_callmeta is a stub", stderr); } +static const char * __lite_xl_fallback_luaL_tolstring (lua_State *L, int idx, size_t *len) { fputs("warning: luaL_tolstring is a stub", stderr); } +static int __lite_xl_fallback_luaL_argerror (lua_State *L, int numarg, const char *extramsg) { fputs("warning: luaL_argerror is a stub", stderr); } +static const char * __lite_xl_fallback_luaL_checklstring (lua_State *L, int numArg, size_t *l) { fputs("warning: luaL_checklstring is a stub", stderr); } +static const char * __lite_xl_fallback_luaL_optlstring (lua_State *L, int numArg, const char *def, size_t *l) { fputs("warning: luaL_optlstring is a stub", stderr); } +static lua_Number __lite_xl_fallback_luaL_checknumber (lua_State *L, int numArg) { fputs("warning: luaL_checknumber is a stub", stderr); } +static lua_Number __lite_xl_fallback_luaL_optnumber (lua_State *L, int nArg, lua_Number def) { fputs("warning: luaL_optnumber is a stub", stderr); } +static lua_Integer __lite_xl_fallback_luaL_checkinteger (lua_State *L, int numArg) { fputs("warning: luaL_checkinteger is a stub", stderr); } +static lua_Integer __lite_xl_fallback_luaL_optinteger (lua_State *L, int nArg, lua_Integer def) { fputs("warning: luaL_optinteger is a stub", stderr); } +static lua_Unsigned __lite_xl_fallback_luaL_checkunsigned (lua_State *L, int numArg) { fputs("warning: luaL_checkunsigned is a stub", stderr); } +static lua_Unsigned __lite_xl_fallback_luaL_optunsigned (lua_State *L, int numArg, lua_Unsigned def) { fputs("warning: luaL_optunsigned is a stub", stderr); } +static void __lite_xl_fallback_luaL_checkstack (lua_State *L, int sz, const char *msg) { fputs("warning: luaL_checkstack is a stub", stderr); } +static void __lite_xl_fallback_luaL_checktype (lua_State *L, int narg, int t) { fputs("warning: luaL_checktype is a stub", stderr); } +static void __lite_xl_fallback_luaL_checkany (lua_State *L, int narg) { fputs("warning: luaL_checkany is a stub", stderr); } +static int __lite_xl_fallback_luaL_newmetatable (lua_State *L, const char *tname) { fputs("warning: luaL_newmetatable is a stub", stderr); } +static void __lite_xl_fallback_luaL_setmetatable (lua_State *L, const char *tname) { fputs("warning: luaL_setmetatable is a stub", stderr); } +static void * __lite_xl_fallback_luaL_testudata (lua_State *L, int ud, const char *tname) { fputs("warning: luaL_testudata is a stub", stderr); } +static void * __lite_xl_fallback_luaL_checkudata (lua_State *L, int ud, const char *tname) { fputs("warning: luaL_checkudata is a stub", stderr); } +static void __lite_xl_fallback_luaL_where (lua_State *L, int lvl) { fputs("warning: luaL_where is a stub", stderr); } +static int __lite_xl_fallback_luaL_error (lua_State *L, const char *fmt, ...) { fputs("warning: luaL_error is a stub", stderr); } +static int __lite_xl_fallback_luaL_checkoption (lua_State *L, int narg, const char *def, const char *const lst[]) { fputs("warning: luaL_checkoption is a stub", stderr); } +static int __lite_xl_fallback_luaL_fileresult (lua_State *L, int stat, const char *fname) { fputs("warning: luaL_fileresult is a stub", stderr); } +static int __lite_xl_fallback_luaL_execresult (lua_State *L, int stat) { fputs("warning: luaL_execresult is a stub", stderr); } +static int __lite_xl_fallback_luaL_ref (lua_State *L, int t) { fputs("warning: luaL_ref is a stub", stderr); } +static void __lite_xl_fallback_luaL_unref (lua_State *L, int t, int ref) { fputs("warning: luaL_unref is a stub", stderr); } +static int __lite_xl_fallback_luaL_loadfilex (lua_State *L, const char *filename, const char *mode) { fputs("warning: luaL_loadfilex is a stub", stderr); } +static int __lite_xl_fallback_luaL_loadbufferx (lua_State *L, const char *buff, size_t sz, const char *name, const char *mode) { fputs("warning: luaL_loadbufferx is a stub", stderr); } +static int __lite_xl_fallback_luaL_loadstring (lua_State *L, const char *s) { fputs("warning: luaL_loadstring is a stub", stderr); } +static lua_State * __lite_xl_fallback_luaL_newstate (void) { fputs("warning: luaL_newstate is a stub", stderr); } +static int __lite_xl_fallback_luaL_len (lua_State *L, int idx) { fputs("warning: luaL_len is a stub", stderr); } +static const char * __lite_xl_fallback_luaL_gsub (lua_State *L, const char *s, const char *p, const char *r) { fputs("warning: luaL_gsub is a stub", stderr); } +static void __lite_xl_fallback_luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { fputs("warning: luaL_setfuncs is a stub", stderr); } +static int __lite_xl_fallback_luaL_getsubtable (lua_State *L, int idx, const char *fname) { fputs("warning: luaL_getsubtable is a stub", stderr); } +static void __lite_xl_fallback_luaL_traceback (lua_State *L, lua_State *L1, const char *msg, int level) { fputs("warning: luaL_traceback is a stub", stderr); } +static void __lite_xl_fallback_luaL_requiref (lua_State *L, const char *modname, lua_CFunction openf, int glb) { fputs("warning: luaL_requiref is a stub", stderr); } +static void __lite_xl_fallback_luaL_buffinit (lua_State *L, luaL_Buffer *B) { fputs("warning: luaL_buffinit is a stub", stderr); } +static char * __lite_xl_fallback_luaL_prepbuffsize (luaL_Buffer *B, size_t sz) { fputs("warning: luaL_prepbuffsize is a stub", stderr); } +static void __lite_xl_fallback_luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { fputs("warning: luaL_addlstring is a stub", stderr); } +static void __lite_xl_fallback_luaL_addstring (luaL_Buffer *B, const char *s) { fputs("warning: luaL_addstring is a stub", stderr); } +static void __lite_xl_fallback_luaL_addvalue (luaL_Buffer *B) { fputs("warning: luaL_addvalue is a stub", stderr); } +static void __lite_xl_fallback_luaL_pushresult (luaL_Buffer *B) { fputs("warning: luaL_pushresult is a stub", stderr); } +static void __lite_xl_fallback_luaL_pushresultsize (luaL_Buffer *B, size_t sz) { fputs("warning: luaL_pushresultsize is a stub", stderr); } +static char * __lite_xl_fallback_luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) { fputs("warning: luaL_buffinitsize is a stub", stderr); } -#define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name) +#define IMPORT_SYMBOL(name, ret, ...) name = (name = (ret (*) (__VA_ARGS__)) symbol(#name), name == NULL ? &__lite_xl_fallback_##name : name) static void lite_xl_plugin_init(void *XL) { void* (*symbol)(const char *) = (void* (*) (const char *)) XL; IMPORT_SYMBOL(lua_newstate, lua_State *, lua_Alloc f, void *ud);