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.
This commit is contained in:
@@ -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/
|
||||
|
||||
Executable
+94
@@ -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"
|
||||
Reference in New Issue
Block a user