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] 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)