aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile21
-rw-r--r--src/lua.patch554
-rw-r--r--src/lua.sym164
-rw-r--r--src/lutf8libjit.patch14
-rw-r--r--src/textadept.c62
5 files changed, 174 insertions, 641 deletions
diff --git a/src/Makefile b/src/Makefile
index 2438789e..651fa9a5 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -98,8 +98,9 @@ endif
# Scintilla.
-sci_flags = -pedantic $(plat_flag) -DSCI_LEXER -DNDEBUG -DG_THREADS_IMPL_NONE \
- -Iscintilla/include -Iscintilla/src -Iscintilla/lexlib -Wall
+sci_flags = -std=c++0x -pedantic $(plat_flag) -DSCI_LEXER -DNDEBUG \
+ -DG_THREADS_IMPL_NONE -Iscintilla/include -Iscintilla/src \
+ -Iscintilla/lexlib -Wall
sci_objs = AutoComplete.o CallTip.o CaseConvert.o CaseFolder.o Catalogue.o \
CellBuffer.o CharClassify.o ContractionState.o Decoration.o \
@@ -125,10 +126,10 @@ lua_objs = lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o \
linit.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o \
lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o \
lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \
- lmathlib.o loadlib.o loslib.o ltablib.o lstrlib.o
+ lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o
lua_lib_objs = lpcap.o lpcode.o lpprint.o lptree.o lpvm.o lfs.o
luajit_lib_objs = lpcapjit.o lpcodejit.o lpprintjit.o lptreejit.o lpvmjit.o \
- lfsjit.o
+ lfsjit.o lutf8libjit.o
lua_spawn_objs = lspawn.o lspawnjit.o lspawn-curses.o lspawnjit-curses.o
gtdialog_objs = gtdialog.o gtdialog-curses.o
termkey_unix_objs = driver-ti.o driver-csi.o
@@ -211,6 +212,9 @@ $(gtdialog_objs): gtdialog_flags = $(plat_flag) -DNOHELP -DLIBRARY
gtdialog.o: gtdialog_flags += $(GTK_CFLAGS)
gtdialog-curses.o: gtdialog_flags += -Icdk $(CURSES_CFLAGS)
$(termkey_win32_objs): termkey_flags += $(CURSES_CFLAGS)
+# Lua 5.3 compatibility with LuaJIT.
+lbitlib.o linit.o: LUA_CFLAGS += -DLUA_COMPAT_BITLIB -DLUA_COMPAT_APIINTCASTS
+lutf8libjit.o: LUA_CFLAGS += -Ilua/src
# Executables.
@@ -378,9 +382,9 @@ endif
scintilla_tgz = scintilla354.tgz
scinterm_zip = 068d4a448eb3.zip
scintillua_zip = scintillua_3.5.4-1.zip
-lua_tgz = lua-5.2.3.tar.gz
-lpeg_tgz = lpeg-0.12.tar.gz
-lfs_zip = v1_6_2.zip
+lua_tgz = lua-5.3.0.tar.gz
+lpeg_tgz = lpeg-0.12.2.tar.gz
+lfs_zip = v1_6_3.zip
lspawn_zip = lspawn_1.1.zip
luajit_tgz = LuaJIT-2.0.3.tar.gz
libluajit_tgz = libluajit_2.0.3.x86_64.tgz
@@ -421,6 +425,9 @@ lua/src/lib/lfs: | $(lfs_zip)
mkdir -p $@ && unzip -d $@ $| && mv $@/*/src/*.c $@/*/src/*.h $(dir $@)
lua/src/lib/lspawn: | $(lspawn_zip)
mkdir -p $@ && unzip -d $@ $| && mv $@/*/*.c $(dir $@)
+lua/src/lib/lutf8lib.c: lutf8libjit.patch
+ cp lua/src/$(notdir $@) $@
+ patch -d $(dir $@) -N -p1 < $<
$(luajit_tgz): ; wget http://luajit.org/download/$@
luajit: luajit.patch | $(luajit_tgz)
mkdir $@ && tar xzf $| -C $@ && mv $@/*/* $@
diff --git a/src/lua.patch b/src/lua.patch
index f9744e15..d49288b0 100644
--- a/src/lua.patch
+++ b/src/lua.patch
@@ -1,548 +1,50 @@
-diff -r 56f218b3289e src/loadlib.c
---- a/src/loadlib.c Sun Dec 15 21:08:47 2013 -0500
-+++ b/src/loadlib.c Sun Dec 15 21:11:23 2013 -0500
-@@ -35,11 +35,11 @@
+diff -r 8a23edc91533 src/loadlib.c
+--- a/src/loadlib.c Mon Jan 12 18:57:53 2015 -0500
++++ b/src/loadlib.c Mon Jan 12 23:50:08 2015 -0500
+@@ -28,11 +28,11 @@
** variables that Lua check to set its paths.
*/
- #if !defined(LUA_PATH)
--#define LUA_PATH "LUA_PATH"
-+#define LUA_PATH "TA_LUA_PATH"
+ #if !defined(LUA_PATH_VAR)
+-#define LUA_PATH_VAR "LUA_PATH"
++#define LUA_PATH_VAR "TA_LUA_PATH"
#endif
- #if !defined(LUA_CPATH)
--#define LUA_CPATH "LUA_CPATH"
-+#define LUA_CPATH "TA_LUA_CPATH"
+ #if !defined(LUA_CPATH_VAR)
+-#define LUA_CPATH_VAR "LUA_CPATH"
++#define LUA_CPATH_VAR "TA_LUA_CPATH"
#endif
#define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
-diff -r 56f218b3289e src/lua.c
---- a/src/lua.c Sun Dec 15 21:08:47 2013 -0500
-+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
-@@ -1,497 +0,0 @@
--/*
--** $Id: lua.c,v 1.206.1.1 2013/04/12 18:48:47 roberto Exp $
--** Lua stand-alone interpreter
--** See Copyright Notice in lua.h
--*/
--
--
--#include <signal.h>
--#include <stdio.h>
--#include <stdlib.h>
--#include <string.h>
--
--#define lua_c
--
--#include "lua.h"
--
--#include "lauxlib.h"
--#include "lualib.h"
--
--
--#if !defined(LUA_PROMPT)
--#define LUA_PROMPT "> "
--#define LUA_PROMPT2 ">> "
--#endif
--
--#if !defined(LUA_PROGNAME)
--#define LUA_PROGNAME "lua"
--#endif
--
--#if !defined(LUA_MAXINPUT)
--#define LUA_MAXINPUT 512
--#endif
--
--#if !defined(LUA_INIT)
--#define LUA_INIT "LUA_INIT"
--#endif
--
--#define LUA_INITVERSION \
-- LUA_INIT "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
--
--
--/*
--** lua_stdin_is_tty detects whether the standard input is a 'tty' (that
--** is, whether we're running lua interactively).
--*/
--#if defined(LUA_USE_ISATTY)
--#include <unistd.h>
--#define lua_stdin_is_tty() isatty(0)
--#elif defined(LUA_WIN)
--#include <io.h>
--#include <stdio.h>
--#define lua_stdin_is_tty() _isatty(_fileno(stdin))
--#else
--#define lua_stdin_is_tty() 1 /* assume stdin is a tty */
--#endif
--
--
--/*
--** lua_readline defines how to show a prompt and then read a line from
--** the standard input.
--** lua_saveline defines how to "save" a read line in a "history".
--** lua_freeline defines how to free a line read by lua_readline.
--*/
--#if defined(LUA_USE_READLINE)
--
--#include <stdio.h>
--#include <readline/readline.h>
--#include <readline/history.h>
--#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL)
--#define lua_saveline(L,idx) \
-- if (lua_rawlen(L,idx) > 0) /* non-empty line? */ \
-- add_history(lua_tostring(L, idx)); /* add it to history */
--#define lua_freeline(L,b) ((void)L, free(b))
--
--#elif !defined(lua_readline)
--
--#define lua_readline(L,b,p) \
-- ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \
-- fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */
--#define lua_saveline(L,idx) { (void)L; (void)idx; }
--#define lua_freeline(L,b) { (void)L; (void)b; }
--
--#endif
--
--
--
--
--static lua_State *globalL = NULL;
--
--static const char *progname = LUA_PROGNAME;
--
--
--
--static void lstop (lua_State *L, lua_Debug *ar) {
-- (void)ar; /* unused arg. */
-- lua_sethook(L, NULL, 0, 0);
-- luaL_error(L, "interrupted!");
--}
--
--
--static void laction (int i) {
-- signal(i, SIG_DFL); /* if another SIGINT happens before lstop,
-- terminate process (default action) */
-- lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);
--}
--
--
--static void print_usage (const char *badoption) {
-- luai_writestringerror("%s: ", progname);
-- if (badoption[1] == 'e' || badoption[1] == 'l')
-- luai_writestringerror("'%s' needs argument\n", badoption);
-- else
-- luai_writestringerror("unrecognized option '%s'\n", badoption);
-- luai_writestringerror(
-- "usage: %s [options] [script [args]]\n"
-- "Available options are:\n"
-- " -e stat execute string " LUA_QL("stat") "\n"
-- " -i enter interactive mode after executing " LUA_QL("script") "\n"
-- " -l name require library " LUA_QL("name") "\n"
-- " -v show version information\n"
-- " -E ignore environment variables\n"
-- " -- stop handling options\n"
-- " - stop handling options and execute stdin\n"
-- ,
-- progname);
--}
--
--
--static void l_message (const char *pname, const char *msg) {
-- if (pname) luai_writestringerror("%s: ", pname);
-- luai_writestringerror("%s\n", msg);
--}
--
--
--static int report (lua_State *L, int status) {
-- if (status != LUA_OK && !lua_isnil(L, -1)) {
-- const char *msg = lua_tostring(L, -1);
-- if (msg == NULL) msg = "(error object is not a string)";
-- l_message(progname, msg);
-- lua_pop(L, 1);
-- /* force a complete garbage collection in case of errors */
-- lua_gc(L, LUA_GCCOLLECT, 0);
-- }
-- return status;
--}
--
--
--/* the next function is called unprotected, so it must avoid errors */
--static void finalreport (lua_State *L, int status) {
-- if (status != LUA_OK) {
-- const char *msg = (lua_type(L, -1) == LUA_TSTRING) ? lua_tostring(L, -1)
-- : NULL;
-- if (msg == NULL) msg = "(error object is not a string)";
-- l_message(progname, msg);
-- lua_pop(L, 1);
-- }
--}
--
--
--static int traceback (lua_State *L) {
-- const char *msg = lua_tostring(L, 1);
-- if (msg)
-- luaL_traceback(L, L, msg, 1);
-- else if (!lua_isnoneornil(L, 1)) { /* is there an error object? */
-- if (!luaL_callmeta(L, 1, "__tostring")) /* try its 'tostring' metamethod */
-- lua_pushliteral(L, "(no error message)");
-- }
-- return 1;
--}
--
--
--static int docall (lua_State *L, int narg, int nres) {
-- int status;
-- int base = lua_gettop(L) - narg; /* function index */
-- lua_pushcfunction(L, traceback); /* push traceback function */
-- lua_insert(L, base); /* put it under chunk and args */
-- globalL = L; /* to be available to 'laction' */
-- signal(SIGINT, laction);
-- status = lua_pcall(L, narg, nres, base);
-- signal(SIGINT, SIG_DFL);
-- lua_remove(L, base); /* remove traceback function */
-- return status;
--}
--
--
--static void print_version (void) {
-- luai_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT));
-- luai_writeline();
--}
--
--
--static int getargs (lua_State *L, char **argv, int n) {
-- int narg;
-- int i;
-- int argc = 0;
-- while (argv[argc]) argc++; /* count total number of arguments */
-- narg = argc - (n + 1); /* number of arguments to the script */
-- luaL_checkstack(L, narg + 3, "too many arguments to script");
-- for (i=n+1; i < argc; i++)
-- lua_pushstring(L, argv[i]);
-- lua_createtable(L, narg, n + 1);
-- for (i=0; i < argc; i++) {
-- lua_pushstring(L, argv[i]);
-- lua_rawseti(L, -2, i - n);
-- }
-- return narg;
--}
--
--
--static int dofile (lua_State *L, const char *name) {
-- int status = luaL_loadfile(L, name);
-- if (status == LUA_OK) status = docall(L, 0, 0);
-- return report(L, status);
--}
--
--
--static int dostring (lua_State *L, const char *s, const char *name) {
-- int status = luaL_loadbuffer(L, s, strlen(s), name);
-- if (status == LUA_OK) status = docall(L, 0, 0);
-- return report(L, status);
--}
--
--
--static int dolibrary (lua_State *L, const char *name) {
-- int status;
-- lua_getglobal(L, "require");
-- lua_pushstring(L, name);
-- status = docall(L, 1, 1); /* call 'require(name)' */
-- if (status == LUA_OK)
-- lua_setglobal(L, name); /* global[name] = require return */
-- return report(L, status);
--}
--
--
--static const char *get_prompt (lua_State *L, int firstline) {
-- const char *p;
-- lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2");
-- p = lua_tostring(L, -1);
-- if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);
-- return p;
--}
--
--/* mark in error messages for incomplete statements */
--#define EOFMARK "<eof>"
--#define marklen (sizeof(EOFMARK)/sizeof(char) - 1)
--
--static int incomplete (lua_State *L, int status) {
-- if (status == LUA_ERRSYNTAX) {
-- size_t lmsg;
-- const char *msg = lua_tolstring(L, -1, &lmsg);
-- if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) {
-- lua_pop(L, 1);
-- return 1;
-- }
-- }
-- return 0; /* else... */
--}
--
--
--static int pushline (lua_State *L, int firstline) {
-- char buffer[LUA_MAXINPUT];
-- char *b = buffer;
-- size_t l;
-- const char *prmt = get_prompt(L, firstline);
-- int readstatus = lua_readline(L, b, prmt);
-- lua_pop(L, 1); /* remove result from 'get_prompt' */
-- if (readstatus == 0)
-- return 0; /* no input */
-- l = strlen(b);
-- if (l > 0 && b[l-1] == '\n') /* line ends with newline? */
-- b[l-1] = '\0'; /* remove it */
-- if (firstline && b[0] == '=') /* first line starts with `=' ? */
-- lua_pushfstring(L, "return %s", b+1); /* change it to `return' */
-- else
-- lua_pushstring(L, b);
-- lua_freeline(L, b);
-- return 1;
--}
--
--
--static int loadline (lua_State *L) {
-- int status;
-- lua_settop(L, 0);
-- if (!pushline(L, 1))
-- return -1; /* no input */
-- for (;;) { /* repeat until gets a complete line */
-- size_t l;
-- const char *line = lua_tolstring(L, 1, &l);
-- status = luaL_loadbuffer(L, line, l, "=stdin");
-- if (!incomplete(L, status)) break; /* cannot try to add lines? */
-- if (!pushline(L, 0)) /* no more input? */
-- return -1;
-- lua_pushliteral(L, "\n"); /* add a new line... */
-- lua_insert(L, -2); /* ...between the two lines */
-- lua_concat(L, 3); /* join them */
-- }
-- lua_saveline(L, 1);
-- lua_remove(L, 1); /* remove line */
-- return status;
--}
--
--
--static void dotty (lua_State *L) {
-- int status;
-- const char *oldprogname = progname;
-- progname = NULL;
-- while ((status = loadline(L)) != -1) {
-- if (status == LUA_OK) status = docall(L, 0, LUA_MULTRET);
-- report(L, status);
-- if (status == LUA_OK && lua_gettop(L) > 0) { /* any result to print? */
-- luaL_checkstack(L, LUA_MINSTACK, "too many results to print");
-- lua_getglobal(L, "print");
-- lua_insert(L, 1);
-- if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != LUA_OK)
-- l_message(progname, lua_pushfstring(L,
-- "error calling " LUA_QL("print") " (%s)",
-- lua_tostring(L, -1)));
-- }
-- }
-- lua_settop(L, 0); /* clear stack */
-- luai_writeline();
-- progname = oldprogname;
--}
--
--
--static int handle_script (lua_State *L, char **argv, int n) {
-- int status;
-- const char *fname;
-- int narg = getargs(L, argv, n); /* collect arguments */
-- lua_setglobal(L, "arg");
-- fname = argv[n];
-- if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0)
-- fname = NULL; /* stdin */
-- status = luaL_loadfile(L, fname);
-- lua_insert(L, -(narg+1));
-- if (status == LUA_OK)
-- status = docall(L, narg, LUA_MULTRET);
-- else
-- lua_pop(L, narg);
-- return report(L, status);
--}
--
--
--/* check that argument has no extra characters at the end */
--#define noextrachars(x) {if ((x)[2] != '\0') return -1;}
--
--
--/* indices of various argument indicators in array args */
--#define has_i 0 /* -i */
--#define has_v 1 /* -v */
--#define has_e 2 /* -e */
--#define has_E 3 /* -E */
--
--#define num_has 4 /* number of 'has_*' */
--
--
--static int collectargs (char **argv, int *args) {
-- int i;
-- for (i = 1; argv[i] != NULL; i++) {
-- if (argv[i][0] != '-') /* not an option? */
-- return i;
-- switch (argv[i][1]) { /* option */
-- case '-':
-- noextrachars(argv[i]);
-- return (argv[i+1] != NULL ? i+1 : 0);
-- case '\0':
-- return i;
-- case 'E':
-- args[has_E] = 1;
-- break;
-- case 'i':
-- noextrachars(argv[i]);
-- args[has_i] = 1; /* go through */
-- case 'v':
-- noextrachars(argv[i]);
-- args[has_v] = 1;
-- break;
-- case 'e':
-- args[has_e] = 1; /* go through */
-- case 'l': /* both options need an argument */
-- if (argv[i][2] == '\0') { /* no concatenated argument? */
-- i++; /* try next 'argv' */
-- if (argv[i] == NULL || argv[i][0] == '-')
-- return -(i - 1); /* no next argument or it is another option */
-- }
-- break;
-- default: /* invalid option; return its index... */
-- return -i; /* ...as a negative value */
-- }
-- }
-- return 0;
--}
--
--
--static int runargs (lua_State *L, char **argv, int n) {
-- int i;
-- for (i = 1; i < n; i++) {
-- lua_assert(argv[i][0] == '-');
-- switch (argv[i][1]) { /* option */
-- case 'e': {
-- const char *chunk = argv[i] + 2;
-- if (*chunk == '\0') chunk = argv[++i];
-- lua_assert(chunk != NULL);
-- if (dostring(L, chunk, "=(command line)") != LUA_OK)
-- return 0;
-- break;
-- }
-- case 'l': {
-- const char *filename = argv[i] + 2;
-- if (*filename == '\0') filename = argv[++i];
-- lua_assert(filename != NULL);
-- if (dolibrary(L, filename) != LUA_OK)
-- return 0; /* stop if file fails */
-- break;
-- }
-- default: break;
-- }
-- }
-- return 1;
--}
--
--
--static int handle_luainit (lua_State *L) {
-- const char *name = "=" LUA_INITVERSION;
-- const char *init = getenv(name + 1);
-- if (init == NULL) {
-- name = "=" LUA_INIT;
-- init = getenv(name + 1); /* try alternative name */
-- }
-- if (init == NULL) return LUA_OK;
-- else if (init[0] == '@')
-- return dofile(L, init+1);
-- else
-- return dostring(L, init, name);
--}
--
--
--static int pmain (lua_State *L) {
-- int argc = (int)lua_tointeger(L, 1);
-- char **argv = (char **)lua_touserdata(L, 2);
-- int script;
-- int args[num_has];
-- args[has_i] = args[has_v] = args[has_e] = args[has_E] = 0;
-- if (argv[0] && argv[0][0]) progname = argv[0];
-- script = collectargs(argv, args);
-- if (script < 0) { /* invalid arg? */
-- print_usage(argv[-script]);
-- return 0;
-- }
-- if (args[has_v]) print_version();
-- if (args[has_E]) { /* option '-E'? */
-- lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */
-- lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
-- }
-- /* open standard libraries */
-- luaL_checkversion(L);
-- lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */
-- luaL_openlibs(L); /* open libraries */
-- lua_gc(L, LUA_GCRESTART, 0);
-- if (!args[has_E] && handle_luainit(L) != LUA_OK)
-- return 0; /* error running LUA_INIT */
-- /* execute arguments -e and -l */
-- if (!runargs(L, argv, (script > 0) ? script : argc)) return 0;
-- /* execute main script (if there is one) */
-- if (script && handle_script(L, argv, script) != LUA_OK) return 0;
-- if (args[has_i]) /* -i option? */
-- dotty(L);
-- else if (script == 0 && !args[has_e] && !args[has_v]) { /* no arguments? */
-- if (lua_stdin_is_tty()) {
-- print_version();
-- dotty(L);
-- }
-- else dofile(L, NULL); /* executes stdin as a file */
-- }
-- lua_pushboolean(L, 1); /* signal no errors */
-- return 1;
--}
--
--
--int main (int argc, char **argv) {
-- int status, result;
-- lua_State *L = luaL_newstate(); /* create state */
-- if (L == NULL) {
-- l_message(argv[0], "cannot create state: not enough memory");
-- return EXIT_FAILURE;
-- }
-- /* call 'pmain' in protected mode */
-- lua_pushcfunction(L, &pmain);
-- lua_pushinteger(L, argc); /* 1st argument */
-- lua_pushlightuserdata(L, argv); /* 2nd argument */
-- status = lua_pcall(L, 2, 1, 0);
-- result = lua_toboolean(L, -1); /* get result */
-- finalreport(L, status);
-- lua_close(L);
-- return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
--}
--
-diff -r 56f218b3289e src/luaconf.h
---- a/src/luaconf.h Sun Dec 15 21:08:47 2013 -0500
-+++ b/src/luaconf.h Sun Dec 15 21:11:23 2013 -0500
-@@ -93,21 +93,21 @@
- #define LUA_CDIR "!\\"
+diff -r 8a23edc91533 src/luaconf.h
+--- a/src/luaconf.h Mon Jan 12 18:57:53 2015 -0500
++++ b/src/luaconf.h Mon Jan 12 23:50:08 2015 -0500
+@@ -166,24 +166,22 @@
#define LUA_PATH_DEFAULT \
LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \
-- LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" ".\\?.lua"
-+ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua"
+ LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \
+- LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \
+- ".\\?.lua;" ".\\?\\init.lua"
++ LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;"
#define LUA_CPATH_DEFAULT \
-- LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll;" ".\\?.dll"
-+ LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
+ LUA_CDIR"?.dll;" \
+ LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \
+- LUA_CDIR"loadall.dll;" ".\\?.dll"
++ LUA_CDIR"loadall.dll;"
#else /* }{ */
- #define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR "/"
-#define LUA_ROOT "/usr/local/"
+#define LUA_ROOT "/usr/"
- #define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR
- #define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR
+ #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"
-+ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua"
+- LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \
+- "./?.lua;" "./?/init.lua"
++ LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;"
#define LUA_CPATH_DEFAULT \
- LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so"
-+ LUA_CDIR"?.so;" LUA_CDIR"loadall.so"
++ LUA_CDIR"?.so;" LUA_CDIR"loadall.so;"
#endif /* } */
diff --git a/src/lua.sym b/src/lua.sym
index d2a73e4f..3927da21 100644
--- a/src/lua.sym
+++ b/src/lua.sym
@@ -1,77 +1,24 @@
-# This file has Lua 5.2 symbols and Lua 5.1 symbols (for LuaJIT).
-luaL_addlstring
-luaL_addstring
-luaL_addvalue
-luaL_argerror
-luaL_buffinit
-luaL_buffinitsize
-luaL_callmeta
-luaL_checkany
-luaL_checkinteger
-luaL_checklstring
-luaL_checknumber
-luaL_checkoption
-luaL_checkstack
-luaL_checktype
-luaL_checkudata
-luaL_checkunsigned
-luaL_checkversion
-luaL_error
-luaL_execresult
-luaL_fileresult
-luaL_findtable
-luaL_getmetafield
-luaL_getsubtable
-luaL_gsub
-luaL_len
-luaL_loadbuffer
-luaL_loadfile
-luaL_loadstring
-luaL_newlibtable
-luaL_newmetatable
-luaL_newstate
-luaL_openlibs
-luaL_optinteger
-luaL_optlstring
-luaL_optnumber
-luaL_optunsigned
-luaL_prepbuffer
-luaL_prepbuffsize
-luaL_pushresult
-luaL_pushresultsize
-luaL_ref
-luaL_register
-luaL_typerror
-luaL_requiref
-luaL_setfuncs
-luaL_setmetatable
-luaL_testudata
-luaL_tostring
-luaL_traceback
-luaL_unref
-luaL_where
+# Lua 5.3 symbols to retain. (LUA_API, LUALIB_API, LUAMOD_API)
lua_absindex
lua_arith
lua_atpanic
-lua_call
lua_callk
lua_checkstack
lua_close
+lua_compare
lua_concat
-lua_cpcall
lua_copy
lua_createtable
lua_dump
-lua_equal
lua_error
lua_gc
lua_getallocf
-lua_getctx
-lua_getfenv
lua_getfield
+lua_getglobal
lua_gethook
lua_gethookcount
lua_gethookmask
+lua_geti
lua_getinfo
lua_getlocal
lua_getmetatable
@@ -80,21 +27,18 @@ lua_gettable
lua_gettop
lua_getupvalue
lua_getuservalue
-lua_ident
-lua_insert
lua_iscfunction
+lua_isinteger
lua_isnumber
lua_isstring
lua_isuserdata
+lua_isyieldable
lua_len
-lua_lessthan
lua_load
lua_newstate
lua_newthread
lua_newuserdata
lua_next
-lua_objlen
-lua_pcall
lua_pcallk
lua_pushboolean
lua_pushcclosure
@@ -111,17 +55,18 @@ lua_pushvfstring
lua_rawequal
lua_rawget
lua_rawgeti
+lua_rawgetp
lua_rawlen
lua_rawset
lua_rawseti
-lua_remove
-lua_replace
+lua_rawsetp
lua_resume
+lua_rotate
lua_setallocf
-lua_setfenv
lua_setfield
+lua_setglobal
lua_sethook
-lua_setlevel
+lua_seti
lua_setlocal
lua_setmetatable
lua_settable
@@ -129,28 +74,70 @@ lua_settop
lua_setupvalue
lua_setuservalue
lua_status
+lua_stringtonumber
lua_toboolean
lua_tocfunction
-lua_tointeger
lua_tointegerx
lua_tolstring
-lua_tonumber
lua_tonumberx
lua_topointer
lua_tothread
-lua_tounsigned
-lua_tounsignedx
lua_touserdata
-lua_upvalueid
-lua_upvaluejoin
lua_type
lua_typename
+lua_upvalueid
+lua_upvaluejoin
lua_version
lua_xmove
-lua_yield
lua_yieldk
+luaL_addlstring
+luaL_addstring
+luaL_addvalue
+luaL_argerror
+luaL_buffinit
+luaL_buffinitsize
+luaL_callmeta
+luaL_checkany
+luaL_checkinteger
+luaL_checklstring
+luaL_checknumber
+luaL_checkoption
+luaL_checkstack
+luaL_checktype
+luaL_checkudata
+luaL_checkversion_
+luaL_error
+luaL_execresult
+luaL_fileresult
+luaL_getmetafield
+luaL_getsubtable
+luaL_gsub
+luaL_len
+luaL_loadbufferx
+luaL_loadfilex
+luaL_loadstring
+luaL_newmetatable
+luaL_newstate
+luaL_openlib
+luaL_openlibs
+luaL_optinteger
+luaL_optlstring
+luaL_optnumber
+luaL_prepbuffsize
+luaL_pushmodule
+luaL_pushresult
+luaL_pushresultsize
+luaL_ref
+luaL_requiref
+luaL_setfuncs
+luaL_setmetatable
+luaL_testudata
+luaL_tolstring
+luaL_traceback
+luaL_unref
+luaL_where
luaopen_base
-luaopen_bitlib
+luaopen_bit32
luaopen_coroutine
luaopen_debug
luaopen_io
@@ -159,5 +146,30 @@ luaopen_os
luaopen_package
luaopen_string
luaopen_table
-luaopen_lfs
-luaopen_lpeg
+luaopen_utf8
+# LuaJIT symbols to retain that are not listed above.
+lua_call
+lua_cpcall
+lua_equal
+lua_getfenv
+lua_insert
+lua_lessthan
+lua_loadx
+lua_objlen
+lua_pcall
+lua_remove
+lua_replace
+lua_setfenv
+lua_setlevel
+lua_tointeger
+lua_tonumber
+lua_yield
+luaL_findtable
+luaL_loadbuffer
+luaL_loadfile
+luaL_prepbuffer
+luaL_register
+luaL_typerror
+luaopen_bit
+luaopen_ffi
+luaopen_jit
diff --git a/src/lutf8libjit.patch b/src/lutf8libjit.patch
new file mode 100644
index 00000000..72a09840
--- /dev/null
+++ b/src/lutf8libjit.patch
@@ -0,0 +1,14 @@
+--- lutf8lib.c 2015-01-12 18:46:22.334838510 -0500
++++ lib/lutf8lib.c 2015-01-12 22:42:54.527406794 -0500
+@@ -246,8 +246,9 @@
+ };
+
+
+-LUAMOD_API int luaopen_utf8 (lua_State *L) {
+- luaL_newlib(L, funcs);
++int luaopen_utf8 (lua_State *L) {
++ lua_newtable(L), luaL_register(L, NULL, funcs);
++ lua_pushvalue(L, -1), lua_setglobal(L, "utf8");
+ lua_pushliteral(L, UTF8PATT);
+ lua_setfield(L, -2, "charpattern");
+ return 1;
diff --git a/src/textadept.c b/src/textadept.c
index 164c53dc..6476becd 100644
--- a/src/textadept.c
+++ b/src/textadept.c
@@ -86,13 +86,21 @@ typedef GtkWidget Scintilla;
} \
lua_setmetatable(l, (n > 0) ? n : n - 1); \
}
-// Translate Lua 5.2 API to LuaJIT API (Lua 5.1) for compatibility.
+// Translate Lua 5.3 API to LuaJIT API (Lua 5.1) for compatibility.
#if LUA_VERSION_NUM == 501
#define LUA_OK 0
#define lua_rawlen lua_objlen
#define LUA_OPEQ 0
+#undef lua_getglobal
+#define lua_getglobal(l, n) \
+ (lua_getfield(l, LUA_GLOBALSINDEX, (n)), lua_type(l, -1))
+#define lua_getfield(l, t, k) (lua_getfield(l, t, k), lua_type(l, -1))
+#define lua_rawgeti(l, i, n) (lua_rawgeti(l, i, n), lua_type(l, -1))
+#define lua_gettable(l, i) (lua_gettable(l, i), lua_type(l, -1))
+#define luaL_openlibs(l) luaL_openlibs(l), luaopen_utf8(l)
#define lL_openlib(l, n) \
(lua_pushcfunction(l, luaopen_##n), lua_pushstring(l, #n), lua_call(l, 1, 0))
+LUALIB_API int luaopen_utf8(lua_State *);
#else
#define lL_openlib(l, n) (luaL_requiref(l, #n, luaopen_##n, 1), lua_pop(l, 1))
#endif
@@ -230,11 +238,8 @@ LUALIB_API int lspawn_pushfds(lua_State *), lspawn_readfds(lua_State *);
*/
static int lL_event(lua_State *L, const char *name, ...) {
int ret = FALSE;
- lua_getglobal(L, "events");
- if (lua_istable(L, -1)) {
- lua_getfield(L, -1, "emit");
- lua_remove(L, -2); // events table
- if (lua_isfunction(L, -1)) {
+ if (lua_getglobal(L, "events") == LUA_TTABLE) {
+ if (lua_getfield(L, -1, "emit") == LUA_TFUNCTION) {
lua_pushstring(L, name);
int n = 1, type;
va_list ap;
@@ -258,8 +263,8 @@ static int lL_event(lua_State *L, const char *name, ...) {
ret = lua_toboolean(L, -1);
else
lL_event(L, "error", LUA_TSTRING, lua_tostring(L, -1), -1);
- lua_pop(L, 1); // result
- } else lua_pop(L, 1); // non-function
+ lua_pop(L, 2); // result, events
+ } else lua_pop(L, 2); // non-function, events
} else lua_pop(L, 1); // non-table
return ret;
}
@@ -759,18 +764,15 @@ static void l_pushmenu(lua_State *L, int index, GCallback callback,
GtkWidget *menu = gtk_menu_new(), *menu_item = NULL, *submenu_root = NULL;
const char *label;
lua_pushvalue(L, index); // copy to stack top so relative indices can be used
- lua_getfield(L, -1, "title");
- if (!lua_isnil(L, -1) || submenu) { // title required for submenu
+ if (lua_getfield(L, -1, "title") != LUA_TNIL || submenu) { // submenu title
label = !lua_isnil(L, -1) ? lua_tostring(L, -1) : "notitle";
submenu_root = gtk_menu_item_new_with_mnemonic(label);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenu_root), menu);
}
lua_pop(L, 1); // title
for (size_t i = 1; i <= lua_rawlen(L, -1); i++) {
- lua_rawgeti(L, -1, i);
- if (lua_istable(L, -1)) {
- lua_getfield(L, -1, "title");
- int is_submenu = !lua_isnil(L, -1);
+ if (lua_rawgeti(L, -1, i) == LUA_TTABLE) {
+ int is_submenu = lua_getfield(L, -1, "title") != LUA_TNIL;
lua_pop(L, 1); // title
if (is_submenu) {
l_pushmenu(L, -1, callback, TRUE);
@@ -887,8 +889,8 @@ static int lui__newindex(lua_State *L) {
luaL_argcheck(L, lua_istable(L, 3), 3, "table of menus expected");
GtkWidget *new_menubar = gtk_menu_bar_new(); // TODO: this leaks on error
for (size_t i = 1; i <= lua_rawlen(L, 3); i++) {
- lua_rawgeti(L, 3, i);
- luaL_argcheck(L, lua_isuserdata(L, -1), 3, "table of menus expected");
+ luaL_argcheck(L, lua_rawgeti(L, 3, i) == LUA_TLIGHTUSERDATA, 3,
+ "table of menus expected");
GtkWidget *menu_item = (GtkWidget *)lua_touserdata(L, -1);
gtk_menu_shell_append(GTK_MENU_SHELL(new_menubar), menu_item);
lua_pop(L, 1); // value
@@ -959,8 +961,8 @@ static sptr_t l_globaldoccompare(lua_State *L, int index) {
lua_pop(L, 2); // metatable, metatable
if (doc != SS(focused_view, SCI_GETDOCPOINTER, 0, 0)) {
lua_getfield(L, LUA_REGISTRYINDEX, "ta_buffers");
- l_pushdoc(L, doc), lua_gettable(L, -2);
- luaL_argcheck(L, !lua_isnil(L, -1), index, "this Buffer does not exist");
+ luaL_argcheck(L, (l_pushdoc(L, doc), lua_gettable(L, -2) != LUA_TNIL),
+ index, "this Buffer does not exist");
lua_pop(L, 2); // buffer, ta_buffers
if (doc == SS(command_entry, SCI_GETDOCPOINTER, 0, 0)) return -1;
return (SS(dummy_view, SCI_SETDOCPOINTER, 0, doc), doc);
@@ -1094,7 +1096,7 @@ static int lbuffer_text_range(lua_State *L) {
Scintilla *view = focused_view;
int result = l_globaldoccompare(L, 1);
if (result != 0) view = (result > 0) ? dummy_view : command_entry;
- long min = luaL_checklong(L, 2), max = luaL_checklong(L, 3);
+ long min = luaL_checkinteger(L, 2), max = luaL_checkinteger(L, 3);
luaL_argcheck(L, min <= max, 3, "start > end");
struct Sci_TextRange tr = {{min, max}, malloc(max - min + 1)};
SS(view, SCI_GETTEXTRANGE, 0, (sptr_t)&tr);
@@ -1149,7 +1151,7 @@ static int l_callscintilla(lua_State *L, Scintilla *view, int msg, int wtype,
// appropriately. See the LPeg lexer API for more information.
if (msg == SCI_PRIVATELEXERCALL) {
ltype = SSTRINGRET;
- int c = luaL_checklong(L, arg);
+ int c = luaL_checkinteger(L, arg);
if (c == SCI_GETDIRECTFUNCTION || c == SCI_SETDOCPOINTER ||
c == SCI_CHANGELEXERSTATE)
ltype = SINT;
@@ -1212,8 +1214,8 @@ static int lbuf_property(lua_State *L) {
// If the key is a Scintilla function, return a callable closure.
if (is_buffer && !newindex) {
lua_getfield(L, LUA_REGISTRYINDEX, "ta_functions");
- lua_pushvalue(L, 2), lua_gettable(L, -2);
- if (lua_istable(L, -1)) return (lua_pushcclosure(L, lbuf_closure, 1), 1);
+ if (lua_pushvalue(L, 2), lua_gettable(L, -2) == LUA_TTABLE)
+ return (lua_pushcclosure(L, lbuf_closure, 1), 1);
lua_pop(L, 2); // non-table, ta_functions
}
@@ -1223,9 +1225,8 @@ static int lbuf_property(lua_State *L) {
lua_getfield(L, LUA_REGISTRYINDEX, "ta_properties");
// If the table is a buffer, the key is given; otherwise the table is an
// indexible property.
- is_buffer ? lua_pushvalue(L, 2) : lua_getfield(L, 1, "property");
- lua_gettable(L, -2);
- if (lua_istable(L, -1)) {
+ is_buffer ? lua_pushvalue(L, 2) : (void)lua_getfield(L, 1, "property");
+ if (lua_gettable(L, -2) == LUA_TTABLE) {
Scintilla *view = focused_view;
// Interface table is of the form {get_id, set_id, rtype, wtype}.
if (!is_buffer) lua_getfield(L, 1, "buffer");
@@ -1271,7 +1272,7 @@ static int lbuf_property(lua_State *L) {
} else if (strcmp(lua_tostring(L, 2), "height") == 0 &&
l_todoc(L, 1) == SS(command_entry, SCI_GETDOCPOINTER, 0, 0)) {
// Return or set the command entry's pixel height.
- int height = luaL_optint(L, 3, 0);
+ int height = luaL_optinteger(L, 3, 0);
int min_height = SS(command_entry, SCI_TEXTHEIGHT, 0, 0);
if (height < min_height) height = min_height;
#if GTK
@@ -1292,8 +1293,7 @@ static int lbuf_property(lua_State *L) {
} else if (!newindex) {
// If the key is a Scintilla constant, return its value.
lua_getfield(L, LUA_REGISTRYINDEX, "ta_constants");
- lua_pushvalue(L, 2), lua_gettable(L, -2);
- if (lua_isnumber(L, -1)) return 1;
+ if (lua_pushvalue(L, 2), lua_gettable(L, -2) == LUA_TNUMBER) return 1;
lua_pop(L, 2); // non-number, ta_constants
}
@@ -1846,10 +1846,8 @@ static void t_tabchange(GtkNotebook*_, GtkWidget*__, int page_num, void*___) {
* @param field The ui table field that contains the context menu.
*/
static void lL_showcontextmenu(lua_State *L, void *event, char *field) {
- lua_getglobal(L, "ui");
- if (lua_istable(L, -1)) {
- lua_getfield(L, -1, field);
- if (lua_isuserdata(L, -1)) {
+ if (lua_getglobal(L, "ui") == LUA_TTABLE) {
+ if (lua_getfield(L, -1, field) == LUA_TLIGHTUSERDATA) {
GtkWidget *menu = (GtkWidget *)lua_touserdata(L, -1);
gtk_widget_show_all(menu);
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,