aboutsummaryrefslogtreecommitdiff
path: root/src/textadept.c
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2015-03-11 16:53:07 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2015-03-11 16:53:07 -0400
commit85450b9983ec16b27981572c258298e6fbf2f59d (patch)
tree3a9557314cad78bde44d9d2030110339b73669f4 /src/textadept.c
parent920c230f140c38ec072da27e522053aed2a9af75 (diff)
downloadtextadept-85450b9983ec16b27981572c258298e6fbf2f59d.tar.gz
textadept-85450b9983ec16b27981572c258298e6fbf2f59d.zip
Updated to Lua 5.3, LPeg 0.12.2, and lfs 1.6.3.
LuaJIT uses Lua 5.3's new utf8 library. Restored documentation for Lua 5.1 symbols and added deprecation notes.
Diffstat (limited to 'src/textadept.c')
-rw-r--r--src/textadept.c62
1 files changed, 30 insertions, 32 deletions
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,