Merge pull request #657 from takase1121/plugin_api_h_fix
fixing native plugin API
This commit is contained in:
commit
4b3d25e15a
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
- **keymap-generator**: Generates a JSON file containing the keymap
|
||||
|
||||
[1]: https://github.com/LinusU/node-appdmg
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
#!/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\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);/"
|
||||
}
|
||||
|
||||
decl() {
|
||||
echo "/** $(basename "$1") **/"
|
||||
echo
|
||||
|
||||
header="$(uncomment $1 | discard_preprocessors)"
|
||||
header1="$(onelineize <<< "$header")"
|
||||
|
||||
# typedef
|
||||
grep -v '^\(LUA\|#\|extern\)' <<< "$header1"
|
||||
# funcptrs
|
||||
ptrize <<< "$header1"
|
||||
# defines
|
||||
(grep '^#' | grep -v "$IGNORE_SYM") <<< "$header"
|
||||
# stubs
|
||||
makestub <<< "$header1"
|
||||
}
|
||||
|
||||
decl_import() {
|
||||
uncomment $1 | onelineize | import_sym
|
||||
}
|
||||
|
||||
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. DO NOT MODIFY DIRECTLY."
|
||||
echo "**/"
|
||||
echo
|
||||
echo
|
||||
echo "#include <stdarg.h>"
|
||||
echo "#include <stdio.h> // for BUFSIZ? this is kinda weird"
|
||||
echo
|
||||
echo "/** luaconf.h **/"
|
||||
echo
|
||||
uncomment "$LUA_PATH/luaconf.h"
|
||||
echo
|
||||
|
||||
decl "$LUA_PATH/lua.h"
|
||||
echo
|
||||
decl "$LUA_PATH/lauxlib.h"
|
||||
echo
|
||||
|
||||
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;"
|
||||
|
||||
decl_import "$LUA_PATH/lua.h"
|
||||
decl_import "$LUA_PATH/lauxlib.h"
|
||||
|
||||
echo "}"
|
||||
echo "#endif"
|
||||
}
|
||||
|
||||
show_help() {
|
||||
echo -e "Usage: $0 <OPTIONS> prefix"
|
||||
echo
|
||||
echo -e "Available options:"
|
||||
echo -e "-p\t--prefix\tSet prefix (where to find lua.h and lauxlib.h)"
|
||||
}
|
||||
|
||||
main() {
|
||||
local prefix=""
|
||||
|
||||
for i in "$@"; do
|
||||
case $i in
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
-p|--prefix)
|
||||
prefix="$2"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
generate_header "$prefix"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
# create a stub function that warns user when calling it
|
|
@ -691,42 +691,49 @@ 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;
|
||||
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(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(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(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(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(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),
|
||||
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(len), U(setfuncs), U(getsubtable), U(buffinit),
|
||||
U(prepbuffsize), U(addlstring), U(addstring), U(addvalue), U(pushresult),
|
||||
U(pushresultsize), U(buffinitsize)
|
||||
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)
|
||||
|
|
Loading…
Reference in New Issue