#!/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"