annotate src/if_lua.c @ 31877:9f28cca2410a v9.0.1271

patch 9.0.1271: using sizeof() and subtract array size is tricky Commit: https://github.com/vim/vim/commit/1b438a8228a415720efb5ca1c0503f5467292e8e Author: zeertzjq <zeertzjq@outlook.com> Date: Wed Feb 1 13:11:15 2023 +0000 patch 9.0.1271: using sizeof() and subtract array size is tricky Problem: Using sizeof() and subtract array size is tricky. Solution: Use offsetof() instead. (closes https://github.com/vim/vim/issues/11926)
author Bram Moolenaar <Bram@vim.org>
date Wed, 01 Feb 2023 14:15:04 +0100
parents 50555279168b
children 16025ef158bf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2 *
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
4 *
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
5 * Lua interface by Luis Carvalho
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
6 *
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
7 * Do ":help uganda" in Vim to read copying and usage conditions.
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
8 * Do ":help credits" in Vim to see a list of people who contributed.
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
9 * See README.txt for an overview of the Vim source code.
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
10 */
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
11
2683
0c7d6d01e058 updated for version 7.3.101
Bram Moolenaar <bram@vim.org>
parents: 2612
diff changeset
12 #include "vim.h"
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
13 #include "version.h"
2683
0c7d6d01e058 updated for version 7.3.101
Bram Moolenaar <bram@vim.org>
parents: 2612
diff changeset
14
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
15 #include <lua.h>
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
16 #include <lualib.h>
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
17 #include <lauxlib.h>
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
18
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
19 // Only do the following when the feature is enabled. Needed for "make
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
20 // depend".
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
21 #if defined(FEAT_LUA) || defined(PROTO)
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
22
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
23 #define LUAVIM_CHUNKNAME "vim chunk"
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
24 #define LUAVIM_NAME "vim"
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
25 #define LUAVIM_EVALNAME "luaeval"
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
26 #define LUAVIM_EVALHEADER "local _A=select(1,...) return "
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
27
24385
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
28 #ifdef LUA_RELEASE
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
29 # define LUAVIM_VERSION LUA_RELEASE
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
30 #else
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
31 # define LUAVIM_VERSION LUA_VERSION
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
32 #endif
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
33
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
34 typedef buf_T *luaV_Buffer;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
35 typedef win_T *luaV_Window;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
36 typedef dict_T *luaV_Dict;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
37 typedef list_T *luaV_List;
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
38 typedef blob_T *luaV_Blob;
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
39 typedef struct {
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
40 char_u *name; // funcref
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
41 dict_T *self; // selfdict
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
42 } luaV_Funcref;
22719
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
43 typedef int (*msgfunc_T)(char *);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
44
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
45 typedef struct {
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
46 int lua_funcref; // ref to a lua func
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
47 int lua_tableref; // ref to a lua table if metatable else LUA_NOREF. used
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
48 // for __call
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
49 lua_State *L;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
50 } luaV_CFuncState;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
51
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
52 static const char LUAVIM_DICT[] = "dict";
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
53 static const char LUAVIM_LIST[] = "list";
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
54 static const char LUAVIM_BLOB[] = "blob";
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
55 static const char LUAVIM_FUNCREF[] = "funcref";
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
56 static const char LUAVIM_BUFFER[] = "buffer";
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
57 static const char LUAVIM_WINDOW[] = "window";
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
58 static const char LUAVIM_FREE[] = "luaV_free";
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
59 static const char LUAVIM_LUAEVAL[] = "luaV_luaeval";
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
60 static const char LUAVIM_SETREF[] = "luaV_setref";
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
61
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
62 static const char LUA___CALL[] = "__call";
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
63
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
64 // most functions are closures with a cache table as first upvalue;
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
65 // get/setudata manage references to vim userdata in cache table through
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
66 // object pointers (light userdata)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
67 #define luaV_getudata(L, v) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
68 lua_pushlightuserdata((L), (void *) (v)); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
69 lua_rawget((L), lua_upvalueindex(1))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
70 #define luaV_setudata(L, v) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
71 lua_pushlightuserdata((L), (void *) (v)); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
72 lua_pushvalue((L), -2); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
73 lua_rawset((L), lua_upvalueindex(1))
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
74 #define luaV_getfield(L, s) \
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
75 lua_pushlightuserdata((L), (void *)(s)); \
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
76 lua_rawget((L), LUA_REGISTRYINDEX)
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
77 #define luaV_checksandbox(L) \
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
78 if (sandbox) luaL_error((L), "not allowed in sandbox")
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
79 #define luaV_msg(L) luaV_msgfunc((L), (msgfunc_T) msg)
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
80 #define luaV_emsg(L) luaV_msgfunc((L), (msgfunc_T) emsg)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
81 #define luaV_checktypval(L, a, v, msg) \
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
82 do { \
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
83 if (luaV_totypval(L, a, v) == FAIL) \
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
84 luaL_error(L, msg ": cannot convert value"); \
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
85 } while (0)
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
86
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
87 static luaV_List *luaV_pushlist(lua_State *L, list_T *lis);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
88 static luaV_Dict *luaV_pushdict(lua_State *L, dict_T *dic);
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
89 static luaV_Blob *luaV_pushblob(lua_State *L, blob_T *blo);
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
90 static luaV_Funcref *luaV_pushfuncref(lua_State *L, char_u *name);
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
91 static int luaV_call_lua_func(int argcount, typval_T *argvars, typval_T *rettv, void *state);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
92 static void luaV_call_lua_func_free(void *state);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
93
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
94 #if LUA_VERSION_NUM <= 501
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
95 #define luaV_openlib(L, l, n) luaL_openlib(L, NULL, l, n)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
96 #define luaL_typeerror luaL_typerror
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
97 #else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
98 #define luaV_openlib luaL_setfuncs
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
99 #endif
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
100
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
101 #ifdef DYNAMIC_LUA
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
102
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
103 #ifndef MSWIN
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
104 # include <dlfcn.h>
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
105 # define HANDLE void*
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
106 # define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
107 # define symbol_from_dll dlsym
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
108 # define close_dll dlclose
25342
c4298ed56ffa patch 8.2.3208: dynamic library load error does not mention why it failed
Bram Moolenaar <Bram@vim.org>
parents: 24385
diff changeset
109 # define load_dll_error dlerror
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
110 #else
2612
fa5dee44df3f updated for version 7.3.034
Bram Moolenaar <bram@vim.org>
parents: 2543
diff changeset
111 # define load_dll vimLoadLib
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
112 # define symbol_from_dll GetProcAddress
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
113 # define close_dll FreeLibrary
25342
c4298ed56ffa patch 8.2.3208: dynamic library load error does not mention why it failed
Bram Moolenaar <Bram@vim.org>
parents: 24385
diff changeset
114 # define load_dll_error GetWin32Error
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
115 #endif
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
116
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
117 // lauxlib
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
118 #if LUA_VERSION_NUM <= 501
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
119 #define luaL_register dll_luaL_register
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
120 #define luaL_prepbuffer dll_luaL_prepbuffer
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
121 #define luaL_openlib dll_luaL_openlib
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
122 #define luaL_typerror dll_luaL_typerror
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
123 #define luaL_loadfile dll_luaL_loadfile
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
124 #define luaL_loadbuffer dll_luaL_loadbuffer
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
125 #else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
126 #define luaL_prepbuffsize dll_luaL_prepbuffsize
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
127 #define luaL_setfuncs dll_luaL_setfuncs
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
128 #define luaL_loadfilex dll_luaL_loadfilex
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
129 #define luaL_loadbufferx dll_luaL_loadbufferx
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
130 #define luaL_argerror dll_luaL_argerror
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
131 #endif
21323
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
132 #if LUA_VERSION_NUM >= 504
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
133 #define luaL_typeerror dll_luaL_typeerror
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
134 #endif
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
135 #define luaL_checkany dll_luaL_checkany
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
136 #define luaL_checklstring dll_luaL_checklstring
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
137 #define luaL_checkinteger dll_luaL_checkinteger
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
138 #define luaL_optinteger dll_luaL_optinteger
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
139 #define luaL_checktype dll_luaL_checktype
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
140 #define luaL_error dll_luaL_error
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
141 #define luaL_newstate dll_luaL_newstate
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
142 #define luaL_buffinit dll_luaL_buffinit
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
143 #define luaL_addlstring dll_luaL_addlstring
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
144 #define luaL_pushresult dll_luaL_pushresult
20456
25392efa9039 patch 8.2.0782: cannot build with Lua on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 20454
diff changeset
145 #define luaL_loadstring dll_luaL_loadstring
21012
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
146 #define luaL_ref dll_luaL_ref
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
147 #define luaL_unref dll_luaL_unref
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
148 // lua
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
149 #if LUA_VERSION_NUM <= 501
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
150 #define lua_tonumber dll_lua_tonumber
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
151 #define lua_tointeger dll_lua_tointeger
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
152 #define lua_call dll_lua_call
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
153 #define lua_pcall dll_lua_pcall
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
154 #else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
155 #define lua_tonumberx dll_lua_tonumberx
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
156 #define lua_tointegerx dll_lua_tointegerx
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
157 #define lua_callk dll_lua_callk
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
158 #define lua_pcallk dll_lua_pcallk
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
159 #define lua_getglobal dll_lua_getglobal
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
160 #define lua_setglobal dll_lua_setglobal
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
161 #endif
6887
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
162 #if LUA_VERSION_NUM <= 502
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
163 #define lua_replace dll_lua_replace
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
164 #define lua_remove dll_lua_remove
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
165 #endif
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
166 #if LUA_VERSION_NUM >= 503
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
167 #define lua_rotate dll_lua_rotate
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
168 #define lua_copy dll_lua_copy
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
169 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
170 #define lua_typename dll_lua_typename
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
171 #define lua_close dll_lua_close
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
172 #define lua_gettop dll_lua_gettop
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
173 #define lua_settop dll_lua_settop
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
174 #define lua_pushvalue dll_lua_pushvalue
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
175 #define lua_isnumber dll_lua_isnumber
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
176 #define lua_isstring dll_lua_isstring
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
177 #define lua_type dll_lua_type
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
178 #define lua_rawequal dll_lua_rawequal
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
179 #define lua_toboolean dll_lua_toboolean
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
180 #define lua_tolstring dll_lua_tolstring
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
181 #define lua_touserdata dll_lua_touserdata
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
182 #define lua_pushnil dll_lua_pushnil
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
183 #define lua_pushnumber dll_lua_pushnumber
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
184 #define lua_pushinteger dll_lua_pushinteger
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
185 #define lua_pushlstring dll_lua_pushlstring
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
186 #define lua_pushstring dll_lua_pushstring
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
187 #define lua_pushfstring dll_lua_pushfstring
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
188 #define lua_pushcclosure dll_lua_pushcclosure
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
189 #define lua_pushboolean dll_lua_pushboolean
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
190 #define lua_pushlightuserdata dll_lua_pushlightuserdata
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
191 #define lua_getfield dll_lua_getfield
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
192 #define lua_rawget dll_lua_rawget
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
193 #define lua_rawgeti dll_lua_rawgeti
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
194 #define lua_createtable dll_lua_createtable
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
195 #define lua_settable dll_lua_settable
14583
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
196 #if LUA_VERSION_NUM >= 504
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
197 #define lua_newuserdatauv dll_lua_newuserdatauv
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
198 #else
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
199 #define lua_newuserdata dll_lua_newuserdata
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
200 #endif
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
201 #define lua_getmetatable dll_lua_getmetatable
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
202 #define lua_setfield dll_lua_setfield
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
203 #define lua_rawset dll_lua_rawset
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
204 #define lua_rawseti dll_lua_rawseti
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
205 #define lua_setmetatable dll_lua_setmetatable
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
206 #define lua_next dll_lua_next
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
207 // libs
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
208 #define luaopen_base dll_luaopen_base
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
209 #define luaopen_table dll_luaopen_table
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
210 #define luaopen_string dll_luaopen_string
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
211 #define luaopen_math dll_luaopen_math
2431
7b764999f9b9 Update for Lua interface. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2373
diff changeset
212 #define luaopen_io dll_luaopen_io
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
213 #define luaopen_os dll_luaopen_os
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
214 #define luaopen_package dll_luaopen_package
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
215 #define luaopen_debug dll_luaopen_debug
2431
7b764999f9b9 Update for Lua interface. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2373
diff changeset
216 #define luaL_openlibs dll_luaL_openlibs
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
217
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
218 // lauxlib
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
219 #if LUA_VERSION_NUM <= 501
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
220 void (*dll_luaL_register) (lua_State *L, const char *libname, const luaL_Reg *l);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
221 char *(*dll_luaL_prepbuffer) (luaL_Buffer *B);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
222 void (*dll_luaL_openlib) (lua_State *L, const char *libname, const luaL_Reg *l, int nup);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
223 int (*dll_luaL_typerror) (lua_State *L, int narg, const char *tname);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
224 int (*dll_luaL_loadfile) (lua_State *L, const char *filename);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
225 int (*dll_luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, const char *name);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
226 #else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
227 char *(*dll_luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
228 void (*dll_luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
229 int (*dll_luaL_loadfilex) (lua_State *L, const char *filename, const char *mode);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
230 int (*dll_luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, const char *name, const char *mode);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
231 int (*dll_luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
232 #endif
21323
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
233 #if LUA_VERSION_NUM >= 504
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
234 int (*dll_luaL_typeerror) (lua_State *L, int narg, const char *tname);
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
235 #endif
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
236 void (*dll_luaL_checkany) (lua_State *L, int narg);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
237 const char *(*dll_luaL_checklstring) (lua_State *L, int numArg, size_t *l);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
238 lua_Integer (*dll_luaL_checkinteger) (lua_State *L, int numArg);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
239 lua_Integer (*dll_luaL_optinteger) (lua_State *L, int nArg, lua_Integer def);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
240 void (*dll_luaL_checktype) (lua_State *L, int narg, int t);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
241 int (*dll_luaL_error) (lua_State *L, const char *fmt, ...);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
242 lua_State *(*dll_luaL_newstate) (void);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
243 void (*dll_luaL_buffinit) (lua_State *L, luaL_Buffer *B);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
244 void (*dll_luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
245 void (*dll_luaL_pushresult) (luaL_Buffer *B);
20456
25392efa9039 patch 8.2.0782: cannot build with Lua on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 20454
diff changeset
246 int (*dll_luaL_loadstring) (lua_State *L, const char *s);
21012
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
247 int (*dll_luaL_ref) (lua_State *L, int idx);
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
248 #if LUA_VERSION_NUM <= 502
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
249 void (*dll_luaL_unref) (lua_State *L, int idx, int n);
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
250 #else
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
251 void (*dll_luaL_unref) (lua_State *L, int idx, lua_Integer n);
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
252 #endif
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
253 // lua
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
254 #if LUA_VERSION_NUM <= 501
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
255 lua_Number (*dll_lua_tonumber) (lua_State *L, int idx);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
256 lua_Integer (*dll_lua_tointeger) (lua_State *L, int idx);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
257 void (*dll_lua_call) (lua_State *L, int nargs, int nresults);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
258 int (*dll_lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
259 #else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
260 lua_Number (*dll_lua_tonumberx) (lua_State *L, int idx, int *isnum);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
261 lua_Integer (*dll_lua_tointegerx) (lua_State *L, int idx, int *isnum);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
262 void (*dll_lua_callk) (lua_State *L, int nargs, int nresults, int ctx,
3618
c052f3b79b99 updated for version 7.3.569
Bram Moolenaar <bram@vim.org>
parents: 3459
diff changeset
263 lua_CFunction k);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
264 int (*dll_lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc,
3618
c052f3b79b99 updated for version 7.3.569
Bram Moolenaar <bram@vim.org>
parents: 3459
diff changeset
265 int ctx, lua_CFunction k);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
266 void (*dll_lua_getglobal) (lua_State *L, const char *var);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
267 void (*dll_lua_setglobal) (lua_State *L, const char *var);
6887
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
268 #endif
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
269 #if LUA_VERSION_NUM <= 502
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
270 void (*dll_lua_replace) (lua_State *L, int idx);
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
271 void (*dll_lua_remove) (lua_State *L, int idx);
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
272 #endif
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
273 #if LUA_VERSION_NUM >= 503
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
274 void (*dll_lua_rotate) (lua_State *L, int idx, int n);
6878
02466bf84bab patch 7.4.759
Bram Moolenaar <bram@vim.org>
parents: 6625
diff changeset
275 void (*dll_lua_copy) (lua_State *L, int fromidx, int toidx);
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
276 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
277 const char *(*dll_lua_typename) (lua_State *L, int tp);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
278 void (*dll_lua_close) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
279 int (*dll_lua_gettop) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
280 void (*dll_lua_settop) (lua_State *L, int idx);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
281 void (*dll_lua_pushvalue) (lua_State *L, int idx);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
282 int (*dll_lua_isnumber) (lua_State *L, int idx);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
283 int (*dll_lua_isstring) (lua_State *L, int idx);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
284 int (*dll_lua_type) (lua_State *L, int idx);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
285 int (*dll_lua_rawequal) (lua_State *L, int idx1, int idx2);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
286 int (*dll_lua_toboolean) (lua_State *L, int idx);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
287 const char *(*dll_lua_tolstring) (lua_State *L, int idx, size_t *len);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
288 void *(*dll_lua_touserdata) (lua_State *L, int idx);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
289 void (*dll_lua_pushnil) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
290 void (*dll_lua_pushnumber) (lua_State *L, lua_Number n);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
291 void (*dll_lua_pushinteger) (lua_State *L, lua_Integer n);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
292 void (*dll_lua_pushlstring) (lua_State *L, const char *s, size_t l);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
293 void (*dll_lua_pushstring) (lua_State *L, const char *s);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
294 const char *(*dll_lua_pushfstring) (lua_State *L, const char *fmt, ...);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
295 void (*dll_lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
296 void (*dll_lua_pushboolean) (lua_State *L, int b);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
297 void (*dll_lua_pushlightuserdata) (lua_State *L, void *p);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
298 void (*dll_lua_getfield) (lua_State *L, int idx, const char *k);
14335
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
299 #if LUA_VERSION_NUM <= 502
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
300 void (*dll_lua_rawget) (lua_State *L, int idx);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
301 void (*dll_lua_rawgeti) (lua_State *L, int idx, int n);
14335
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
302 #else
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
303 int (*dll_lua_rawget) (lua_State *L, int idx);
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
304 int (*dll_lua_rawgeti) (lua_State *L, int idx, lua_Integer n);
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
305 #endif
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
306 void (*dll_lua_createtable) (lua_State *L, int narr, int nrec);
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
307 void (*dll_lua_settable) (lua_State *L, int idx);
14583
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
308 #if LUA_VERSION_NUM >= 504
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
309 void *(*dll_lua_newuserdatauv) (lua_State *L, size_t sz, int nuvalue);
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
310 #else
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
311 void *(*dll_lua_newuserdata) (lua_State *L, size_t sz);
14583
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
312 #endif
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
313 int (*dll_lua_getmetatable) (lua_State *L, int objindex);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
314 void (*dll_lua_setfield) (lua_State *L, int idx, const char *k);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
315 void (*dll_lua_rawset) (lua_State *L, int idx);
14335
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
316 #if LUA_VERSION_NUM <= 502
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
317 void (*dll_lua_rawseti) (lua_State *L, int idx, int n);
14335
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
318 #else
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
319 void (*dll_lua_rawseti) (lua_State *L, int idx, lua_Integer n);
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
320 #endif
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
321 int (*dll_lua_setmetatable) (lua_State *L, int objindex);
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
322 int (*dll_lua_next) (lua_State *L, int idx);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
323 // libs
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
324 int (*dll_luaopen_base) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
325 int (*dll_luaopen_table) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
326 int (*dll_luaopen_string) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
327 int (*dll_luaopen_math) (lua_State *L);
2431
7b764999f9b9 Update for Lua interface. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2373
diff changeset
328 int (*dll_luaopen_io) (lua_State *L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
329 int (*dll_luaopen_os) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
330 int (*dll_luaopen_package) (lua_State *L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
331 int (*dll_luaopen_debug) (lua_State *L);
2431
7b764999f9b9 Update for Lua interface. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2373
diff changeset
332 void (*dll_luaL_openlibs) (lua_State *L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
333
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
334 typedef void **luaV_function;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
335 typedef struct {
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
336 const char *name;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
337 luaV_function func;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
338 } luaV_Reg;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
339
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
340 static const luaV_Reg luaV_dll[] = {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
341 // lauxlib
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
342 #if LUA_VERSION_NUM <= 501
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
343 {"luaL_register", (luaV_function) &dll_luaL_register},
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
344 {"luaL_prepbuffer", (luaV_function) &dll_luaL_prepbuffer},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
345 {"luaL_openlib", (luaV_function) &dll_luaL_openlib},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
346 {"luaL_typerror", (luaV_function) &dll_luaL_typerror},
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
347 {"luaL_loadfile", (luaV_function) &dll_luaL_loadfile},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
348 {"luaL_loadbuffer", (luaV_function) &dll_luaL_loadbuffer},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
349 #else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
350 {"luaL_prepbuffsize", (luaV_function) &dll_luaL_prepbuffsize},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
351 {"luaL_setfuncs", (luaV_function) &dll_luaL_setfuncs},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
352 {"luaL_loadfilex", (luaV_function) &dll_luaL_loadfilex},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
353 {"luaL_loadbufferx", (luaV_function) &dll_luaL_loadbufferx},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
354 {"luaL_argerror", (luaV_function) &dll_luaL_argerror},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
355 #endif
21323
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
356 #if LUA_VERSION_NUM >= 504
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
357 {"luaL_typeerror", (luaV_function) &dll_luaL_typeerror},
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
358 #endif
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
359 {"luaL_checkany", (luaV_function) &dll_luaL_checkany},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
360 {"luaL_checklstring", (luaV_function) &dll_luaL_checklstring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
361 {"luaL_checkinteger", (luaV_function) &dll_luaL_checkinteger},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
362 {"luaL_optinteger", (luaV_function) &dll_luaL_optinteger},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
363 {"luaL_checktype", (luaV_function) &dll_luaL_checktype},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
364 {"luaL_error", (luaV_function) &dll_luaL_error},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
365 {"luaL_newstate", (luaV_function) &dll_luaL_newstate},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
366 {"luaL_buffinit", (luaV_function) &dll_luaL_buffinit},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
367 {"luaL_addlstring", (luaV_function) &dll_luaL_addlstring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
368 {"luaL_pushresult", (luaV_function) &dll_luaL_pushresult},
20456
25392efa9039 patch 8.2.0782: cannot build with Lua on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 20454
diff changeset
369 {"luaL_loadstring", (luaV_function) &dll_luaL_loadstring},
21012
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
370 {"luaL_ref", (luaV_function) &dll_luaL_ref},
380923b96878 patch 8.2.1057: cannot build with dynamic Lua
Bram Moolenaar <Bram@vim.org>
parents: 21006
diff changeset
371 {"luaL_unref", (luaV_function) &dll_luaL_unref},
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
372 // lua
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
373 #if LUA_VERSION_NUM <= 501
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
374 {"lua_tonumber", (luaV_function) &dll_lua_tonumber},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
375 {"lua_tointeger", (luaV_function) &dll_lua_tointeger},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
376 {"lua_call", (luaV_function) &dll_lua_call},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
377 {"lua_pcall", (luaV_function) &dll_lua_pcall},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
378 #else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
379 {"lua_tonumberx", (luaV_function) &dll_lua_tonumberx},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
380 {"lua_tointegerx", (luaV_function) &dll_lua_tointegerx},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
381 {"lua_callk", (luaV_function) &dll_lua_callk},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
382 {"lua_pcallk", (luaV_function) &dll_lua_pcallk},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
383 {"lua_getglobal", (luaV_function) &dll_lua_getglobal},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
384 {"lua_setglobal", (luaV_function) &dll_lua_setglobal},
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
385 #endif
6887
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
386 #if LUA_VERSION_NUM <= 502
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
387 {"lua_replace", (luaV_function) &dll_lua_replace},
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
388 {"lua_remove", (luaV_function) &dll_lua_remove},
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
389 #endif
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
390 #if LUA_VERSION_NUM >= 503
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
391 {"lua_rotate", (luaV_function) &dll_lua_rotate},
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
392 {"lua_copy", (luaV_function) &dll_lua_copy},
2b7e36955265 patch 7.4.763
Bram Moolenaar <bram@vim.org>
parents: 6878
diff changeset
393 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
394 {"lua_typename", (luaV_function) &dll_lua_typename},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
395 {"lua_close", (luaV_function) &dll_lua_close},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
396 {"lua_gettop", (luaV_function) &dll_lua_gettop},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
397 {"lua_settop", (luaV_function) &dll_lua_settop},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
398 {"lua_pushvalue", (luaV_function) &dll_lua_pushvalue},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
399 {"lua_isnumber", (luaV_function) &dll_lua_isnumber},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
400 {"lua_isstring", (luaV_function) &dll_lua_isstring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
401 {"lua_type", (luaV_function) &dll_lua_type},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
402 {"lua_rawequal", (luaV_function) &dll_lua_rawequal},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
403 {"lua_toboolean", (luaV_function) &dll_lua_toboolean},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
404 {"lua_tolstring", (luaV_function) &dll_lua_tolstring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
405 {"lua_touserdata", (luaV_function) &dll_lua_touserdata},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
406 {"lua_pushnil", (luaV_function) &dll_lua_pushnil},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
407 {"lua_pushnumber", (luaV_function) &dll_lua_pushnumber},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
408 {"lua_pushinteger", (luaV_function) &dll_lua_pushinteger},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
409 {"lua_pushlstring", (luaV_function) &dll_lua_pushlstring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
410 {"lua_pushstring", (luaV_function) &dll_lua_pushstring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
411 {"lua_pushfstring", (luaV_function) &dll_lua_pushfstring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
412 {"lua_pushcclosure", (luaV_function) &dll_lua_pushcclosure},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
413 {"lua_pushboolean", (luaV_function) &dll_lua_pushboolean},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
414 {"lua_pushlightuserdata", (luaV_function) &dll_lua_pushlightuserdata},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
415 {"lua_getfield", (luaV_function) &dll_lua_getfield},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
416 {"lua_rawget", (luaV_function) &dll_lua_rawget},
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
417 {"lua_rawgeti", (luaV_function) &dll_lua_rawgeti},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
418 {"lua_createtable", (luaV_function) &dll_lua_createtable},
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
419 {"lua_settable", (luaV_function) &dll_lua_settable},
14583
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
420 #if LUA_VERSION_NUM >= 504
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
421 {"lua_newuserdatauv", (luaV_function) &dll_lua_newuserdatauv},
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
422 #else
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
423 {"lua_newuserdata", (luaV_function) &dll_lua_newuserdata},
14583
42eaac6eb4e4 patch 8.1.0305: missing support for Lua 5.4 32 bits on Unix
Christian Brabandt <cb@256bit.org>
parents: 14395
diff changeset
424 #endif
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
425 {"lua_getmetatable", (luaV_function) &dll_lua_getmetatable},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
426 {"lua_setfield", (luaV_function) &dll_lua_setfield},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
427 {"lua_rawset", (luaV_function) &dll_lua_rawset},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
428 {"lua_rawseti", (luaV_function) &dll_lua_rawseti},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
429 {"lua_setmetatable", (luaV_function) &dll_lua_setmetatable},
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
430 {"lua_next", (luaV_function) &dll_lua_next},
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
431 // libs
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
432 {"luaopen_base", (luaV_function) &dll_luaopen_base},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
433 {"luaopen_table", (luaV_function) &dll_luaopen_table},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
434 {"luaopen_string", (luaV_function) &dll_luaopen_string},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
435 {"luaopen_math", (luaV_function) &dll_luaopen_math},
2431
7b764999f9b9 Update for Lua interface. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2373
diff changeset
436 {"luaopen_io", (luaV_function) &dll_luaopen_io},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
437 {"luaopen_os", (luaV_function) &dll_luaopen_os},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
438 {"luaopen_package", (luaV_function) &dll_luaopen_package},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
439 {"luaopen_debug", (luaV_function) &dll_luaopen_debug},
2431
7b764999f9b9 Update for Lua interface. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2373
diff changeset
440 {"luaL_openlibs", (luaV_function) &dll_luaL_openlibs},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
441 {NULL, NULL}
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
442 };
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
443
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
444 static HANDLE hinstLua = NULL;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
445
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
446 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
447 lua_link_init(char *libname, int verbose)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
448 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
449 const luaV_Reg *reg;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
450 if (hinstLua) return OK;
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
451 hinstLua = load_dll(libname);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
452 if (!hinstLua)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
453 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
454 if (verbose)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 25881
diff changeset
455 semsg(_(e_could_not_load_library_str_str), libname, load_dll_error());
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
456 return FAIL;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
457 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
458 for (reg = luaV_dll; reg->func; reg++)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
459 {
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
460 if ((*reg->func = symbol_from_dll(hinstLua, reg->name)) == NULL)
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
461 {
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
462 close_dll(hinstLua);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
463 hinstLua = 0;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
464 if (verbose)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 25881
diff changeset
465 semsg(_(e_could_not_load_library_function_str), reg->name);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
466 return FAIL;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
467 }
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
468 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
469 return OK;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
470 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
471 #endif // DYNAMIC_LUA
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
472
10025
068f397d0da4 commit https://github.com/vim/vim/commit/d90b6c02e2900576fb37d95b5e4f4a32b2d7383f
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
473 #if defined(DYNAMIC_LUA) || defined(PROTO)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
474 int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
475 lua_enabled(int verbose)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
476 {
7528
53163e4d9e4f commit https://github.com/vim/vim/commit/25e4fcde767084d1a79e0926bc301c92987c0cce
Christian Brabandt <cb@256bit.org>
parents: 7297
diff changeset
477 return lua_link_init((char *)p_luadll, verbose) == OK;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
478 }
10025
068f397d0da4 commit https://github.com/vim/vim/commit/d90b6c02e2900576fb37d95b5e4f4a32b2d7383f
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
479 #endif
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
480
21323
5b0bbc5d4e74 patch 8.2.1212: cannot build with Lua 5.4
Bram Moolenaar <Bram@vim.org>
parents: 21132
diff changeset
481 #if LUA_VERSION_NUM > 501 && LUA_VERSION_NUM < 504
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
482 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
483 luaL_typeerror(lua_State *L, int narg, const char *tname)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
484 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
485 const char *msg = lua_pushfstring(L, "%s expected, got %s",
3618
c052f3b79b99 updated for version 7.3.569
Bram Moolenaar <bram@vim.org>
parents: 3459
diff changeset
486 tname, luaL_typename(L, narg));
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
487 return luaL_argerror(L, narg, msg);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
488 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
489 #endif
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
490
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
491
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
492 // ======= Internal =======
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
493
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
494 static void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
495 luaV_newmetatable(lua_State *L, const char *tname)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
496 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
497 lua_newtable(L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
498 lua_pushlightuserdata(L, (void *) tname);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
499 lua_pushvalue(L, -2);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
500 lua_rawset(L, LUA_REGISTRYINDEX);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
501 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
502
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
503 static void *
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
504 luaV_toudata(lua_State *L, int ud, const char *tname)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
505 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
506 void *p = lua_touserdata(L, ud);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
507
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
508 if (p == NULL)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
509 return NULL;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
510
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
511 // value is userdata
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
512 if (lua_getmetatable(L, ud)) // does it have a metatable?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
513 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
514 luaV_getfield(L, tname); // get metatable
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
515 if (lua_rawequal(L, -1, -2)) // MTs match?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
516 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
517 lua_pop(L, 2); // MTs
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
518 return p;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
519 }
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
520 }
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
521
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
522 return NULL;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
523 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
524
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
525 static void *
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
526 luaV_checkcache(lua_State *L, void *p)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
527 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
528 luaV_getudata(L, p);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
529 if (lua_isnil(L, -1)) luaL_error(L, "invalid object");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
530 lua_pop(L, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
531 return p;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
532 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
533
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
534 #define luaV_unbox(L,luatyp,ud) (*((luatyp *) lua_touserdata((L),(ud))))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
535
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
536 #define luaV_checkvalid(L,luatyp,ud) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
537 luaV_checkcache((L), (void *) luaV_unbox((L),luatyp,(ud)))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
538
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
539 static void *
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
540 luaV_checkudata(lua_State *L, int ud, const char *tname)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
541 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
542 void *p = luaV_toudata(L, ud, tname);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
543 if (p == NULL) luaL_typeerror(L, ud, tname);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
544 return p;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
545 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
546
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
547 static void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
548 luaV_pushtypval(lua_State *L, typval_T *tv)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
549 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
550 if (tv == NULL)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
551 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
552 lua_pushnil(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
553 return;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
554 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
555 switch (tv->v_type)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
556 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
557 case VAR_STRING:
3865
3c072c1cb873 updated for version 7.3.689
Bram Moolenaar <bram@vim.org>
parents: 3618
diff changeset
558 lua_pushstring(L, tv->vval.v_string == NULL
3c072c1cb873 updated for version 7.3.689
Bram Moolenaar <bram@vim.org>
parents: 3618
diff changeset
559 ? "" : (char *)tv->vval.v_string);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
560 break;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
561 case VAR_NUMBER:
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
562 lua_pushinteger(L, (int) tv->vval.v_number);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
563 break;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
564 case VAR_FLOAT:
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
565 lua_pushnumber(L, (lua_Number) tv->vval.v_float);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
566 break;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
567 case VAR_LIST:
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
568 luaV_pushlist(L, tv->vval.v_list);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
569 break;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
570 case VAR_DICT:
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
571 luaV_pushdict(L, tv->vval.v_dict);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
572 break;
19102
ba9f50bfda83 patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents: 18798
diff changeset
573 case VAR_BOOL:
7712
bce3b5ddb393 commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents: 7528
diff changeset
574 case VAR_SPECIAL:
bce3b5ddb393 commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents: 7528
diff changeset
575 if (tv->vval.v_number <= VVAL_TRUE)
bce3b5ddb393 commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents: 7528
diff changeset
576 lua_pushinteger(L, (int) tv->vval.v_number);
bce3b5ddb393 commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents: 7528
diff changeset
577 else
bce3b5ddb393 commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents: 7528
diff changeset
578 lua_pushnil(L);
bce3b5ddb393 commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents: 7528
diff changeset
579 break;
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
580 case VAR_FUNC:
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
581 luaV_pushfuncref(L, tv->vval.v_string);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
582 break;
24073
c424821dc031 patch 8.2.2578: Lua cannot handle a passed in lambda
Bram Moolenaar <Bram@vim.org>
parents: 22719
diff changeset
583 case VAR_PARTIAL:
c424821dc031 patch 8.2.2578: Lua cannot handle a passed in lambda
Bram Moolenaar <Bram@vim.org>
parents: 22719
diff changeset
584 // TODO: handle partial arguments
c424821dc031 patch 8.2.2578: Lua cannot handle a passed in lambda
Bram Moolenaar <Bram@vim.org>
parents: 22719
diff changeset
585 luaV_pushfuncref(L, partial_name(tv->vval.v_partial));
c424821dc031 patch 8.2.2578: Lua cannot handle a passed in lambda
Bram Moolenaar <Bram@vim.org>
parents: 22719
diff changeset
586 break;
c424821dc031 patch 8.2.2578: Lua cannot handle a passed in lambda
Bram Moolenaar <Bram@vim.org>
parents: 22719
diff changeset
587
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
588 case VAR_BLOB:
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
589 luaV_pushblob(L, tv->vval.v_blob);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
590 break;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
591 default:
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
592 lua_pushnil(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
593 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
594 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
595
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
596 /*
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
597 * Converts lua value at 'pos' to typval 'tv'.
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
598 * Returns OK or FAIL.
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
599 */
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
600 static int
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
601 luaV_totypval(lua_State *L, int pos, typval_T *tv)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
602 {
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
603 int status = OK;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
604
21132
985e61894bb4 patch 8.2.1117: Coverity warns for unsing unitialized field
Bram Moolenaar <Bram@vim.org>
parents: 21108
diff changeset
605 tv->v_lock = 0;
985e61894bb4 patch 8.2.1117: Coverity warns for unsing unitialized field
Bram Moolenaar <Bram@vim.org>
parents: 21108
diff changeset
606
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
607 switch (lua_type(L, pos))
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
608 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
609 case LUA_TBOOLEAN:
19102
ba9f50bfda83 patch 8.2.0111: VAR_SPECIAL is also used for booleans
Bram Moolenaar <Bram@vim.org>
parents: 18798
diff changeset
610 tv->v_type = VAR_BOOL;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
611 tv->vval.v_number = (varnumber_T) lua_toboolean(L, pos);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
612 break;
15328
f7130bc17248 patch 8.1.0672: the Lua interface doesn't know about v:null
Bram Moolenaar <Bram@vim.org>
parents: 14583
diff changeset
613 case LUA_TNIL:
f7130bc17248 patch 8.1.0672: the Lua interface doesn't know about v:null
Bram Moolenaar <Bram@vim.org>
parents: 14583
diff changeset
614 tv->v_type = VAR_SPECIAL;
f7130bc17248 patch 8.1.0672: the Lua interface doesn't know about v:null
Bram Moolenaar <Bram@vim.org>
parents: 14583
diff changeset
615 tv->vval.v_number = VVAL_NULL;
f7130bc17248 patch 8.1.0672: the Lua interface doesn't know about v:null
Bram Moolenaar <Bram@vim.org>
parents: 14583
diff changeset
616 break;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
617 case LUA_TSTRING:
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
618 tv->v_type = VAR_STRING;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
619 tv->vval.v_string = vim_strsave((char_u *) lua_tostring(L, pos));
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
620 break;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
621 case LUA_TNUMBER:
20441
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
622 {
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
623 const lua_Number n = lua_tonumber(L, pos);
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
624
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
625 if (n > (lua_Number)INT64_MAX || n < (lua_Number)INT64_MIN
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
626 || ((lua_Number)((varnumber_T)n)) != n)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
627 {
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
628 tv->v_type = VAR_FLOAT;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
629 tv->vval.v_float = (float_T)n;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
630 }
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
631 else
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
632 {
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
633 tv->v_type = VAR_NUMBER;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
634 tv->vval.v_number = (varnumber_T)n;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
635 }
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
636 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
637 break;
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
638 case LUA_TFUNCTION:
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
639 {
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
640 char_u *name;
21367
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
641 luaV_CFuncState *state;
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
642
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
643 lua_pushvalue(L, pos);
21367
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
644 state = ALLOC_CLEAR_ONE(luaV_CFuncState);
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
645 state->lua_funcref = luaL_ref(L, LUA_REGISTRYINDEX);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
646 state->L = L;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
647 state->lua_tableref = LUA_NOREF;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
648 name = register_cfunc(&luaV_call_lua_func,
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
649 &luaV_call_lua_func_free, state);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
650 tv->v_type = VAR_FUNC;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
651 tv->vval.v_string = vim_strsave(name);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
652 break;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
653 }
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
654 case LUA_TTABLE:
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
655 {
21367
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
656 int lua_tableref;
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
657
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
658 lua_pushvalue(L, pos);
21367
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
659 lua_tableref = luaL_ref(L, LUA_REGISTRYINDEX);
31804
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31702
diff changeset
660 if (lua_getmetatable(L, pos))
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31702
diff changeset
661 {
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
662 lua_getfield(L, -1, LUA___CALL);
31804
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31702
diff changeset
663 if (lua_isfunction(L, -1))
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31702
diff changeset
664 {
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
665 char_u *name;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
666 int lua_funcref = luaL_ref(L, LUA_REGISTRYINDEX);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
667 luaV_CFuncState *state = ALLOC_CLEAR_ONE(luaV_CFuncState);
21367
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
668
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
669 state->lua_funcref = lua_funcref;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
670 state->L = L;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
671 state->lua_tableref = lua_tableref;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
672 name = register_cfunc(&luaV_call_lua_func,
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
673 &luaV_call_lua_func_free, state);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
674 tv->v_type = VAR_FUNC;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
675 tv->vval.v_string = vim_strsave(name);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
676 break;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
677 }
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
678 }
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
679 tv->v_type = VAR_NUMBER;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
680 tv->vval.v_number = 0;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
681 status = FAIL;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
682 break;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
683 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
684 case LUA_TUSERDATA:
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
685 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
686 void *p = lua_touserdata(L, pos);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
687
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
688 if (lua_getmetatable(L, pos)) // has metatable?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
689 {
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
690 // check list
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
691 luaV_getfield(L, LUAVIM_LIST);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
692 if (lua_rawequal(L, -1, -2))
2373
f149bb1cf5be Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents: 2331
diff changeset
693 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
694 tv->v_type = VAR_LIST;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
695 tv->vval.v_list = *((luaV_List *) p);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
696 ++tv->vval.v_list->lv_refcount;
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
697 lua_pop(L, 2); // MTs
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
698 break;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
699 }
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
700 // check dict
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
701 luaV_getfield(L, LUAVIM_DICT);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
702 if (lua_rawequal(L, -1, -3))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
703 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
704 tv->v_type = VAR_DICT;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
705 tv->vval.v_dict = *((luaV_Dict *) p);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
706 ++tv->vval.v_dict->dv_refcount;
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
707 lua_pop(L, 3); // MTs
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
708 break;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
709 }
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
710 // check blob
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
711 luaV_getfield(L, LUAVIM_BLOB);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
712 if (lua_rawequal(L, -1, -4))
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
713 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
714 tv->v_type = VAR_BLOB;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
715 tv->vval.v_blob = *((luaV_Blob *) p);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
716 ++tv->vval.v_blob->bv_refcount;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
717 lua_pop(L, 4); // MTs
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
718 break;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
719 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
720 // check funcref
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
721 luaV_getfield(L, LUAVIM_FUNCREF);
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
722 if (lua_rawequal(L, -1, -5))
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
723 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
724 luaV_Funcref *f = (luaV_Funcref *) p;
21367
f9d87868d77f patch 8.2.1234: Lua build problem with old compiler
Bram Moolenaar <Bram@vim.org>
parents: 21323
diff changeset
725
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
726 func_ref(f->name);
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
727 tv->v_type = VAR_FUNC;
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
728 tv->vval.v_string = vim_strsave(f->name);
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
729 lua_pop(L, 5); // MTs
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
730 break;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
731 }
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
732 lua_pop(L, 4); // MTs
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
733 }
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
734 }
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
735 // FALLTHROUGH
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
736 default:
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
737 tv->v_type = VAR_NUMBER;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
738 tv->vval.v_number = 0;
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
739 status = FAIL;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
740 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
741 return status;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
742 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
743
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
744 /*
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
745 * similar to luaL_addlstring, but replaces \0 with \n if toline and
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
746 * \n with \0 otherwise
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
747 */
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
748 static void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
749 luaV_addlstring(luaL_Buffer *b, const char *s, size_t l, int toline)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
750 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
751 while (l--)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
752 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
753 if (*s == '\0' && toline)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
754 luaL_addchar(b, '\n');
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
755 else if (*s == '\n' && !toline)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
756 luaL_addchar(b, '\0');
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
757 else
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
758 luaL_addchar(b, *s);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
759 s++;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
760 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
761 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
762
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
763 static void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
764 luaV_pushline(lua_State *L, buf_T *buf, linenr_T n)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
765 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
766 const char *s = (const char *) ml_get_buf(buf, n, FALSE);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
767 luaL_Buffer b;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
768 luaL_buffinit(L, &b);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
769 luaV_addlstring(&b, s, strlen(s), 0);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
770 luaL_pushresult(&b);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
771 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
772
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
773 static char_u *
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
774 luaV_toline(lua_State *L, int pos)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
775 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
776 size_t l;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
777 const char *s = lua_tolstring(L, pos, &l);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
778
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
779 luaL_Buffer b;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
780 luaL_buffinit(L, &b);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
781 luaV_addlstring(&b, s, l, 1);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
782 luaL_pushresult(&b);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
783 return (char_u *) lua_tostring(L, -1);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
784 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
785
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
786 /*
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
787 * pops a string s from the top of the stack and calls mf(t) for pieces t of
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
788 * s separated by newlines
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
789 */
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
790 static void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
791 luaV_msgfunc(lua_State *L, msgfunc_T mf)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
792 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
793 luaL_Buffer b;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
794 size_t l;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
795 const char *p, *s = lua_tolstring(L, -1, &l);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
796 luaL_buffinit(L, &b);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
797 luaV_addlstring(&b, s, l, 0);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
798 luaL_pushresult(&b);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
799 // break string
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
800 p = s = lua_tolstring(L, -1, &l);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
801 while (l--)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
802 {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
803 if (*p++ == '\0') // break?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
804 {
22719
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
805 mf((char *)s);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
806 s = p;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
807 }
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
808 }
22719
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
809 mf((char *)s);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
810 lua_pop(L, 2); // original and modified strings
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
811 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
812
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
813 #define luaV_newtype(typ,tname,luatyp,luatname) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
814 static luatyp * \
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
815 luaV_new##tname(lua_State *L, typ *obj) \
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
816 { \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
817 luatyp *o = (luatyp *) lua_newuserdata(L, sizeof(luatyp)); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
818 *o = obj; \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
819 luaV_setudata(L, obj); /* cache[obj] = udata */ \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
820 luaV_getfield(L, luatname); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
821 lua_setmetatable(L, -2); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
822 return o; \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
823 }
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
824
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
825 #define luaV_pushtype(typ,tname,luatyp) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
826 static luatyp * \
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
827 luaV_push##tname(lua_State *L, typ *obj) \
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
828 { \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
829 luatyp *o = NULL; \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
830 if (obj == NULL) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
831 lua_pushnil(L); \
31804
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31702
diff changeset
832 else \
50555279168b patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents: 31702
diff changeset
833 { \
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
834 luaV_getudata(L, obj); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
835 if (lua_isnil(L, -1)) /* not interned? */ \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
836 { \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
837 lua_pop(L, 1); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
838 o = luaV_new##tname(L, obj); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
839 } \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
840 else \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
841 o = (luatyp *) lua_touserdata(L, -1); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
842 } \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
843 return o; \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
844 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
845
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
846 #define luaV_type_tostring(tname,luatname) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
847 static int \
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
848 luaV_##tname##_tostring(lua_State *L) \
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
849 { \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
850 lua_pushfstring(L, "%s: %p", luatname, lua_touserdata(L, 1)); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
851 return 1; \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
852 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
853
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
854 // ======= List type =======
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
855
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
856 static luaV_List *
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
857 luaV_newlist(lua_State *L, list_T *lis)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
858 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
859 luaV_List *l = (luaV_List *) lua_newuserdata(L, sizeof(luaV_List));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
860 *l = lis;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
861 lis->lv_refcount++; // reference in Lua
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
862 luaV_setudata(L, lis); // cache[lis] = udata
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
863 luaV_getfield(L, LUAVIM_LIST);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
864 lua_setmetatable(L, -2);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
865 return l;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
866 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
867
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
868 luaV_pushtype(list_T, list, luaV_List)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
869 luaV_type_tostring(list, LUAVIM_LIST)
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
870
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
871 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
872 luaV_list_len(lua_State *L)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
873 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
874 list_T *l = luaV_unbox(L, luaV_List, 1);
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
875 lua_pushinteger(L, (int) list_len(l));
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
876 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
877 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
878
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
879 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
880 luaV_list_iter(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
881 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
882 listitem_T *li = (listitem_T *) lua_touserdata(L, lua_upvalueindex(2));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
883 if (li == NULL) return 0;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
884 luaV_pushtypval(L, &li->li_tv);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
885 lua_pushlightuserdata(L, (void *) li->li_next);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
886 lua_replace(L, lua_upvalueindex(2));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
887 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
888 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
889
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
890 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
891 luaV_list_call(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
892 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
893 list_T *l = luaV_unbox(L, luaV_List, 1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
894 lua_pushvalue(L, lua_upvalueindex(1)); // pass cache table along
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
895 lua_pushlightuserdata(L, (void *) l->lv_first);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
896 lua_pushcclosure(L, luaV_list_iter, 2);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
897 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
898 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
899
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
900 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
901 luaV_list_index(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
902 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
903 list_T *l = luaV_unbox(L, luaV_List, 1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
904 if (lua_isnumber(L, 2)) // list item?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
905 {
21030
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
906 long n = (long) luaL_checkinteger(L, 2);
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
907 listitem_T *li;
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
908
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
909 // Lua array index starts with 1 while Vim uses 0, subtract 1 to
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
910 // normalize.
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
911 n -= 1;
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
912 li = list_find(l, n);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
913 if (li == NULL)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
914 lua_pushnil(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
915 else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
916 luaV_pushtypval(L, &li->li_tv);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
917 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
918 else if (lua_isstring(L, 2)) // method?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
919 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
920 const char *s = lua_tostring(L, 2);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
921 if (strncmp(s, "add", 3) == 0
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
922 || strncmp(s, "insert", 6) == 0)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
923 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
924 lua_getmetatable(L, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
925 lua_getfield(L, -1, s);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
926 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
927 else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
928 lua_pushnil(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
929 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
930 else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
931 lua_pushnil(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
932 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
933 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
934
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
935 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
936 luaV_list_newindex(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
937 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
938 list_T *l = luaV_unbox(L, luaV_List, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
939 long n = (long) luaL_checkinteger(L, 2);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
940 listitem_T *li;
21030
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
941
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
942 // Lua array index starts with 1 while Vim uses 0, subtract 1 to normalize.
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
943 n -= 1;
08e284594211 patch 8.2.1066: Lua arrays are zero based
Bram Moolenaar <Bram@vim.org>
parents: 21012
diff changeset
944
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
945 if (l->lv_lock)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
946 luaL_error(L, "list is locked");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
947 li = list_find(l, n);
21060
89aba7895bb2 patch 8.2.1081: Lua: cannot use table.insert() and table.remove()
Bram Moolenaar <Bram@vim.org>
parents: 21030
diff changeset
948 if (li == NULL)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
949 {
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
950 if (!lua_isnil(L, 3))
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
951 {
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
952 typval_T v;
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
953 luaV_checktypval(L, 3, &v, "inserting list item");
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
954 if (list_insert_tv(l, &v, li) == FAIL)
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
955 luaL_error(L, "failed to add item to list");
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
956 clear_tv(&v);
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
957 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
958 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
959 else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
960 {
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
961 if (lua_isnil(L, 3)) // remove?
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
962 {
21060
89aba7895bb2 patch 8.2.1081: Lua: cannot use table.insert() and table.remove()
Bram Moolenaar <Bram@vim.org>
parents: 21030
diff changeset
963 vimlist_remove(l, li, li);
89aba7895bb2 patch 8.2.1081: Lua: cannot use table.insert() and table.remove()
Bram Moolenaar <Bram@vim.org>
parents: 21030
diff changeset
964 listitem_free(l, li);
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
965 }
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
966 else
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
967 {
21060
89aba7895bb2 patch 8.2.1081: Lua: cannot use table.insert() and table.remove()
Bram Moolenaar <Bram@vim.org>
parents: 21030
diff changeset
968 typval_T v;
89aba7895bb2 patch 8.2.1081: Lua: cannot use table.insert() and table.remove()
Bram Moolenaar <Bram@vim.org>
parents: 21030
diff changeset
969 luaV_checktypval(L, 3, &v, "setting list item");
89aba7895bb2 patch 8.2.1081: Lua: cannot use table.insert() and table.remove()
Bram Moolenaar <Bram@vim.org>
parents: 21030
diff changeset
970 clear_tv(&li->li_tv);
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
971 li->li_tv = v;
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
972 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
973 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
974 return 0;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
975 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
976
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
977 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
978 luaV_list_add(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
979 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
980 luaV_List *lis = luaV_checkudata(L, 1, LUAVIM_LIST);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
981 list_T *l = (list_T *) luaV_checkcache(L, (void *) *lis);
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
982 typval_T v;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
983 if (l->lv_lock)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
984 luaL_error(L, "list is locked");
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
985 lua_settop(L, 2);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
986 luaV_checktypval(L, 2, &v, "adding list item");
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
987 if (list_append_tv(l, &v) == FAIL)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
988 luaL_error(L, "failed to add item to list");
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
989 clear_tv(&v);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
990 lua_settop(L, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
991 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
992 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
993
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
994 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
995 luaV_list_insert(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
996 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
997 luaV_List *lis = luaV_checkudata(L, 1, LUAVIM_LIST);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
998 list_T *l = (list_T *) luaV_checkcache(L, (void *) *lis);
6625
199ce895e162 updated for version 7.4.638
Bram Moolenaar <bram@vim.org>
parents: 6590
diff changeset
999 long pos = (long) luaL_optinteger(L, 3, 0);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1000 listitem_T *li = NULL;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1001 typval_T v;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1002 if (l->lv_lock)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1003 luaL_error(L, "list is locked");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1004 if (pos < l->lv_len)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1005 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1006 li = list_find(l, pos);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1007 if (li == NULL)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1008 luaL_error(L, "invalid position");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1009 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1010 lua_settop(L, 2);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1011 luaV_checktypval(L, 2, &v, "inserting list item");
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
1012 if (list_insert_tv(l, &v, li) == FAIL)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1013 luaL_error(L, "failed to add item to list");
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
1014 clear_tv(&v);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1015 lua_settop(L, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1016 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1017 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1018
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1019 static const luaL_Reg luaV_List_mt[] = {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1020 {"__tostring", luaV_list_tostring},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1021 {"__len", luaV_list_len},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1022 {"__call", luaV_list_call},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1023 {"__index", luaV_list_index},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1024 {"__newindex", luaV_list_newindex},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1025 {"add", luaV_list_add},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1026 {"insert", luaV_list_insert},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1027 {NULL, NULL}
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1028 };
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1029
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1030
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1031 // ======= Dict type =======
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1032
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1033 static luaV_Dict *
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1034 luaV_newdict(lua_State *L, dict_T *dic)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1035 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1036 luaV_Dict *d = (luaV_Dict *) lua_newuserdata(L, sizeof(luaV_Dict));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1037 *d = dic;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1038 dic->dv_refcount++; // reference in Lua
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1039 luaV_setudata(L, dic); // cache[dic] = udata
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1040 luaV_getfield(L, LUAVIM_DICT);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1041 lua_setmetatable(L, -2);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1042 return d;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1043 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1044
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1045 luaV_pushtype(dict_T, dict, luaV_Dict)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1046 luaV_type_tostring(dict, LUAVIM_DICT)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1047
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1048 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1049 luaV_dict_len(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1050 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1051 dict_T *d = luaV_unbox(L, luaV_Dict, 1);
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1052 lua_pushinteger(L, (int) dict_len(d));
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1053 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1054 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1055
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1056 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1057 luaV_dict_iter(lua_State *L UNUSED)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1058 {
4135
688da4d486a0 updated for version 7.3.820
Bram Moolenaar <bram@vim.org>
parents: 3865
diff changeset
1059 #ifdef FEAT_EVAL
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1060 hashitem_T *hi = (hashitem_T *) lua_touserdata(L, lua_upvalueindex(2));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1061 int n = lua_tointeger(L, lua_upvalueindex(3));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1062 dictitem_T *di;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1063 if (n <= 0) return 0;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1064 while (HASHITEM_EMPTY(hi)) hi++;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1065 di = dict_lookup(hi);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1066 lua_pushstring(L, (char *) hi->hi_key);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1067 luaV_pushtypval(L, &di->di_tv);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1068 lua_pushlightuserdata(L, (void *) (hi + 1));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1069 lua_replace(L, lua_upvalueindex(2));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1070 lua_pushinteger(L, n - 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1071 lua_replace(L, lua_upvalueindex(3));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1072 return 2;
4135
688da4d486a0 updated for version 7.3.820
Bram Moolenaar <bram@vim.org>
parents: 3865
diff changeset
1073 #else
688da4d486a0 updated for version 7.3.820
Bram Moolenaar <bram@vim.org>
parents: 3865
diff changeset
1074 return 0;
688da4d486a0 updated for version 7.3.820
Bram Moolenaar <bram@vim.org>
parents: 3865
diff changeset
1075 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1076 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1077
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1078 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1079 luaV_dict_call(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1080 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1081 dict_T *d = luaV_unbox(L, luaV_Dict, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1082 hashtab_T *ht = &d->dv_hashtab;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1083 lua_pushvalue(L, lua_upvalueindex(1)); // pass cache table along
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1084 lua_pushlightuserdata(L, (void *) ht->ht_array);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1085 lua_pushinteger(L, ht->ht_used); // # remaining items
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1086 lua_pushcclosure(L, luaV_dict_iter, 3);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1087 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1088 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1089
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1090 static int
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1091 luaV_dict_index(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1092 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1093 dict_T *d = luaV_unbox(L, luaV_Dict, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1094 char_u *key = (char_u *) luaL_checkstring(L, 2);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1095 dictitem_T *di = dict_find(d, key, -1);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1096
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1097 if (di == NULL)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1098 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1099 lua_pushnil(L);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1100 return 1;
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1101 }
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1102
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1103 luaV_pushtypval(L, &di->di_tv);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1104 if (di->di_tv.v_type == VAR_FUNC) // funcref?
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1105 {
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1106 luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, -1);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1107 f->self = d; // keep "self" reference
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1108 d->dv_refcount++;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1109 }
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1110
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1111 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1112 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1113
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1114 static int
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1115 luaV_dict_newindex(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1116 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1117 dict_T *d = luaV_unbox(L, luaV_Dict, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1118 char_u *key = (char_u *) luaL_checkstring(L, 2);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1119 dictitem_T *di;
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1120 typval_T tv;
16009
3b524e8110ab patch 8.1.1010: Lua interface leaks memory
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
1121
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1122 if (d->dv_lock)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1123 luaL_error(L, "dict is locked");
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1124 if (key == NULL)
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1125 return 0;
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1126 if (*key == NUL)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1127 luaL_error(L, "empty key");
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1128 if (!lua_isnil(L, 3)) // read value?
14335
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
1129 {
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1130 luaV_checktypval(L, 3, &tv, "setting dict item");
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1131 if (d->dv_scope == VAR_DEF_SCOPE && tv.v_type == VAR_FUNC)
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1132 {
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1133 clear_tv(&tv);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1134 luaL_error(L, "cannot assign funcref to builtin scope");
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1135 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1136 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1137 di = dict_find(d, key, -1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1138 if (di == NULL) // non-existing key?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1139 {
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1140 if (lua_isnil(L, 3))
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1141 return 0;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1142 di = dictitem_alloc(key);
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1143 if (di == NULL)
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1144 {
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1145 clear_tv(&tv);
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1146 return 0;
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1147 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1148 if (dict_add(d, di) == FAIL)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1149 {
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1150 vim_free(di);
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1151 clear_tv(&tv);
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1152 return 0;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1153 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1154 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1155 else
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1156 clear_tv(&di->di_tv);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1157 if (lua_isnil(L, 3)) // remove?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1158 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1159 hashitem_T *hi = hash_find(&d->dv_hashtab, di->di_key);
31231
684e6dfa2fba patch 9.0.0949: crash when unletting a variable while listing variables
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
1160 hash_remove(&d->dv_hashtab, hi, "Lua new index");
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1161 dictitem_free(di);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1162 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1163 else
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1164 di->di_tv = tv;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1165 return 0;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1166 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1167
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1168 static const luaL_Reg luaV_Dict_mt[] = {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1169 {"__tostring", luaV_dict_tostring},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1170 {"__len", luaV_dict_len},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1171 {"__call", luaV_dict_call},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1172 {"__index", luaV_dict_index},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1173 {"__newindex", luaV_dict_newindex},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1174 {NULL, NULL}
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1175 };
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1176
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1177
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1178 // ======= Blob type =======
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1179
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1180 static luaV_Blob *
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1181 luaV_newblob(lua_State *L, blob_T *blo)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1182 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1183 luaV_Blob *b = (luaV_Blob *) lua_newuserdata(L, sizeof(luaV_Blob));
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1184 *b = blo;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1185 blo->bv_refcount++; // reference in Lua
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1186 luaV_setudata(L, blo); // cache[blo] = udata
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1187 luaV_getfield(L, LUAVIM_BLOB);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1188 lua_setmetatable(L, -2);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1189 return b;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1190 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1191
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1192 luaV_pushtype(blob_T, blob, luaV_Blob)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1193 luaV_type_tostring(blob, LUAVIM_BLOB)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1194
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1195 static int
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1196 luaV_blob_gc(lua_State *L)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1197 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1198 blob_T *b = luaV_unbox(L, luaV_Blob, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1199 blob_unref(b);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1200 return 0;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1201 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1202
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1203 static int
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1204 luaV_blob_len(lua_State *L)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1205 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1206 blob_T *b = luaV_unbox(L, luaV_Blob, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1207 lua_pushinteger(L, (int) blob_len(b));
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1208 return 1;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1209 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1210
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1211 static int
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1212 luaV_blob_index(lua_State *L)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1213 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1214 blob_T *b = luaV_unbox(L, luaV_Blob, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1215 if (lua_isnumber(L, 2))
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1216 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1217 int idx = luaL_checkinteger(L, 2);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1218 if (idx < blob_len(b))
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1219 lua_pushnumber(L, (lua_Number) blob_get(b, idx));
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1220 else
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1221 lua_pushnil(L);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1222 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1223 else if (lua_isstring(L, 2))
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1224 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1225 const char *s = lua_tostring(L, 2);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1226 if (strncmp(s, "add", 3) == 0)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1227 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1228 lua_getmetatable(L, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1229 lua_getfield(L, -1, s);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1230 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1231 else
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1232 lua_pushnil(L);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1233 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1234 else
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1235 lua_pushnil(L);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1236 return 1;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1237 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1238
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1239 static int
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1240 luaV_blob_newindex(lua_State *L)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1241 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1242 blob_T *b = luaV_unbox(L, luaV_Blob, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1243 if (b->bv_lock)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1244 luaL_error(L, "blob is locked");
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1245
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1246 if (!lua_isnumber(L, 2))
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1247 return 0;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1248
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1249 long len = blob_len(b);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1250 int idx = luaL_checkinteger(L, 2);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1251 int val = luaL_checkinteger(L, 3);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1252 if (idx < len || (idx == len && ga_grow(&b->bv_ga, 1) == OK))
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1253 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1254 blob_set(b, idx, (char_u) val);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1255 if (idx == len)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1256 ++b->bv_ga.ga_len;
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1257 }
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1258 else
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1259 luaL_error(L, "index out of range");
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1260
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1261 return 0;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1262 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1263
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1264 static int
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1265 luaV_blob_add(lua_State *L)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1266 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1267 luaV_Blob *blo = luaV_checkudata(L, 1, LUAVIM_BLOB);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1268 blob_T *b = (blob_T *) luaV_checkcache(L, (void *) *blo);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1269 if (b->bv_lock)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1270 luaL_error(L, "blob is locked");
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1271 lua_settop(L, 2);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1272 if (!lua_isstring(L, 2))
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1273 luaL_error(L, "string expected, got %s", luaL_typename(L, 2));
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1274 else
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1275 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1276 size_t i, l = 0;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1277 const char *s = lua_tolstring(L, 2, &l);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1278
19372
967149bbd8d3 patch 8.2.0244: compiler warning in Lua interface
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1279 if (ga_grow(&b->bv_ga, (int)l) == OK)
16099
643fe07aa0e2 patch 8.1.1054: not checking return value of ga_grow()
Bram Moolenaar <Bram@vim.org>
parents: 16076
diff changeset
1280 for (i = 0; i < l; ++i)
643fe07aa0e2 patch 8.1.1054: not checking return value of ga_grow()
Bram Moolenaar <Bram@vim.org>
parents: 16076
diff changeset
1281 ga_append(&b->bv_ga, s[i]);
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1282 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1283 lua_settop(L, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1284 return 1;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1285 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1286
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1287 static const luaL_Reg luaV_Blob_mt[] = {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1288 {"__tostring", luaV_blob_tostring},
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1289 {"__gc", luaV_blob_gc},
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1290 {"__len", luaV_blob_len},
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1291 {"__index", luaV_blob_index},
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1292 {"__newindex", luaV_blob_newindex},
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1293 {"add", luaV_blob_add},
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1294 {NULL, NULL}
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1295 };
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1296
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
1297
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1298 // ======= Funcref type =======
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1299
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1300 static luaV_Funcref *
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1301 luaV_newfuncref(lua_State *L, char_u *name)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1302 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1303 luaV_Funcref *f = (luaV_Funcref *)lua_newuserdata(L, sizeof(luaV_Funcref));
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1304
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1305 if (name != NULL)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1306 {
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1307 func_ref(name);
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1308 f->name = vim_strsave(name);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1309 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1310 f->self = NULL;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1311 luaV_getfield(L, LUAVIM_FUNCREF);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1312 lua_setmetatable(L, -2);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1313 return f;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1314 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1315
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1316 static luaV_Funcref *
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1317 luaV_pushfuncref(lua_State *L, char_u *name)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1318 {
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1319 return luaV_newfuncref(L, name);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1320 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1321
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1322
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1323 luaV_type_tostring(funcref, LUAVIM_FUNCREF)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1324
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1325 static int
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1326 luaV_funcref_gc(lua_State *L)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1327 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1328 luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, 1);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1329
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1330 func_unref(f->name);
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1331 vim_free(f->name);
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1332 // NOTE: Don't call "dict_unref(f->self)", because the dict of "f->self"
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1333 // will be (or has been already) freed by Vim's garbage collection.
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1334 return 0;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1335 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1336
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1337 // equivalent to string(funcref)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1338 static int
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1339 luaV_funcref_len(lua_State *L)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1340 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1341 luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, 1);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1342
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1343 lua_pushstring(L, (const char *) f->name);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1344 return 1;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1345 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1346
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1347 static int
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1348 luaV_funcref_call(lua_State *L)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1349 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1350 luaV_Funcref *f = (luaV_Funcref *) lua_touserdata(L, 1);
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1351 int i, n = lua_gettop(L) - 1; // #args
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1352 int status = FAIL;
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1353 typval_T args;
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1354 typval_T rettv;
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1355
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1356 args.v_type = VAR_LIST;
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1357 args.vval.v_list = list_alloc();
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1358 rettv.v_type = VAR_UNKNOWN; // as in clear_tv
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1359 if (args.vval.v_list != NULL)
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1360 {
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1361 typval_T v;
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1362
14335
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
1363 for (i = 0; i < n; i++)
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
1364 {
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1365 luaV_checktypval(L, i + 2, &v, "calling funcref");
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1366 list_append_tv(args.vval.v_list, &v);
16009
3b524e8110ab patch 8.1.1010: Lua interface leaks memory
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
1367 clear_tv(&v);
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1368 }
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1369 status = func_call(f->name, &args, NULL, f->self, &rettv);
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1370 if (status == OK)
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1371 luaV_pushtypval(L, &rettv);
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1372 clear_tv(&args);
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
1373 clear_tv(&rettv);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1374 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1375 if (status != OK)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1376 luaL_error(L, "cannot call funcref");
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1377 return 1;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1378 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1379
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1380 static const luaL_Reg luaV_Funcref_mt[] = {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1381 {"__tostring", luaV_funcref_tostring},
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1382 {"__gc", luaV_funcref_gc},
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1383 {"__len", luaV_funcref_len},
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1384 {"__call", luaV_funcref_call},
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1385 {NULL, NULL}
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1386 };
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1387
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1388
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1389 // ======= Buffer type =======
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1390
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1391 luaV_newtype(buf_T, buffer, luaV_Buffer, LUAVIM_BUFFER)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1392 luaV_pushtype(buf_T, buffer, luaV_Buffer)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1393 luaV_type_tostring(buffer, LUAVIM_BUFFER)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1394
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1395 static int
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1396 luaV_buffer_len(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1397 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1398 buf_T *b = (buf_T *) luaV_checkvalid(L, luaV_Buffer, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1399 lua_pushinteger(L, b->b_ml.ml_line_count);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1400 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1401 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1402
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1403 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1404 luaV_buffer_call(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1405 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1406 buf_T *b = (buf_T *) luaV_checkvalid(L, luaV_Buffer, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1407 lua_settop(L, 1);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1408 set_curbuf(b, DOBUF_SPLIT);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1409 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1410 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1411
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1412 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1413 luaV_buffer_index(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1414 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1415 buf_T *b = (buf_T *) luaV_checkvalid(L, luaV_Buffer, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1416 linenr_T n = (linenr_T) lua_tointeger(L, 2);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1417 if (n > 0 && n <= b->b_ml.ml_line_count)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1418 luaV_pushline(L, b, n);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1419 else if (lua_isstring(L, 2))
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1420 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1421 const char *s = lua_tostring(L, 2);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1422 if (strncmp(s, "name", 4) == 0)
14296
396b71b242b2 patch 8.1.0164: luaeval('vim.buffer().name') returns an error
Christian Brabandt <cb@256bit.org>
parents: 14235
diff changeset
1423 lua_pushstring(L, (b->b_sfname == NULL)
396b71b242b2 patch 8.1.0164: luaeval('vim.buffer().name') returns an error
Christian Brabandt <cb@256bit.org>
parents: 14235
diff changeset
1424 ? "" : (char *) b->b_sfname);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1425 else if (strncmp(s, "fname", 5) == 0)
14296
396b71b242b2 patch 8.1.0164: luaeval('vim.buffer().name') returns an error
Christian Brabandt <cb@256bit.org>
parents: 14235
diff changeset
1426 lua_pushstring(L, (b->b_ffname == NULL)
396b71b242b2 patch 8.1.0164: luaeval('vim.buffer().name') returns an error
Christian Brabandt <cb@256bit.org>
parents: 14235
diff changeset
1427 ? "" : (char *) b->b_ffname);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1428 else if (strncmp(s, "number", 6) == 0)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1429 lua_pushinteger(L, b->b_fnum);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1430 // methods
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1431 else if (strncmp(s, "insert", 6) == 0
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1432 || strncmp(s, "next", 4) == 0
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1433 || strncmp(s, "previous", 8) == 0
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1434 || strncmp(s, "isvalid", 7) == 0)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1435 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1436 lua_getmetatable(L, 1);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1437 lua_getfield(L, -1, s);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1438 }
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1439 else
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1440 lua_pushnil(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1441 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1442 else
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1443 lua_pushnil(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1444 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1445 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1446
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1447 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1448 luaV_buffer_newindex(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1449 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1450 buf_T *b = (buf_T *) luaV_checkvalid(L, luaV_Buffer, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1451 linenr_T n = (linenr_T) luaL_checkinteger(L, 2);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1452 #ifdef HAVE_SANDBOX
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1453 luaV_checksandbox(L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1454 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1455 if (n < 1 || n > b->b_ml.ml_line_count)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1456 luaL_error(L, "invalid line number");
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1457 if (lua_isnil(L, 3)) // delete line
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1458 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1459 buf_T *buf = curbuf;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1460 curbuf = b;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1461 if (u_savedel(n, 1L) == FAIL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1462 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1463 curbuf = buf;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1464 luaL_error(L, "cannot save undo information");
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1465 }
20599
d571231175b4 patch 8.2.0853: ml_delete() often called with FALSE argument
Bram Moolenaar <Bram@vim.org>
parents: 20456
diff changeset
1466 else if (ml_delete(n) == FAIL)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1467 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1468 curbuf = buf;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1469 luaL_error(L, "cannot delete line");
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1470 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1471 else
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1472 {
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1473 deleted_lines_mark(n, 1L);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1474 if (b == curwin->w_buffer) // fix cursor in current window?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1475 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1476 if (curwin->w_cursor.lnum >= n)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1477 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1478 if (curwin->w_cursor.lnum > n)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1479 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1480 curwin->w_cursor.lnum -= 1;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1481 check_cursor_col();
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1482 }
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1483 else
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
1484 check_cursor();
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1485 changed_cline_bef_curs();
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1486 }
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1487 invalidate_botline();
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1488 }
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1489 }
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1490 curbuf = buf;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1491 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1492 else if (lua_isstring(L, 3)) // update line
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1493 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1494 buf_T *buf = curbuf;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1495 curbuf = b;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1496 if (u_savesub(n) == FAIL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1497 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1498 curbuf = buf;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1499 luaL_error(L, "cannot save undo information");
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1500 }
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1501 else if (ml_replace(n, luaV_toline(L, 3), TRUE) == FAIL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1502 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1503 curbuf = buf;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1504 luaL_error(L, "cannot replace line");
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1505 }
29660
e134ff00be57 patch 9.0.0170: various minor code formatting issues
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
1506 else
e134ff00be57 patch 9.0.0170: various minor code formatting issues
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
1507 changed_bytes(n, 0);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1508 curbuf = buf;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1509 if (b == curwin->w_buffer)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1510 check_cursor_col();
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1511 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1512 else
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1513 luaL_error(L, "wrong argument to change line");
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1514 return 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1515 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1516
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1517 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1518 luaV_buffer_insert(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1519 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1520 luaV_Buffer *lb = luaV_checkudata(L, 1, LUAVIM_BUFFER);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1521 buf_T *b = (buf_T *) luaV_checkcache(L, (void *) *lb);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1522 linenr_T last = b->b_ml.ml_line_count;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1523 linenr_T n = (linenr_T) luaL_optinteger(L, 3, last);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1524 buf_T *buf;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1525 luaL_checktype(L, 2, LUA_TSTRING);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1526 #ifdef HAVE_SANDBOX
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1527 luaV_checksandbox(L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1528 #endif
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1529 // fix insertion line
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1530 if (n < 0) n = 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1531 if (n > last) n = last;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1532 // insert
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1533 buf = curbuf;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1534 curbuf = b;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1535 if (u_save(n, n + 1) == FAIL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1536 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1537 curbuf = buf;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1538 luaL_error(L, "cannot save undo information");
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1539 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1540 else if (ml_append(n, luaV_toline(L, 2), 0, FALSE) == FAIL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1541 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1542 curbuf = buf;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1543 luaL_error(L, "cannot insert line");
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1544 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1545 else
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1546 appended_lines_mark(n, 1L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1547 curbuf = buf;
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
1548 update_screen(UPD_VALID);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1549 return 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1550 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1551
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1552 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1553 luaV_buffer_next(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1554 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1555 luaV_Buffer *b = luaV_checkudata(L, 1, LUAVIM_BUFFER);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1556 buf_T *buf = (buf_T *) luaV_checkcache(L, (void *) *b);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1557 luaV_pushbuffer(L, buf->b_next);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1558 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1559 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1560
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1561 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1562 luaV_buffer_previous(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1563 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1564 luaV_Buffer *b = luaV_checkudata(L, 1, LUAVIM_BUFFER);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1565 buf_T *buf = (buf_T *) luaV_checkcache(L, (void *) *b);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1566 luaV_pushbuffer(L, buf->b_prev);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1567 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1568 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1569
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1570 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1571 luaV_buffer_isvalid(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1572 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1573 luaV_Buffer *b = luaV_checkudata(L, 1, LUAVIM_BUFFER);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1574 luaV_getudata(L, *b);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1575 lua_pushboolean(L, !lua_isnil(L, -1));
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1576 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1577 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1578
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1579 static const luaL_Reg luaV_Buffer_mt[] = {
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1580 {"__tostring", luaV_buffer_tostring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1581 {"__len", luaV_buffer_len},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1582 {"__call", luaV_buffer_call},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1583 {"__index", luaV_buffer_index},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1584 {"__newindex", luaV_buffer_newindex},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1585 {"insert", luaV_buffer_insert},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1586 {"next", luaV_buffer_next},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1587 {"previous", luaV_buffer_previous},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1588 {"isvalid", luaV_buffer_isvalid},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1589 {NULL, NULL}
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1590 };
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1591
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1592
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1593 // ======= Window type =======
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1594
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1595 luaV_newtype(win_T, window, luaV_Window, LUAVIM_WINDOW)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1596 luaV_pushtype(win_T, window, luaV_Window)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1597 luaV_type_tostring(window, LUAVIM_WINDOW)
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1598
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1599 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1600 luaV_window_call(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1601 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1602 win_T *w = (win_T *) luaV_checkvalid(L, luaV_Window, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1603 lua_settop(L, 1);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1604 win_goto(w);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1605 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1606 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1607
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1608 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1609 luaV_window_index(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1610 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1611 win_T *w = (win_T *) luaV_checkvalid(L, luaV_Window, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1612 const char *s = luaL_checkstring(L, 2);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1613 if (strncmp(s, "buffer", 6) == 0)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1614 luaV_pushbuffer(L, w->w_buffer);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1615 else if (strncmp(s, "line", 4) == 0)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1616 lua_pushinteger(L, w->w_cursor.lnum);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1617 else if (strncmp(s, "col", 3) == 0)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1618 lua_pushinteger(L, w->w_cursor.col + 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1619 else if (strncmp(s, "width", 5) == 0)
12515
972ea22c946f patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents: 12477
diff changeset
1620 lua_pushinteger(L, w->w_width);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1621 else if (strncmp(s, "height", 6) == 0)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1622 lua_pushinteger(L, w->w_height);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1623 // methods
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1624 else if (strncmp(s, "next", 4) == 0
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1625 || strncmp(s, "previous", 8) == 0
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1626 || strncmp(s, "isvalid", 7) == 0)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1627 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1628 lua_getmetatable(L, 1);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1629 lua_getfield(L, -1, s);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1630 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1631 else
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1632 lua_pushnil(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1633 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1634 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1635
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1636 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
1637 luaV_window_newindex(lua_State *L)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1638 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1639 win_T *w = (win_T *) luaV_checkvalid(L, luaV_Window, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1640 const char *s = luaL_checkstring(L, 2);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1641 int v = luaL_checkinteger(L, 3);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1642 if (strncmp(s, "line", 4) == 0)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1643 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1644 #ifdef HAVE_SANDBOX
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1645 luaV_checksandbox(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1646 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1647 if (v < 1 || v > w->w_buffer->b_ml.ml_line_count)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1648 luaL_error(L, "line out of range");
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1649 w->w_cursor.lnum = v;
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
1650 update_screen(UPD_VALID);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1651 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1652 else if (strncmp(s, "col", 3) == 0)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1653 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1654 #ifdef HAVE_SANDBOX
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1655 luaV_checksandbox(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1656 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1657 w->w_cursor.col = v - 1;
14395
c15bef307de6 patch 8.1.0212: preferred cursor column not set in interfaces
Christian Brabandt <cb@256bit.org>
parents: 14335
diff changeset
1658 w->w_set_curswant = TRUE;
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
1659 update_screen(UPD_VALID);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1660 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1661 else if (strncmp(s, "width", 5) == 0)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1662 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1663 win_T *win = curwin;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1664 #ifdef FEAT_GUI
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1665 need_mouse_correct = TRUE;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1666 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1667 curwin = w;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1668 win_setwidth(v);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1669 curwin = win;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1670 }
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1671 else if (strncmp(s, "height", 6) == 0)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1672 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1673 win_T *win = curwin;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1674 #ifdef FEAT_GUI
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1675 need_mouse_correct = TRUE;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1676 #endif
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1677 curwin = w;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1678 win_setheight(v);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1679 curwin = win;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1680 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1681 else
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1682 luaL_error(L, "invalid window property: `%s'", s);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1683 return 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1684 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1685
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1686 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1687 luaV_window_next(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1688 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1689 luaV_Window *w = luaV_checkudata(L, 1, LUAVIM_WINDOW);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1690 win_T *win = (win_T *) luaV_checkcache(L, (void *) *w);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1691 luaV_pushwindow(L, win->w_next);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1692 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1693 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1694
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1695 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1696 luaV_window_previous(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1697 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1698 luaV_Window *w = luaV_checkudata(L, 1, LUAVIM_WINDOW);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1699 win_T *win = (win_T *) luaV_checkcache(L, (void *) *w);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1700 luaV_pushwindow(L, win->w_prev);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1701 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1702 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1703
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1704 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1705 luaV_window_isvalid(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1706 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1707 luaV_Window *w = luaV_checkudata(L, 1, LUAVIM_WINDOW);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1708 luaV_getudata(L, *w);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1709 lua_pushboolean(L, !lua_isnil(L, -1));
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1710 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1711 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1712
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1713 static const luaL_Reg luaV_Window_mt[] = {
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1714 {"__tostring", luaV_window_tostring},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1715 {"__call", luaV_window_call},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1716 {"__index", luaV_window_index},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1717 {"__newindex", luaV_window_newindex},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1718 {"next", luaV_window_next},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1719 {"previous", luaV_window_previous},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1720 {"isvalid", luaV_window_isvalid},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1721 {NULL, NULL}
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1722 };
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1723
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1724
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1725 // ======= Vim module =======
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1726
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1727 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1728 luaV_print(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1729 {
25415
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1730 int i, n = lua_gettop(L); // nargs
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1731 const char *s;
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1732 size_t l;
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1733 garray_T msg_ga;
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1734
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1735 ga_init2(&msg_ga, 1, 128);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1736 lua_getglobal(L, "tostring");
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1737 for (i = 1; i <= n; i++)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1738 {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1739 lua_pushvalue(L, -1); // tostring
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1740 lua_pushvalue(L, i); // arg
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1741 lua_call(L, 1, 1);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1742 s = lua_tolstring(L, -1, &l);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1743 if (s == NULL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1744 return luaL_error(L, "cannot convert to string");
25394
3a8b61b31724 patch 8.2.3234: crash when printing long string with Lua
Bram Moolenaar <Bram@vim.org>
parents: 25342
diff changeset
1745 if (i > 1)
25415
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1746 ga_append(&msg_ga, ' '); // use space instead of tab
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1747 ga_concat_len(&msg_ga, (char_u *)s, l);
25407
241d26b17192 patch 8.2.3240: Lua print() does not work properly
Bram Moolenaar <Bram@vim.org>
parents: 25394
diff changeset
1748 lua_pop(L, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1749 }
25415
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1750 // Replace any "\n" with "\0"
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1751 for (i = 0; i < msg_ga.ga_len; i++)
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1752 if (((char *)msg_ga.ga_data)[i] == '\n')
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1753 ((char *)msg_ga.ga_data)[i] = '\0';
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1754 lua_pushlstring(L, msg_ga.ga_data, msg_ga.ga_len);
18370
026034963159 patch 8.1.2179: pressing "q" at the more prompt doesn't stop Python output
Bram Moolenaar <Bram@vim.org>
parents: 17168
diff changeset
1755 if (!got_int)
026034963159 patch 8.1.2179: pressing "q" at the more prompt doesn't stop Python output
Bram Moolenaar <Bram@vim.org>
parents: 17168
diff changeset
1756 luaV_msg(L);
25415
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1757
02d1b2817585 patch 8.2.3244: Lua 5.3 print() with a long string crashes
Bram Moolenaar <Bram@vim.org>
parents: 25407
diff changeset
1758 ga_clear(&msg_ga);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1759 return 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1760 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1761
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1762 static int
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1763 luaV_debug(lua_State *L)
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1764 {
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1765 lua_settop(L, 0);
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1766 lua_getglobal(L, "vim");
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1767 lua_getfield(L, -1, "eval");
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1768 lua_remove(L, -2); // vim.eval at position 1
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1769 for (;;)
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1770 {
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1771 const char *input;
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1772 size_t l;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1773 lua_pushvalue(L, 1); // vim.eval
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1774 lua_pushliteral(L, "input('lua_debug> ')");
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1775 lua_call(L, 1, 1); // return string
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1776 input = lua_tolstring(L, -1, &l);
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1777 if (l == 0 || strcmp(input, "cont") == 0)
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1778 return 0;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1779 msg_putchar('\n'); // avoid outputting on input line
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1780 if (luaL_loadbuffer(L, input, l, "=(debug command)")
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1781 || lua_pcall(L, 0, 0, 0))
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1782 luaV_emsg(L);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
1783 lua_settop(L, 1); // remove eventual returns, but keep vim.eval
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1784 }
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1785 }
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1786
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1787 static dict_T *
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1788 luaV_get_var_scope(lua_State *L)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1789 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1790 const char *scope = luaL_checkstring(L, 1);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1791 dict_T *dict = NULL;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1792
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1793 if (STRICMP((char *)scope, "g") == 0)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1794 dict = get_globvar_dict();
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1795 else if (STRICMP((char *)scope, "v") == 0)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1796 dict = get_vimvar_dict();
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1797 else if (STRICMP((char *)scope, "b") == 0)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1798 dict = curbuf->b_vars;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1799 else if (STRICMP((char *)scope, "w") == 0)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1800 dict = curwin->w_vars;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1801 else if (STRICMP((char *)scope, "t") == 0)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1802 dict = curtab->tp_vars;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1803 else
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1804 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1805 luaL_error(L, "invalid scope %s", scope);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1806 return NULL;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1807 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1808
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1809 return dict;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1810 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1811
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1812 static int
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1813 luaV_setvar(lua_State *L)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1814 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1815 dict_T *dict;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1816 dictitem_T *di;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1817 size_t len;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1818 char *name;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1819 int del;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1820 char *error = NULL;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1821
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1822 name = (char *)luaL_checklstring(L, 3, &len);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1823 del = (lua_gettop(L) < 4) || lua_isnil(L, 4);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1824
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1825 dict = luaV_get_var_scope(L);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1826 if (dict == NULL)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1827 return 0;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1828
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
1829 di = dict_find(dict, (char_u *)name, (int)len);
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1830 if (di != NULL)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1831 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1832 if (di->di_flags & DI_FLAGS_RO)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1833 error = "variable is read-only";
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1834 else if (di->di_flags & DI_FLAGS_LOCK)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1835 error = "variable is locked";
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1836 else if (del && di->di_flags & DI_FLAGS_FIX)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1837 error = "variable is fixed";
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1838 if (error != NULL)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1839 return luaL_error(L, error);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1840 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1841 else if (dict->dv_lock)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1842 return luaL_error(L, "Dictionary is locked");
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1843
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1844 if (del)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1845 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1846 // Delete the key
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1847 if (di == NULL)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1848 // Doesn't exist, nothing to do
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1849 return 0;
31231
684e6dfa2fba patch 9.0.0949: crash when unletting a variable while listing variables
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
1850 // Delete the entry
684e6dfa2fba patch 9.0.0949: crash when unletting a variable while listing variables
Bram Moolenaar <Bram@vim.org>
parents: 30310
diff changeset
1851 dictitem_remove(dict, di, "Lua delete variable");
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1852 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1853 else
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1854 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1855 // Update the key
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1856 typval_T tv;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1857
25881
2ee0425960fe patch 8.2.3474: some places use "Vimscript" instead of "Vim script"
Bram Moolenaar <Bram@vim.org>
parents: 25527
diff changeset
1858 // Convert the lua value to a Vim script type in the temporary variable
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1859 lua_pushvalue(L, 4);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1860 if (luaV_totypval(L, -1, &tv) == FAIL)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1861 return luaL_error(L, "Couldn't convert lua value");
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1862
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1863 if (di == NULL)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1864 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1865 // Need to create an entry
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1866 di = dictitem_alloc((char_u *)name);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1867 if (di == NULL)
25515
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1868 {
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1869 clear_tv(&tv);
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1870 return 0;
25515
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1871 }
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1872 // Update the value
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1873 copy_tv(&tv, &di->di_tv);
25509
7ed54019fbb8 patch 8.2.3291: Coverity warns for not checking return value
Bram Moolenaar <Bram@vim.org>
parents: 25503
diff changeset
1874 if (dict_add(dict, di) == FAIL)
25515
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1875 {
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1876 dictitem_free(di);
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1877 clear_tv(&tv);
25509
7ed54019fbb8 patch 8.2.3291: Coverity warns for not checking return value
Bram Moolenaar <Bram@vim.org>
parents: 25503
diff changeset
1878 return luaL_error(L, "Couldn't add to dictionary");
25515
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1879 }
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1880 }
d84f6784c27c patch 8.2.3294: Lua: memory leak when adding dict item fails
Bram Moolenaar <Bram@vim.org>
parents: 25509
diff changeset
1881 else
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1882 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1883 // Clear the old value
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1884 clear_tv(&di->di_tv);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1885 // Update the value
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1886 copy_tv(&tv, &di->di_tv);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1887 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1888
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1889 // Clear the temporary variable
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1890 clear_tv(&tv);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1891 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1892
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1893 return 0;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1894 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1895
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1896 static int
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1897 luaV_getvar(lua_State *L)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1898 {
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1899 dict_T *dict = luaV_get_var_scope(L);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1900 size_t len;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1901 const char *name = luaL_checklstring(L, 3, &len);
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
1902 dictitem_T *di = dict_find(dict, (char_u *)name, (int)len);
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1903
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1904 if (di == NULL)
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1905 return 0; // nil
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1906
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1907 luaV_pushtypval(L, &di->di_tv);
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1908 return 1;
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1909 }
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
1910
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
1911 static int
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1912 luaV_command(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1913 {
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
1914 char_u *s = vim_strsave((char_u *)luaL_checkstring(L, 1));
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
1915
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
1916 execute_cmds_from_string(s);
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
1917 vim_free(s);
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
1918 update_screen(UPD_VALID);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1919 return 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1920 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1921
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1922 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1923 luaV_eval(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1924 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1925 typval_T *tv = eval_expr((char_u *) luaL_checkstring(L, 1), NULL);
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
1926
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1927 if (tv == NULL) luaL_error(L, "invalid expression");
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1928 luaV_pushtypval(L, tv);
4293
af3a3680fc75 updated for version 7.3.896
Bram Moolenaar <bram@vim.org>
parents: 4270
diff changeset
1929 free_tv(tv);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1930 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1931 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1932
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1933 static int
2331
3840b7508835 Make it easier to build with Lua. Remove compiler warnings.
Bram Moolenaar <bram@vim.org>
parents: 2330
diff changeset
1934 luaV_beep(lua_State *L UNUSED)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1935 {
6949
1e621b31948b patch 7.4.793
Bram Moolenaar <bram@vim.org>
parents: 6887
diff changeset
1936 vim_beep(BO_LANG);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1937 return 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1938 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1939
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1940 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1941 luaV_line(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1942 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1943 luaV_pushline(L, curbuf, curwin->w_cursor.lnum);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1944 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1945 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
1946
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
1947 static int
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1948 luaV_list(lua_State *L)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1949 {
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1950 list_T *l;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1951 int initarg = !lua_isnoneornil(L, 1);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1952
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1953 if (initarg && lua_type(L, 1) != LUA_TTABLE)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1954 luaL_error(L, "table expected, got %s", luaL_typename(L, 1));
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1955
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1956 l = list_alloc();
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1957 if (l == NULL)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1958 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1959 lua_pushnil(L);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1960 return 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1961 }
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1962
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1963 luaV_newlist(L, l);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1964 if (!initarg)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1965 return 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1966
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1967 // traverse table to init list
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1968 int notnil, i = 0;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1969 typval_T v;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1970 do
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1971 {
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1972 lua_rawgeti(L, 1, ++i);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1973 notnil = !lua_isnil(L, -1);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1974 if (notnil)
14335
d59bf91128ea patch 8.1.0183: Lua API changed, breaking the build
Christian Brabandt <cb@256bit.org>
parents: 14329
diff changeset
1975 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1976 luaV_checktypval(L, -1, &v, "vim.list");
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1977 list_append_tv(l, &v);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1978 clear_tv(&v);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1979 }
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1980 lua_pop(L, 1); // value
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1981 } while (notnil);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1982
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1983 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1984 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1985
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1986 static int
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1987 luaV_dict(lua_State *L)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1988 {
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1989 dict_T *d;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1990 int initarg = !lua_isnoneornil(L, 1);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1991
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1992 if (initarg && lua_type(L, 1) != LUA_TTABLE)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1993 luaL_error(L, "table expected, got %s", luaL_typename(L, 1));
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1994
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1995 d = dict_alloc();
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
1996 if (d == NULL)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
1997 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1998 lua_pushnil(L);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
1999 return 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2000 }
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2001
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2002 luaV_newdict(L, d);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2003 if (!initarg)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2004 return 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2005
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2006 // traverse table to init dict
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2007 lua_pushnil(L);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2008 while (lua_next(L, 1))
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2009 {
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2010 char_u *key;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2011 dictitem_T *di;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2012 typval_T v;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2013
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2014 lua_pushvalue(L, -2); // dup key in case it's a number
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2015 key = (char_u *) lua_tostring(L, -1);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2016 if (key == NULL)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2017 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2018 lua_pushnil(L);
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2019 return 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2020 }
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2021 if (*key == NUL)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2022 luaL_error(L, "table has empty key");
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2023 luaV_checktypval(L, -2, &v, "vim.dict"); // value
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2024 di = dictitem_alloc(key);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2025 if (di == NULL || dict_add(d, di) == FAIL)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2026 {
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2027 vim_free(di);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2028 lua_pushnil(L);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2029 return 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2030 }
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2031 di->di_tv = v;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2032 lua_pop(L, 2); // key copy and value
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2033 }
14329
fe651f98e173 patch 8.1.0180: static analysis errors in Lua interface
Christian Brabandt <cb@256bit.org>
parents: 14296
diff changeset
2034
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2035 return 1;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2036 }
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2037
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2038 static int
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2039 luaV_blob(lua_State *L)
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2040 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2041 blob_T *b;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2042 int initarg = !lua_isnoneornil(L, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2043
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2044 if (initarg && !lua_isstring(L, 1))
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2045 luaL_error(L, "string expected, got %s", luaL_typename(L, 1));
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2046
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2047 b = blob_alloc();
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2048 if (b == NULL)
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2049 {
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2050 lua_pushnil(L);
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2051 return 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2052 }
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2053
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2054 luaV_newblob(L, b);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2055 if (!initarg)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2056 return 1;
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2057
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2058 // traverse table to init blob
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2059 size_t i, l = 0;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2060 const char *s = lua_tolstring(L, 1, &l);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2061
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2062 if (ga_grow(&b->bv_ga, (int)l) == OK)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2063 for (i = 0; i < l; ++i)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2064 ga_append(&b->bv_ga, s[i]);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2065
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2066 return 1;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2067 }
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2068
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2069 static int
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2070 luaV_funcref(lua_State *L)
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2071 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2072 const char *name = luaL_checkstring(L, 1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2073 // note: not checking if function exists (needs function_exists)
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2074 if (name == NULL || *name == NUL || VIM_ISDIGIT(*name))
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2075 luaL_error(L, "invalid function name: %s", name);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2076 luaV_newfuncref(L, (char_u *) name);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2077 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2078 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2079
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2080 static int
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2081 luaV_buffer(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2082 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2083 buf_T *buf;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2084 if (lua_isstring(L, 1)) // get by number or name?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2085 {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2086 if (lua_isnumber(L, 1)) // by number?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2087 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2088 int n = lua_tointeger(L, 1);
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 8643
diff changeset
2089 FOR_ALL_BUFFERS(buf)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2090 if (buf->b_fnum == n) break;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2091 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2092 else // by name
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2093 {
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2094 size_t l;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2095 const char *s = lua_tolstring(L, 1, &l);
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 8643
diff changeset
2096 FOR_ALL_BUFFERS(buf)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2097 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2098 if (buf->b_ffname == NULL || buf->b_sfname == NULL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2099 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2100 if (l == 0) break;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2101 }
2331
3840b7508835 Make it easier to build with Lua. Remove compiler warnings.
Bram Moolenaar <bram@vim.org>
parents: 2330
diff changeset
2102 else if (strncmp(s, (char *)buf->b_ffname, l) == 0
3840b7508835 Make it easier to build with Lua. Remove compiler warnings.
Bram Moolenaar <bram@vim.org>
parents: 2330
diff changeset
2103 || strncmp(s, (char *)buf->b_sfname, l) == 0)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2104 break;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2105 }
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2106 }
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2107 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2108 else
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2109 buf = (lua_toboolean(L, 1)) ? firstbuf : curbuf; // first buffer?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2110 luaV_pushbuffer(L, buf);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2111 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2112 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2113
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2114 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2115 luaV_window(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2116 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2117 win_T *win;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2118 if (lua_isnumber(L, 1)) // get by number?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2119 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2120 int n = lua_tointeger(L, 1);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2121 for (win = firstwin; win != NULL; win = win->w_next, n--)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2122 if (n == 1) break;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2123 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2124 else
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2125 win = (lua_toboolean(L, 1)) ? firstwin : curwin; // first window?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2126 luaV_pushwindow(L, win);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2127 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2128 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2129
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2130 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2131 luaV_open(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2132 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2133 char_u *s = NULL;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2134 #ifdef HAVE_SANDBOX
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2135 luaV_checksandbox(L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2136 #endif
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2137 if (lua_isstring(L, 1)) s = (char_u *) lua_tostring(L, 1);
3200
3801e4811b0e updated for version 7.3.370
Bram Moolenaar <bram@vim.org>
parents: 3091
diff changeset
2138 luaV_pushbuffer(L, buflist_new(s, NULL, 1L, BLN_LISTED));
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2139 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2140 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2141
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2142 static int
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2143 luaV_type(lua_State *L)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2144 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2145 luaL_checkany(L, 1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2146 if (lua_type(L, 1) == LUA_TUSERDATA) // check vim udata?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2147 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2148 lua_settop(L, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2149 if (lua_getmetatable(L, 1))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2150 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2151 luaV_getfield(L, LUAVIM_LIST);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2152 if (lua_rawequal(L, -1, 2))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2153 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2154 lua_pushstring(L, "list");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2155 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2156 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2157 luaV_getfield(L, LUAVIM_DICT);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2158 if (lua_rawequal(L, -1, 2))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2159 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2160 lua_pushstring(L, "dict");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2161 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2162 }
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2163 luaV_getfield(L, LUAVIM_BLOB);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2164 if (lua_rawequal(L, -1, 2))
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2165 {
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2166 lua_pushstring(L, "blob");
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2167 return 1;
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2168 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2169 luaV_getfield(L, LUAVIM_FUNCREF);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2170 if (lua_rawequal(L, -1, 2))
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2171 {
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2172 lua_pushstring(L, "funcref");
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2173 return 1;
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2174 }
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2175 luaV_getfield(L, LUAVIM_BUFFER);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2176 if (lua_rawequal(L, -1, 2))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2177 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2178 lua_pushstring(L, "buffer");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2179 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2180 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2181 luaV_getfield(L, LUAVIM_WINDOW);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2182 if (lua_rawequal(L, -1, 2))
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2183 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2184 lua_pushstring(L, "window");
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2185 return 1;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2186 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2187 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2188 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2189 lua_pushstring(L, luaL_typename(L, 1)); // fallback
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2190 return 1;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2191 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2192
20441
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2193 static int
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2194 luaV_call(lua_State *L)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2195 {
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2196 int argc = lua_gettop(L) - 1;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2197 size_t funcname_len;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2198 char_u *funcname;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2199 char *error = NULL;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2200 typval_T rettv;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2201 typval_T argv[MAX_FUNC_ARGS + 1];
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2202 int i = 0;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2203
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2204 if (argc > MAX_FUNC_ARGS)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2205 return luaL_error(L, "Function called with too many arguments");
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2206
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2207 funcname = (char_u *)luaL_checklstring(L, 1, &funcname_len);
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2208
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2209 for (; i < argc; i++)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2210 {
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2211 if (luaV_totypval(L, i + 2, &argv[i]) == FAIL)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2212 {
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2213 error = "lua: cannot convert value";
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2214 goto free_vim_args;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2215 }
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2216 }
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2217
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2218 argv[argc].v_type = VAR_UNKNOWN;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2219
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2220 if (call_vim_function(funcname, argc, argv, &rettv) == FAIL)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2221 {
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2222 error = "lua: call_vim_function failed";
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2223 goto free_vim_args;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2224 }
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2225
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2226 luaV_pushtypval(L, &rettv);
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2227 clear_tv(&rettv);
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2228
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2229 free_vim_args:
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2230 while (i > 0)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2231 clear_tv(&argv[--i]);
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2232
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2233 if (error == NULL)
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2234 return 1;
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2235 else
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2236 return luaL_error(L, error);
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2237 }
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2238
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2239 /*
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2240 * Return the Vim version as a Lua table
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2241 */
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2242 static int
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2243 luaV_version(lua_State *L)
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2244 {
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2245 lua_newtable(L);
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2246 lua_pushstring(L, "major");
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2247 lua_pushinteger(L, VIM_VERSION_MAJOR);
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2248 lua_settable(L, -3);
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2249 lua_pushstring(L, "minor");
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2250 lua_pushinteger(L, VIM_VERSION_MINOR);
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2251 lua_settable(L, -3);
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2252 lua_pushstring(L, "patch");
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2253 lua_pushinteger(L, highest_patch());
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2254 lua_settable(L, -3);
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2255 return 1;
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2256 }
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2257
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2258 static const luaL_Reg luaV_module[] = {
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2259 {"command", luaV_command},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2260 {"eval", luaV_eval},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2261 {"beep", luaV_beep},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2262 {"line", luaV_line},
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2263 {"list", luaV_list},
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2264 {"dict", luaV_dict},
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2265 {"blob", luaV_blob},
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2266 {"funcref", luaV_funcref},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2267 {"buffer", luaV_buffer},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2268 {"window", luaV_window},
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2269 {"open", luaV_open},
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2270 {"type", luaV_type},
20441
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2271 {"call", luaV_call},
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2272 {"_getvar", luaV_getvar},
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2273 {"_setvar", luaV_setvar},
25527
d5e9c05b4811 patch 8.2.3300: Lua: can only execute on Vim command at a time
Bram Moolenaar <Bram@vim.org>
parents: 25515
diff changeset
2274 {"version", luaV_version},
24385
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2275 {"lua_version", NULL},
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2276 {NULL, NULL}
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2277 };
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2278
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2279 /*
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2280 * for freeing list, dict, buffer and window objects; lightuserdata as arg
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2281 */
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2282 static int
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2283 luaV_free(lua_State *L)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2284 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2285 lua_pushnil(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2286 luaV_setudata(L, lua_touserdata(L, 1));
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2287 return 0;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2288 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2289
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2290 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2291 luaV_luaeval(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2292 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2293 luaL_Buffer b;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2294 size_t l;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2295 const char *str = lua_tolstring(L, 1, &l);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2296 typval_T *arg = (typval_T *) lua_touserdata(L, 2);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2297 typval_T *rettv = (typval_T *) lua_touserdata(L, 3);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2298 luaL_buffinit(L, &b);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2299 luaL_addlstring(&b, LUAVIM_EVALHEADER, sizeof(LUAVIM_EVALHEADER) - 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2300 luaL_addlstring(&b, str, l);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2301 luaL_pushresult(&b);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2302 str = lua_tolstring(L, -1, &l);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2303 if (luaL_loadbuffer(L, str, l, LUAVIM_EVALNAME)) // compile error?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2304 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2305 luaV_emsg(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2306 return 0;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2307 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2308 luaV_pushtypval(L, arg);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2309 if (lua_pcall(L, 1, 1, 0)) // running error?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2310 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2311 luaV_emsg(L);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2312 return 0;
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2313 }
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2314 if (luaV_totypval(L, -1, rettv) == FAIL)
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 15328
diff changeset
2315 emsg("luaeval: cannot convert value");
6590
f884a1140a0a updated for version 7.4.621
Bram Moolenaar <bram@vim.org>
parents: 6586
diff changeset
2316 return 0;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2317 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2318
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2319 static int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2320 luaV_setref(lua_State *L)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2321 {
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2322 int copyID = lua_tointeger(L, 1);
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2323 int abort = FALSE;
6565
38add5a3d617 updated for version 7.4.609
Bram Moolenaar <bram@vim.org>
parents: 5871
diff changeset
2324
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2325 luaV_getfield(L, LUAVIM_LIST);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2326 luaV_getfield(L, LUAVIM_DICT);
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2327 luaV_getfield(L, LUAVIM_FUNCREF);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2328 lua_pushnil(L);
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2329 // traverse cache table
6586
9ac723b9f54d updated for version 7.4.619
Bram Moolenaar <bram@vim.org>
parents: 6584
diff changeset
2330 while (!abort && lua_next(L, lua_upvalueindex(1)) != 0)
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2331 {
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2332 lua_getmetatable(L, -1);
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2333 if (lua_rawequal(L, -1, 2)) // list?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2334 {
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2335 list_T *l = (list_T *)lua_touserdata(L, 5); // key
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2336
17168
1d30eb64a7a2 patch 8.1.1583: set_ref_in_list() only sets ref in items
Bram Moolenaar <Bram@vim.org>
parents: 16099
diff changeset
2337 abort = set_ref_in_list(l, copyID);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2338 }
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2339 else if (lua_rawequal(L, -1, 3)) // dict?
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2340 {
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2341 dict_T *d = (dict_T *)lua_touserdata(L, 5); // key
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2342
17168
1d30eb64a7a2 patch 8.1.1583: set_ref_in_list() only sets ref in items
Bram Moolenaar <Bram@vim.org>
parents: 16099
diff changeset
2343 abort = set_ref_in_dict(d, copyID);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2344 }
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2345 else if (lua_rawequal(L, -1, 4)) // funcref?
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2346 {
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2347 luaV_Funcref *f = (luaV_Funcref *)lua_touserdata(L, 5); // key
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2348
17168
1d30eb64a7a2 patch 8.1.1583: set_ref_in_list() only sets ref in items
Bram Moolenaar <Bram@vim.org>
parents: 16099
diff changeset
2349 abort = set_ref_in_dict(f->self, copyID);
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2350 }
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2351 lua_pop(L, 2); // metatable and value
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2352 }
6565
38add5a3d617 updated for version 7.4.609
Bram Moolenaar <bram@vim.org>
parents: 5871
diff changeset
2353 lua_pushinteger(L, abort);
6590
f884a1140a0a updated for version 7.4.621
Bram Moolenaar <bram@vim.org>
parents: 6586
diff changeset
2354 return 1;
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2355 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2356
24385
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2357 static int
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2358 luaV_pushversion(lua_State *L)
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2359 {
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2360 int major = 0;
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2361 int minor = 0;
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2362 int patch = 0;
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2363 char s[16];
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2364
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2365 sscanf(LUAVIM_VERSION, "Lua %d.%d.%d", &major, &minor, &patch);
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2366 vim_snprintf(s, sizeof(s), "%d.%d.%d", major, minor, patch);
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2367 lua_pushstring(L, s);
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2368 return 0;
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2369 }
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2370
20441
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2371 #define LUA_VIM_FN_CODE \
20609
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2372 "vim.fn = setmetatable({}, {\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2373 " __index = function (t, key)\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2374 " local function _fn(...)\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2375 " return vim.call(key, ...)\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2376 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2377 " t[key] = _fn\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2378 " return _fn\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2379 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2380 " })"
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2381
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2382 #define LUA_VIM_UPDATE_PACKAGE_PATHS \
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2383 "local last_vim_paths = {}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2384 "vim._update_package_paths = function ()\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2385 " local cur_vim_paths = {}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2386 " local function split(s, delimiter)\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2387 " result = {}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2388 " for match in (s..delimiter):gmatch(\"(.-)\"..delimiter) do\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2389 " table.insert(result, match)\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2390 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2391 " return result\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2392 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2393 " local rtps = split(vim.eval('&runtimepath'), ',')\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2394 " local sep = package.config:sub(1, 1)\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2395 " for _, key in ipairs({'path', 'cpath'}) do\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2396 " local orig_str = package[key] .. ';'\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2397 " local pathtrails_ordered = {}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2398 " -- Note: ignores trailing item without trailing `;`. Not using something\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2399 " -- simpler in order to preserve empty items (stand for default path).\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2400 " local orig = {}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2401 " for s in orig_str:gmatch('[^;]*;') do\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2402 " s = s:sub(1, -2) -- Strip trailing semicolon\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2403 " orig[#orig + 1] = s\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2404 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2405 " if key == 'path' then\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2406 " -- /?.lua and /?/init.lua\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2407 " pathtrails_ordered = {sep .. '?.lua', sep .. '?' .. sep .. 'init.lua'}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2408 " else\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2409 " local pathtrails = {}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2410 " for _, s in ipairs(orig) do\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2411 " -- Find out path patterns. pathtrail should contain something like\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2412 " -- /?.so, \?.dll. This allows not to bother determining what correct\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2413 " -- suffixes are.\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2414 " local pathtrail = s:match('[/\\\\][^/\\\\]*%?.*$')\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2415 " if pathtrail and not pathtrails[pathtrail] then\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2416 " pathtrails[pathtrail] = true\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2417 " pathtrails_ordered[#pathtrails_ordered + 1] = pathtrail\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2418 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2419 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2420 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2421 " local new = {}\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2422 " for _, rtp in ipairs(rtps) do\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2423 " if not rtp:match(';') then\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2424 " for _, pathtrail in pairs(pathtrails_ordered) do\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2425 " local new_path = rtp .. sep .. 'lua' .. pathtrail\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2426 " -- Always keep paths from &runtimepath at the start:\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2427 " -- append them here disregarding orig possibly containing one of them.\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2428 " new[#new + 1] = new_path\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2429 " cur_vim_paths[new_path] = true\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2430 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2431 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2432 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2433 " for _, orig_path in ipairs(orig) do\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2434 " -- Handle removing obsolete paths originating from &runtimepath: such\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2435 " -- paths either belong to cur_nvim_paths and were already added above or\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2436 " -- to last_nvim_paths and should not be added at all if corresponding\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2437 " -- entry was removed from &runtimepath list.\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2438 " if not (cur_vim_paths[orig_path] or last_vim_paths[orig_path]) then\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2439 " new[#new + 1] = orig_path\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2440 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2441 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2442 " package[key] = table.concat(new, ';')\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2443 " end\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2444 " last_vim_paths = cur_vim_paths\n"\
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2445 "end"
20441
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2446
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2447 #define LUA_VIM_SETUP_VARIABLE_DICTS \
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2448 "do\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2449 " local function make_dict_accessor(scope)\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2450 " local mt = {}\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2451 " function mt:__newindex(k, v)\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2452 " return vim._setvar(scope, 0, k, v)\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2453 " end\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2454 " function mt:__index(k)\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2455 " return vim._getvar(scope, 0, k)\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2456 " end\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2457 " return setmetatable({}, mt)\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2458 " end\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2459 " vim.g = make_dict_accessor('g')\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2460 " vim.v = make_dict_accessor('v')\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2461 " vim.b = make_dict_accessor('b')\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2462 " vim.w = make_dict_accessor('w')\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2463 " vim.t = make_dict_accessor('t')\n"\
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2464 "end"
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2465
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2466 static int
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2467 luaopen_vim(lua_State *L)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2468 {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2469 // set cache table
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2470 lua_newtable(L);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2471 lua_newtable(L);
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2472 lua_pushstring(L, "v");
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2473 lua_setfield(L, -2, "__mode");
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2474 lua_setmetatable(L, -2); // cache is weak-valued
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2475 // print
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2476 lua_pushcfunction(L, luaV_print);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2477 lua_setglobal(L, "print");
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2478 // debug.debug
3091
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
2479 lua_getglobal(L, "debug");
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
2480 lua_pushcfunction(L, luaV_debug);
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
2481 lua_setfield(L, -2, "debug");
92a181a1cec3 updated for version 7.3.317
Bram Moolenaar <bram@vim.org>
parents: 2683
diff changeset
2482 lua_pop(L, 1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2483 // free
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2484 lua_pushlightuserdata(L, (void *) LUAVIM_FREE);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2485 lua_pushvalue(L, 1); // cache table
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2486 lua_pushcclosure(L, luaV_free, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2487 lua_rawset(L, LUA_REGISTRYINDEX);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2488 // luaeval
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2489 lua_pushlightuserdata(L, (void *) LUAVIM_LUAEVAL);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2490 lua_pushvalue(L, 1); // cache table
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2491 lua_pushcclosure(L, luaV_luaeval, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2492 lua_rawset(L, LUA_REGISTRYINDEX);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2493 // setref
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2494 lua_pushlightuserdata(L, (void *) LUAVIM_SETREF);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2495 lua_pushvalue(L, 1); // cache table
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2496 lua_pushcclosure(L, luaV_setref, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2497 lua_rawset(L, LUA_REGISTRYINDEX);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2498 // register
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2499 luaV_newmetatable(L, LUAVIM_LIST);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2500 lua_pushvalue(L, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2501 luaV_openlib(L, luaV_List_mt, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2502 luaV_newmetatable(L, LUAVIM_DICT);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2503 lua_pushvalue(L, 1);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2504 luaV_openlib(L, luaV_Dict_mt, 1);
16076
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2505 luaV_newmetatable(L, LUAVIM_BLOB);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2506 lua_pushvalue(L, 1);
a2f0e93a5857 patch 8.1.1043: Lua interface does not support Blob
Bram Moolenaar <Bram@vim.org>
parents: 16028
diff changeset
2507 luaV_openlib(L, luaV_Blob_mt, 1);
14235
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2508 luaV_newmetatable(L, LUAVIM_FUNCREF);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2509 lua_pushvalue(L, 1);
e3bc8cdc94dd patch 8.1.0134: Lua interface does not support funcref
Christian Brabandt <cb@256bit.org>
parents: 12515
diff changeset
2510 luaV_openlib(L, luaV_Funcref_mt, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2511 luaV_newmetatable(L, LUAVIM_BUFFER);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2512 lua_pushvalue(L, 1); // cache table
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2513 luaV_openlib(L, luaV_Buffer_mt, 1);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2514 luaV_newmetatable(L, LUAVIM_WINDOW);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2515 lua_pushvalue(L, 1); // cache table
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2516 luaV_openlib(L, luaV_Window_mt, 1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2517 lua_newtable(L); // vim table
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2518 lua_pushvalue(L, 1); // cache table
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2519 luaV_openlib(L, luaV_module, 1);
24385
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2520 luaV_pushversion(L);
0878f0fd349b patch 8.2.2733: detecting Lua version is not reliable
Bram Moolenaar <Bram@vim.org>
parents: 24073
diff changeset
2521 lua_setfield(L, -2, "lua_version");
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2522 lua_setglobal(L, LUAVIM_NAME);
20441
86dde5c4b375 patch 8.2.0775: not easy to call a Vim function from Lua
Bram Moolenaar <Bram@vim.org>
parents: 19846
diff changeset
2523 // custom code
20454
070c8a22261d patch 8.2.0781: compiler warning for not using value in Lua
Bram Moolenaar <Bram@vim.org>
parents: 20441
diff changeset
2524 (void)luaL_dostring(L, LUA_VIM_FN_CODE);
20609
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2525 (void)luaL_dostring(L, LUA_VIM_UPDATE_PACKAGE_PATHS);
25503
9947b7e4b319 patch 8.2.3288: cannot easily access namespace dictionaries from Lua
Bram Moolenaar <Bram@vim.org>
parents: 25415
diff changeset
2526 (void)luaL_dostring(L, LUA_VIM_SETUP_VARIABLE_DICTS);
20609
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2527
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2528 lua_getglobal(L, "vim");
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2529 lua_getfield(L, -1, "_update_package_paths");
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2530
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2531 if (lua_pcall(L, 0, 0, 0))
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2532 luaV_emsg(L);
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2533
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2534 return 0;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2535 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2536
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2537 static lua_State *
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2538 luaV_newstate(void)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2539 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2540 lua_State *L = luaL_newstate();
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2541 luaL_openlibs(L); // core libs
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2542 lua_pushcfunction(L, luaopen_vim); // vim
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2543 lua_call(L, 0, 0);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2544 return L;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2545 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2546
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2547 static void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2548 luaV_setrange(lua_State *L, int line1, int line2)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2549 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2550 lua_getglobal(L, LUAVIM_NAME);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2551 lua_pushinteger(L, line1);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2552 lua_setfield(L, -2, "firstline");
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2553 lua_pushinteger(L, line2);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2554 lua_setfield(L, -2, "lastline");
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2555 lua_pop(L, 1); // vim table
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2556 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2557
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2558
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2559 // ======= Interface =======
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2560
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2561 static lua_State *L = NULL;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2562
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2563 static int
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2564 lua_isopen(void)
2543
8c512e2c7cb5 Fix: Lua interface tried to load the library when closing a buffer or window.
Bram Moolenaar <bram@vim.org>
parents: 2431
diff changeset
2565 {
8c512e2c7cb5 Fix: Lua interface tried to load the library when closing a buffer or window.
Bram Moolenaar <bram@vim.org>
parents: 2431
diff changeset
2566 return L != NULL;
8c512e2c7cb5 Fix: Lua interface tried to load the library when closing a buffer or window.
Bram Moolenaar <bram@vim.org>
parents: 2431
diff changeset
2567 }
8c512e2c7cb5 Fix: Lua interface tried to load the library when closing a buffer or window.
Bram Moolenaar <bram@vim.org>
parents: 2431
diff changeset
2568
8c512e2c7cb5 Fix: Lua interface tried to load the library when closing a buffer or window.
Bram Moolenaar <bram@vim.org>
parents: 2431
diff changeset
2569 static int
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2570 lua_init(void)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2571 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2572 if (lua_isopen())
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2573 return OK;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2574
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2575 #ifdef DYNAMIC_LUA
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2576 if (!lua_enabled(TRUE))
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2577 {
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2578 emsg(_("Lua library cannot be loaded."));
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2579 return FAIL;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2580 }
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2581 #endif
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2582 L = luaV_newstate();
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2583
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2584 return OK;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2585 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2586
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2587 void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2588 lua_end(void)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2589 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2590 if (!lua_isopen())
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2591 return;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2592
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2593 lua_close(L);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2594 L = NULL;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2595 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2596
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2597 /*
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2598 * ex commands
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2599 */
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2600 void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2601 ex_lua(exarg_T *eap)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2602 {
22719
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
2603 char *script = (char *)script_get(eap, eap->arg);
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
2604
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
2605 if (!eap->skip && lua_init() == OK)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2606 {
22719
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
2607 char *s = script != NULL ? script : (char *)eap->arg;
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
2608
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2609 luaV_setrange(L, eap->line1, eap->line2);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2610 if (luaL_loadbuffer(L, s, strlen(s), LUAVIM_CHUNKNAME)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2611 || lua_pcall(L, 0, 0, 0))
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2612 luaV_emsg(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2613 }
22719
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
2614 if (script != NULL)
8da5e18effc5 patch 8.2.1908: Lua is initialized even when not used
Bram Moolenaar <Bram@vim.org>
parents: 21367
diff changeset
2615 vim_free(script);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2616 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2617
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2618 void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2619 ex_luado(exarg_T *eap)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2620 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2621 linenr_T l;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2622 const char *s = (const char *) eap->arg;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2623 luaL_Buffer b;
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2624 size_t len;
10757
6c3d42d18366 patch 8.0.0268: may get ml_get error when :luado deletes lines
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
2625 buf_T *was_curbuf = curbuf;
6c3d42d18366 patch 8.0.0268: may get ml_get error when :luado deletes lines
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
2626
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2627 if (lua_init() == FAIL) return;
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2628 if (u_save(eap->line1 - 1, eap->line2 + 1) == FAIL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2629 {
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 15328
diff changeset
2630 emsg(_("cannot save undo information"));
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2631 return;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2632 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2633 luaV_setrange(L, eap->line1, eap->line2);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2634 luaL_buffinit(L, &b);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2635 luaL_addlstring(&b, "return function(line, linenr) ", 30); // header
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2636 luaL_addlstring(&b, s, strlen(s));
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2637 luaL_addlstring(&b, " end", 4); // footer
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2638 luaL_pushresult(&b);
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2639 s = lua_tolstring(L, -1, &len);
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2640 if (luaL_loadbuffer(L, s, len, LUAVIM_CHUNKNAME))
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2641 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2642 luaV_emsg(L);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2643 lua_pop(L, 1); // function body
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2644 return;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2645 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2646 lua_call(L, 0, 1);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2647 lua_replace(L, -2); // function -> body
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2648 for (l = eap->line1; l <= eap->line2; l++)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2649 {
21108
43e82e8133b9 patch 8.2.1105: insufficient test coverage for Lua
Bram Moolenaar <Bram@vim.org>
parents: 21060
diff changeset
2650 // Check the line number, the command may have deleted lines.
10757
6c3d42d18366 patch 8.0.0268: may get ml_get error when :luado deletes lines
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
2651 if (l > curbuf->b_ml.ml_line_count)
6c3d42d18366 patch 8.0.0268: may get ml_get error when :luado deletes lines
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
2652 break;
6c3d42d18366 patch 8.0.0268: may get ml_get error when :luado deletes lines
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
2653
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2654 lua_pushvalue(L, -1); // function
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2655 luaV_pushline(L, curbuf, l); // current line as arg
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2656 lua_pushinteger(L, l); // current line number as arg
3459
5240610f2778 updated for version 7.3.494
Bram Moolenaar <bram@vim.org>
parents: 3450
diff changeset
2657 if (lua_pcall(L, 2, 1, 0))
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2658 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2659 luaV_emsg(L);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2660 break;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2661 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2662 // Catch the command switching to another buffer.
10757
6c3d42d18366 patch 8.0.0268: may get ml_get error when :luado deletes lines
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
2663 if (curbuf != was_curbuf)
6c3d42d18366 patch 8.0.0268: may get ml_get error when :luado deletes lines
Christian Brabandt <cb@256bit.org>
parents: 10025
diff changeset
2664 break;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2665 if (lua_isstring(L, -1)) // update line?
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2666 {
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2667 #ifdef HAVE_SANDBOX
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2668 luaV_checksandbox(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2669 #endif
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2670 ml_replace(l, luaV_toline(L, -1), TRUE);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2671 changed_bytes(l, 0);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2672 lua_pop(L, 1); // result from luaV_toline
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2673 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2674 lua_pop(L, 1); // line
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2675 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18370
diff changeset
2676 lua_pop(L, 1); // function
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2677 check_cursor();
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
2678 update_screen(UPD_NOT_VALID);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2679 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2680
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2681 void
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2682 ex_luafile(exarg_T *eap)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2683 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2684 if (lua_init() == FAIL)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2685 return;
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2686 if (!eap->skip)
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2687 {
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2688 luaV_setrange(L, eap->line1, eap->line2);
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2689 if (luaL_loadfile(L, (char *) eap->arg) || lua_pcall(L, 0, 0, 0))
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2690 luaV_emsg(L);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2691 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2692 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2693
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2694 #define luaV_freetype(typ,tname) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2695 void \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2696 lua_##tname##_free(typ *o) \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2697 { \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2698 if (!lua_isopen()) return; \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2699 luaV_getfield(L, LUAVIM_FREE); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2700 lua_pushlightuserdata(L, (void *) o); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2701 lua_call(L, 1, 0); \
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2702 }
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2703
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2704 luaV_freetype(buf_T, buffer)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2705 luaV_freetype(win_T, window)
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2706
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2707 void
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2708 do_luaeval(char_u *str, typval_T *arg, typval_T *rettv)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2709 {
3450
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2710 lua_init();
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2711 luaV_getfield(L, LUAVIM_LUAEVAL);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2712 lua_pushstring(L, (char *) str);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2713 lua_pushlightuserdata(L, (void *) arg);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2714 lua_pushlightuserdata(L, (void *) rettv);
b067b8b81be9 updated for version 7.3.490
Bram Moolenaar <bram@vim.org>
parents: 3200
diff changeset
2715 lua_call(L, 3, 0);
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2716 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2717
6565
38add5a3d617 updated for version 7.4.609
Bram Moolenaar <bram@vim.org>
parents: 5871
diff changeset
2718 int
16028
8ad2cda3757d patch 8.1.1019: Lua: may garbage collect function reference in use
Bram Moolenaar <Bram@vim.org>
parents: 16009
diff changeset
2719 set_ref_in_lua(int copyID)
2330
ea4bf6df1a8a Whitespace cleanup.
Bram Moolenaar <bram@vim.org>
parents: 2320
diff changeset
2720 {
6565
38add5a3d617 updated for version 7.4.609
Bram Moolenaar <bram@vim.org>
parents: 5871
diff changeset
2721 int aborted = 0;
38add5a3d617 updated for version 7.4.609
Bram Moolenaar <bram@vim.org>
parents: 5871
diff changeset
2722
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2723 if (!lua_isopen())
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2724 return 0;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2725
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2726 luaV_getfield(L, LUAVIM_SETREF);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2727 // call the function with 1 arg, getting 1 result back
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2728 lua_pushinteger(L, copyID);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2729 lua_call(L, 1, 1);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2730 // get the result
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2731 aborted = lua_tointeger(L, -1);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2732 // pop result off the stack
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2733 lua_pop(L, 1);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2734
6565
38add5a3d617 updated for version 7.4.609
Bram Moolenaar <bram@vim.org>
parents: 5871
diff changeset
2735 return aborted;
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2736 }
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2737
20609
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2738 void
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2739 update_package_paths_in_lua()
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2740 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2741 if (!lua_isopen())
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2742 return;
20609
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2743
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2744 lua_getglobal(L, "vim");
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2745 lua_getfield(L, -1, "_update_package_paths");
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2746
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2747 if (lua_pcall(L, 0, 0, 0))
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31231
diff changeset
2748 luaV_emsg(L);
20609
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2749 }
054ba681412d patch 8.2.0858: not easy to require Lua modules
Bram Moolenaar <Bram@vim.org>
parents: 20599
diff changeset
2750
21006
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2751 /*
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2752 * Native C function callback
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2753 */
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2754 static int
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2755 luaV_call_lua_func(
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2756 int argcount,
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2757 typval_T *argvars,
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2758 typval_T *rettv,
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2759 void *state)
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2760 {
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2761 int i;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2762 int luaargcount = argcount;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2763 luaV_CFuncState *funcstate = (luaV_CFuncState*)state;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2764 lua_rawgeti(funcstate->L, LUA_REGISTRYINDEX, funcstate->lua_funcref);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2765
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2766 if (funcstate->lua_tableref != LUA_NOREF)
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2767 {
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2768 // First arg for metatable __call method is a table
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2769 luaargcount += 1;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2770 lua_rawgeti(funcstate->L, LUA_REGISTRYINDEX, funcstate->lua_tableref);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2771 }
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2772
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2773 for (i = 0; i < argcount; ++i)
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2774 luaV_pushtypval(funcstate->L, &argvars[i]);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2775
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2776 if (lua_pcall(funcstate->L, luaargcount, 1, 0))
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2777 {
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2778 luaV_emsg(funcstate->L);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2779 return FCERR_OTHER;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2780 }
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2781
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2782 luaV_checktypval(funcstate->L, -1, rettv, "get return value");
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2783 return FCERR_NONE;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2784 }
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2785
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2786 /*
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2787 * Free up any lua references held by the func state.
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2788 */
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2789 static void
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2790 luaV_call_lua_func_free(void *state)
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2791 {
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2792 luaV_CFuncState *funcstate = (luaV_CFuncState*)state;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2793 luaL_unref(L, LUA_REGISTRYINDEX, funcstate->lua_funcref);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2794 funcstate->L = NULL;
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2795 if (funcstate->lua_tableref != LUA_NOREF)
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2796 luaL_unref(L, LUA_REGISTRYINDEX, funcstate->lua_tableref);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2797 VIM_CLEAR(funcstate);
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2798 }
ae185f35e256 patch 8.2.1054: not so easy to pass a lua function to Vim
Bram Moolenaar <Bram@vim.org>
parents: 20609
diff changeset
2799
2320
966a5609669e Added Lua interfae. (Luis Carvalho)
Bram Moolenaar <bram@vim.org>
parents:
diff changeset
2800 #endif