update generated headers

This commit is contained in:
takase1121 2021-11-06 20:25:20 +08:00
parent ac50404337
commit d0a54227d8
No known key found for this signature in database
GPG Key ID: 60EEFFC68EB3031B
2 changed files with 955 additions and 105 deletions

View File

@ -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 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: 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! 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. 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 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
**/ **/
// #!/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 <stdarg.h>"
// echo "#include <stdio.h> // 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 <string.h>"
// echo "#include <stddef.h>"
// 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 <OPTIONS> 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 #include <stdarg.h>
#define LITE_XL_PLUGIN_API #include <stdio.h> // for BUFSIZ? this is kinda weird
EOF /*
** $Id: luaconf.h,v 1.176.1.2 2013/11/21 17:26:16 roberto Exp $
decl "$LUA_PATH/lua.h" ** Configuration file for Lua
decl "$LUA_PATH/lauxlib.h" ** See Copyright Notice in lua.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"
**/
#ifndef LITE_XL_PLUGIN_API #ifndef lconfig_h
#define LITE_XL_PLUGIN_API #define lconfig_h
#include <limits.h>
#include <stddef.h>
/*
** ==================================================================
** 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 <stdio.h>
#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 <math.h>
#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 struct lua_State lua_State;
typedef int (*lua_CFunction) (lua_State *L); typedef int (*lua_CFunction) (lua_State *L);
typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); 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_pushresult) (luaL_Buffer *B);
static void (*luaL_pushresultsize) (luaL_Buffer *B, size_t sz); static void (*luaL_pushresultsize) (luaL_Buffer *B, size_t sz);
static char *(*luaL_buffinitsize) (lua_State *L, 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 lauxlib_h
#define LUA_ERRFILE (LUA_ERRERR+1) #define LUA_ERRFILE (LUA_ERRERR+1)
#define luaL_checkversion(L) luaL_checkversion_(L, LUA_VERSION_NUM) #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_addsize(B,s) ((B)->n += (s))
#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) #define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE)
#define LUA_FILEHANDLE "FILE*" #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) #define IMPORT_SYMBOL(name, ret, ...) name = (ret (*) (__VA_ARGS__)) symbol(#name)
static void lite_xl_plugin_init(void *XL) { static void lite_xl_plugin_init(void *XL) {
void* (*symbol)(const char *) = (void* (*) (const char *)) 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_pushresult, void , luaL_Buffer *B);
IMPORT_SYMBOL(luaL_pushresultsize, void , luaL_Buffer *B, size_t sz); 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_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 #endif

View File

@ -5,7 +5,208 @@ This file contains the function api_require that
returns a function pointer with it's corresponding name. returns a function pointer with it's corresponding name.
This file is automatically generated. DO NOT MODIFY. 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 <stdarg.h>"
// echo "#include <stdio.h> // 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 <string.h>"
// echo "#include <stddef.h>"
// 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 <OPTIONS> 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 <string.h> #include <string.h>
#include <stddef.h> #include <stddef.h>
#include "lua.h" #include "lua.h"
@ -155,8 +356,6 @@ static void *api_require(const char *symbol) {
EXPORT_SYMBOL(luaL_pushresult), EXPORT_SYMBOL(luaL_pushresult),
EXPORT_SYMBOL(luaL_pushresultsize), EXPORT_SYMBOL(luaL_pushresultsize),
EXPORT_SYMBOL(luaL_buffinitsize), EXPORT_SYMBOL(luaL_buffinitsize),
EXPORT_SYMBOL(luaL_pushmodule),
EXPORT_SYMBOL(luaL_openlib),
}; };
for (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++) for (int i = 0; i < sizeof(nodes) / sizeof(fnptr_t); i++)
if (strcmp(nodes[i].name, symbol) == 0) if (strcmp(nodes[i].name, symbol) == 0)