blob: e1e6ada220dc1a051879494e73d6d253294d9108 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001/* vi:set ts=8 sts=4 sw=4:
2 *
3 * VIM - Vi IMproved by Bram Moolenaar
4 *
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 */
8/*
9 * if_perl.xs: Main code for Perl interface support.
10 * Mostly written by Sven Verdoolaege.
11 */
12
13#define _memory_h /* avoid memset redeclaration */
14#define IN_PERL_FILE /* don't include if_perl.pro from proto.h */
15
16#include "vim.h"
17
18
19/*
20 * Work around clashes between Perl and Vim namespace. proto.h doesn't
21 * include if_perl.pro and perlsfio.pro when IN_PERL_FILE is defined, because
22 * we need the CV typedef. proto.h can't be moved to after including
23 * if_perl.h, because we get all sorts of name clashes then.
24 */
25#ifndef PROTO
26#ifndef __MINGW32__
27# include "proto/if_perl.pro"
28# include "proto/if_perlsfio.pro"
29#endif
30#endif
31
32/* Perl compatibility stuff. This should ensure compatibility with older
33 * versions of Perl.
34 */
35
36#ifndef PERL_VERSION
37# include <patchlevel.h>
38# define PERL_REVISION 5
39# define PERL_VERSION PATCHLEVEL
40# define PERL_SUBVERSION SUBVERSION
41#endif
42
Bram Moolenaar700d1d72007-09-13 13:20:16 +000043/*
44 * Quoting Jan Dubois of Active State:
45 * ActivePerl build 822 still identifies itself as 5.8.8 but already
46 * contains many of the changes from the upcoming Perl 5.8.9 release.
47 *
48 * The changes include addition of two symbols (Perl_sv_2iv_flags,
49 * Perl_newXS_flags) not present in earlier releases.
50 *
Bram Moolenaar3b9b13e2007-09-15 12:49:35 +000051 * Jan Dubois suggested the following guarding scheme.
52 *
53 * Active State defined ACTIVEPERL_VERSION as a string in versions before
54 * 5.8.8; and so the comparison to 822 below needs to be guarded.
Bram Moolenaar700d1d72007-09-13 13:20:16 +000055 */
Bram Moolenaar3b9b13e2007-09-15 12:49:35 +000056#if (PERL_REVISION == 5) && (PERL_VERSION == 8) && (PERL_SUBVERSION >= 8)
57# if (ACTIVEPERL_VERSION >= 822) || (PERL_SUBVERSION >= 9)
58# define PERL589_OR_LATER
59# endif
Bram Moolenaar700d1d72007-09-13 13:20:16 +000060#endif
61#if (PERL_REVISION == 5) && (PERL_VERSION >= 9)
62# define PERL589_OR_LATER
63#endif
64
Bram Moolenaar58cb0892010-03-02 15:14:33 +010065#if (PERL_REVISION == 5) && ((PERL_VERSION > 10) || \
66 (PERL_VERSION == 10) && (PERL_SUBVERSION >= 1))
67# define PERL5101_OR_LATER
68#endif
69
Bram Moolenaar071d4272004-06-13 20:20:40 +000070#ifndef pTHX
71# define pTHX void
72# define pTHX_
73#endif
74
75#ifndef EXTERN_C
76# define EXTERN_C
77#endif
78
79/* Compatibility hacks over */
80
81static PerlInterpreter *perl_interp = NULL;
82static void xs_init __ARGS((pTHX));
83static void VIM_init __ARGS((void));
84EXTERN_C void boot_DynaLoader __ARGS((pTHX_ CV*));
85
86/*
Bram Moolenaare06c1882010-07-21 22:05:20 +020087 * For dynamic linked perl.
Bram Moolenaar071d4272004-06-13 20:20:40 +000088 */
89#if defined(DYNAMIC_PERL) || defined(PROTO)
Bram Moolenaare06c1882010-07-21 22:05:20 +020090
91#ifndef DYNAMIC_PERL /* just generating prototypes */
Bram Moolenaar766fb0d2010-07-22 11:34:16 +020092#ifdef WIN3264
Bram Moolenaare06c1882010-07-21 22:05:20 +020093typedef int HANDLE;
94#endif
95typedef int XSINIT_t;
96typedef int XSUBADDR_t;
97typedef int perl_key;
98#endif
99
Bram Moolenaar766fb0d2010-07-22 11:34:16 +0200100#ifndef WIN3264
Bram Moolenaare06c1882010-07-21 22:05:20 +0200101#include <dlfcn.h>
102#define HANDLE void*
103#define PERL_PROC void*
104#define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
105#define symbol_from_dll dlsym
106#define close_dll dlclose
107#else
108#define PERL_PROC FARPROC
Bram Moolenaarebbcb822010-10-23 14:02:54 +0200109#define load_dll vimLoadLib
Bram Moolenaare06c1882010-07-21 22:05:20 +0200110#define symbol_from_dll GetProcAddress
111#define close_dll FreeLibrary
112#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000113/*
114 * Wrapper defines
115 */
116# define perl_alloc dll_perl_alloc
117# define perl_construct dll_perl_construct
118# define perl_parse dll_perl_parse
119# define perl_run dll_perl_run
120# define perl_destruct dll_perl_destruct
121# define perl_free dll_perl_free
122# define Perl_get_context dll_Perl_get_context
123# define Perl_croak dll_Perl_croak
Bram Moolenaar58cb0892010-03-02 15:14:33 +0100124# ifdef PERL5101_OR_LATER
Bram Moolenaar3a0573a2010-02-17 16:40:58 +0100125# define Perl_croak_xs_usage dll_Perl_croak_xs_usage
126# endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127# ifndef PROTO
128# define Perl_croak_nocontext dll_Perl_croak_nocontext
129# define Perl_call_argv dll_Perl_call_argv
130# define Perl_call_pv dll_Perl_call_pv
131# define Perl_eval_sv dll_Perl_eval_sv
132# define Perl_get_sv dll_Perl_get_sv
133# define Perl_eval_pv dll_Perl_eval_pv
134# define Perl_call_method dll_Perl_call_method
135# endif
136# define Perl_dowantarray dll_Perl_dowantarray
137# define Perl_free_tmps dll_Perl_free_tmps
138# define Perl_gv_stashpv dll_Perl_gv_stashpv
139# define Perl_markstack_grow dll_Perl_markstack_grow
140# define Perl_mg_find dll_Perl_mg_find
141# define Perl_newXS dll_Perl_newXS
142# define Perl_newSV dll_Perl_newSV
143# define Perl_newSViv dll_Perl_newSViv
144# define Perl_newSVpv dll_Perl_newSVpv
145# define Perl_pop_scope dll_Perl_pop_scope
146# define Perl_push_scope dll_Perl_push_scope
147# define Perl_save_int dll_Perl_save_int
148# define Perl_stack_grow dll_Perl_stack_grow
149# define Perl_set_context dll_Perl_set_context
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200150# if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
151# define Perl_sv_2bool_flags dll_Perl_sv_2bool_flags
152# define Perl_xs_apiversion_bootcheck dll_Perl_xs_apiversion_bootcheck
153# else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000154# define Perl_sv_2bool dll_Perl_sv_2bool
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200155# endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000156# define Perl_sv_2iv dll_Perl_sv_2iv
157# define Perl_sv_2mortal dll_Perl_sv_2mortal
158# if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
159# define Perl_sv_2pv_flags dll_Perl_sv_2pv_flags
160# define Perl_sv_2pv_nolen dll_Perl_sv_2pv_nolen
161# else
162# define Perl_sv_2pv dll_Perl_sv_2pv
163# endif
164# define Perl_sv_bless dll_Perl_sv_bless
165# if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
166# define Perl_sv_catpvn_flags dll_Perl_sv_catpvn_flags
167# else
168# define Perl_sv_catpvn dll_Perl_sv_catpvn
169# endif
Bram Moolenaar700d1d72007-09-13 13:20:16 +0000170#ifdef PERL589_OR_LATER
171# define Perl_sv_2iv_flags dll_Perl_sv_2iv_flags
172# define Perl_newXS_flags dll_Perl_newXS_flags
173#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000174# define Perl_sv_free dll_Perl_sv_free
Bram Moolenaarccf22172008-09-01 15:56:45 +0000175# if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
176# define Perl_sv_free2 dll_Perl_sv_free2
177# endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000178# define Perl_sv_isa dll_Perl_sv_isa
179# define Perl_sv_magic dll_Perl_sv_magic
180# define Perl_sv_setiv dll_Perl_sv_setiv
181# define Perl_sv_setpv dll_Perl_sv_setpv
182# define Perl_sv_setpvn dll_Perl_sv_setpvn
183# if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
184# define Perl_sv_setsv_flags dll_Perl_sv_setsv_flags
185# else
186# define Perl_sv_setsv dll_Perl_sv_setsv
187# endif
188# define Perl_sv_upgrade dll_Perl_sv_upgrade
189# define Perl_Tstack_sp_ptr dll_Perl_Tstack_sp_ptr
190# define Perl_Top_ptr dll_Perl_Top_ptr
191# define Perl_Tstack_base_ptr dll_Perl_Tstack_base_ptr
192# define Perl_Tstack_max_ptr dll_Perl_Tstack_max_ptr
193# define Perl_Ttmps_ix_ptr dll_Perl_Ttmps_ix_ptr
194# define Perl_Ttmps_floor_ptr dll_Perl_Ttmps_floor_ptr
195# define Perl_Tmarkstack_ptr_ptr dll_Perl_Tmarkstack_ptr_ptr
196# define Perl_Tmarkstack_max_ptr dll_Perl_Tmarkstack_max_ptr
197# define Perl_TSv_ptr dll_Perl_TSv_ptr
198# define Perl_TXpv_ptr dll_Perl_TXpv_ptr
199# define Perl_Tna_ptr dll_Perl_Tna_ptr
200# define Perl_Idefgv_ptr dll_Perl_Idefgv_ptr
201# define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr
202# define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr
203# define boot_DynaLoader dll_boot_DynaLoader
Bram Moolenaare06c1882010-07-21 22:05:20 +0200204# define Perl_Gthr_key_ptr dll_Perl_Gthr_key_ptr
Bram Moolenaar071d4272004-06-13 20:20:40 +0000205
Bram Moolenaar4eac38f2008-12-03 12:18:55 +0000206# define Perl_sys_init dll_Perl_sys_init
Bram Moolenaarc236c162008-07-13 17:41:49 +0000207# define Perl_sys_term dll_Perl_sys_term
208# define Perl_ISv_ptr dll_Perl_ISv_ptr
209# define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr
210# define Perl_Istack_base_ptr dll_Perl_Istack_base_ptr
211# define Perl_Itmps_ix_ptr dll_Perl_Itmps_ix_ptr
212# define Perl_Itmps_floor_ptr dll_Perl_Itmps_floor_ptr
213# define Perl_IXpv_ptr dll_Perl_IXpv_ptr
214# define Perl_Ina_ptr dll_Perl_Ina_ptr
215# define Perl_Imarkstack_ptr_ptr dll_Perl_Imarkstack_ptr_ptr
216# define Perl_Imarkstack_max_ptr dll_Perl_Imarkstack_max_ptr
217# define Perl_Istack_sp_ptr dll_Perl_Istack_sp_ptr
218# define Perl_Iop_ptr dll_Perl_Iop_ptr
219# define Perl_call_list dll_Perl_call_list
220# define Perl_Iscopestack_ix_ptr dll_Perl_Iscopestack_ix_ptr
221# define Perl_Iunitcheckav_ptr dll_Perl_Iunitcheckav_ptr
222
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223/*
224 * Declare HANDLE for perl.dll and function pointers.
225 */
226static HANDLE hPerlLib = NULL;
227
228static PerlInterpreter* (*perl_alloc)();
229static void (*perl_construct)(PerlInterpreter*);
230static void (*perl_destruct)(PerlInterpreter*);
231static void (*perl_free)(PerlInterpreter*);
232static int (*perl_run)(PerlInterpreter*);
233static int (*perl_parse)(PerlInterpreter*, XSINIT_t, int, char**, char**);
234static void* (*Perl_get_context)(void);
Bram Moolenaara7ecc562006-08-16 16:17:39 +0000235static void (*Perl_croak)(pTHX_ const char*, ...);
Bram Moolenaar58cb0892010-03-02 15:14:33 +0100236#ifdef PERL5101_OR_LATER
Bram Moolenaar3a0573a2010-02-17 16:40:58 +0100237static void (*Perl_croak_xs_usage)(pTHX_ const CV *const, const char *const params);
238#endif
Bram Moolenaara7ecc562006-08-16 16:17:39 +0000239static void (*Perl_croak_nocontext)(const char*, ...);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000240static I32 (*Perl_dowantarray)(pTHX);
241static void (*Perl_free_tmps)(pTHX);
242static HV* (*Perl_gv_stashpv)(pTHX_ const char*, I32);
243static void (*Perl_markstack_grow)(pTHX);
244static MAGIC* (*Perl_mg_find)(pTHX_ SV*, int);
245static CV* (*Perl_newXS)(pTHX_ char*, XSUBADDR_t, char*);
246static SV* (*Perl_newSV)(pTHX_ STRLEN);
247static SV* (*Perl_newSViv)(pTHX_ IV);
248static SV* (*Perl_newSVpv)(pTHX_ const char*, STRLEN);
249static I32 (*Perl_call_argv)(pTHX_ const char*, I32, char**);
250static I32 (*Perl_call_pv)(pTHX_ const char*, I32);
251static I32 (*Perl_eval_sv)(pTHX_ SV*, I32);
252static SV* (*Perl_get_sv)(pTHX_ const char*, I32);
253static SV* (*Perl_eval_pv)(pTHX_ const char*, I32);
254static SV* (*Perl_call_method)(pTHX_ const char*, I32);
255static void (*Perl_pop_scope)(pTHX);
256static void (*Perl_push_scope)(pTHX);
257static void (*Perl_save_int)(pTHX_ int*);
258static SV** (*Perl_stack_grow)(pTHX_ SV**, SV**p, int);
259static SV** (*Perl_set_context)(void*);
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200260#if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
261static bool (*Perl_sv_2bool_flags)(pTHX_ SV*, I32);
262static void (*Perl_xs_apiversion_bootcheck)(pTHX_ SV *module, const char *api_p, STRLEN api_len);
263#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264static bool (*Perl_sv_2bool)(pTHX_ SV*);
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200265#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266static IV (*Perl_sv_2iv)(pTHX_ SV*);
267static SV* (*Perl_sv_2mortal)(pTHX_ SV*);
268#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
269static char* (*Perl_sv_2pv_flags)(pTHX_ SV*, STRLEN*, I32);
270static char* (*Perl_sv_2pv_nolen)(pTHX_ SV*);
271#else
272static char* (*Perl_sv_2pv)(pTHX_ SV*, STRLEN*);
273#endif
274static SV* (*Perl_sv_bless)(pTHX_ SV*, HV*);
275#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
276static void (*Perl_sv_catpvn_flags)(pTHX_ SV* , const char*, STRLEN, I32);
277#else
278static void (*Perl_sv_catpvn)(pTHX_ SV*, const char*, STRLEN);
279#endif
Bram Moolenaar700d1d72007-09-13 13:20:16 +0000280#ifdef PERL589_OR_LATER
281static IV (*Perl_sv_2iv_flags)(pTHX_ SV* sv, I32 flags);
282static CV * (*Perl_newXS_flags)(pTHX_ const char *name, XSUBADDR_t subaddr, const char *const filename, const char *const proto, U32 flags);
283#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284static void (*Perl_sv_free)(pTHX_ SV*);
285static int (*Perl_sv_isa)(pTHX_ SV*, const char*);
286static void (*Perl_sv_magic)(pTHX_ SV*, SV*, int, const char*, I32);
287static void (*Perl_sv_setiv)(pTHX_ SV*, IV);
288static void (*Perl_sv_setpv)(pTHX_ SV*, const char*);
289static void (*Perl_sv_setpvn)(pTHX_ SV*, const char*, STRLEN);
290#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
291static void (*Perl_sv_setsv_flags)(pTHX_ SV*, SV*, I32);
292#else
293static void (*Perl_sv_setsv)(pTHX_ SV*, SV*);
294#endif
295static bool (*Perl_sv_upgrade)(pTHX_ SV*, U32);
Bram Moolenaare06c1882010-07-21 22:05:20 +0200296#if (PERL_REVISION == 5) && (PERL_VERSION < 10)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000297static SV*** (*Perl_Tstack_sp_ptr)(register PerlInterpreter*);
298static OP** (*Perl_Top_ptr)(register PerlInterpreter*);
299static SV*** (*Perl_Tstack_base_ptr)(register PerlInterpreter*);
300static SV*** (*Perl_Tstack_max_ptr)(register PerlInterpreter*);
301static I32* (*Perl_Ttmps_ix_ptr)(register PerlInterpreter*);
302static I32* (*Perl_Ttmps_floor_ptr)(register PerlInterpreter*);
303static I32** (*Perl_Tmarkstack_ptr_ptr)(register PerlInterpreter*);
304static I32** (*Perl_Tmarkstack_max_ptr)(register PerlInterpreter*);
305static SV** (*Perl_TSv_ptr)(register PerlInterpreter*);
306static XPV** (*Perl_TXpv_ptr)(register PerlInterpreter*);
307static STRLEN* (*Perl_Tna_ptr)(register PerlInterpreter*);
Bram Moolenaare06c1882010-07-21 22:05:20 +0200308#else
Bram Moolenaarccf22172008-09-01 15:56:45 +0000309static void (*Perl_sv_free2)(pTHX_ SV*);
Bram Moolenaar4eac38f2008-12-03 12:18:55 +0000310static void (*Perl_sys_init)(int* argc, char*** argv);
Bram Moolenaarc236c162008-07-13 17:41:49 +0000311static void (*Perl_sys_term)(void);
312static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
313static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*);
314static SV*** (*Perl_Istack_base_ptr)(register PerlInterpreter*);
315static XPV** (*Perl_IXpv_ptr)(register PerlInterpreter*);
316static I32* (*Perl_Itmps_ix_ptr)(register PerlInterpreter*);
317static I32* (*Perl_Itmps_floor_ptr)(register PerlInterpreter*);
318static STRLEN* (*Perl_Ina_ptr)(register PerlInterpreter*);
319static I32** (*Perl_Imarkstack_ptr_ptr)(register PerlInterpreter*);
320static I32** (*Perl_Imarkstack_max_ptr)(register PerlInterpreter*);
321static SV*** (*Perl_Istack_sp_ptr)(register PerlInterpreter*);
322static OP** (*Perl_Iop_ptr)(register PerlInterpreter*);
323static void (*Perl_call_list)(pTHX_ I32, AV*);
324static I32* (*Perl_Iscopestack_ix_ptr)(register PerlInterpreter*);
325static AV** (*Perl_Iunitcheckav_ptr)(register PerlInterpreter*);
326#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000327
Bram Moolenaare06c1882010-07-21 22:05:20 +0200328static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*);
329static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*);
330static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*);
331static void (*boot_DynaLoader)_((pTHX_ CV*));
332static perl_key* (*Perl_Gthr_key_ptr)_((pTHX));
333
Bram Moolenaar071d4272004-06-13 20:20:40 +0000334/*
335 * Table of name to function pointer of perl.
336 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337static struct {
338 char* name;
339 PERL_PROC* ptr;
340} perl_funcname_table[] = {
341 {"perl_alloc", (PERL_PROC*)&perl_alloc},
342 {"perl_construct", (PERL_PROC*)&perl_construct},
343 {"perl_destruct", (PERL_PROC*)&perl_destruct},
344 {"perl_free", (PERL_PROC*)&perl_free},
345 {"perl_run", (PERL_PROC*)&perl_run},
346 {"perl_parse", (PERL_PROC*)&perl_parse},
347 {"Perl_get_context", (PERL_PROC*)&Perl_get_context},
348 {"Perl_croak", (PERL_PROC*)&Perl_croak},
Bram Moolenaar58cb0892010-03-02 15:14:33 +0100349#ifdef PERL5101_OR_LATER
Bram Moolenaar3a0573a2010-02-17 16:40:58 +0100350 {"Perl_croak_xs_usage", (PERL_PROC*)&Perl_croak_xs_usage},
351#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000352 {"Perl_croak_nocontext", (PERL_PROC*)&Perl_croak_nocontext},
353 {"Perl_dowantarray", (PERL_PROC*)&Perl_dowantarray},
354 {"Perl_free_tmps", (PERL_PROC*)&Perl_free_tmps},
355 {"Perl_gv_stashpv", (PERL_PROC*)&Perl_gv_stashpv},
356 {"Perl_markstack_grow", (PERL_PROC*)&Perl_markstack_grow},
357 {"Perl_mg_find", (PERL_PROC*)&Perl_mg_find},
358 {"Perl_newXS", (PERL_PROC*)&Perl_newXS},
359 {"Perl_newSV", (PERL_PROC*)&Perl_newSV},
360 {"Perl_newSViv", (PERL_PROC*)&Perl_newSViv},
361 {"Perl_newSVpv", (PERL_PROC*)&Perl_newSVpv},
362 {"Perl_call_argv", (PERL_PROC*)&Perl_call_argv},
363 {"Perl_call_pv", (PERL_PROC*)&Perl_call_pv},
364 {"Perl_eval_sv", (PERL_PROC*)&Perl_eval_sv},
365 {"Perl_get_sv", (PERL_PROC*)&Perl_get_sv},
366 {"Perl_eval_pv", (PERL_PROC*)&Perl_eval_pv},
367 {"Perl_call_method", (PERL_PROC*)&Perl_call_method},
368 {"Perl_pop_scope", (PERL_PROC*)&Perl_pop_scope},
369 {"Perl_push_scope", (PERL_PROC*)&Perl_push_scope},
370 {"Perl_save_int", (PERL_PROC*)&Perl_save_int},
371 {"Perl_stack_grow", (PERL_PROC*)&Perl_stack_grow},
372 {"Perl_set_context", (PERL_PROC*)&Perl_set_context},
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200373#if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
374 {"Perl_sv_2bool_flags", (PERL_PROC*)&Perl_sv_2bool_flags},
375 {"Perl_xs_apiversion_bootcheck",(PERL_PROC*)&Perl_xs_apiversion_bootcheck},
376#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377 {"Perl_sv_2bool", (PERL_PROC*)&Perl_sv_2bool},
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200378#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379 {"Perl_sv_2iv", (PERL_PROC*)&Perl_sv_2iv},
380 {"Perl_sv_2mortal", (PERL_PROC*)&Perl_sv_2mortal},
381#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
382 {"Perl_sv_2pv_flags", (PERL_PROC*)&Perl_sv_2pv_flags},
383 {"Perl_sv_2pv_nolen", (PERL_PROC*)&Perl_sv_2pv_nolen},
384#else
385 {"Perl_sv_2pv", (PERL_PROC*)&Perl_sv_2pv},
386#endif
Bram Moolenaar700d1d72007-09-13 13:20:16 +0000387#ifdef PERL589_OR_LATER
388 {"Perl_sv_2iv_flags", (PERL_PROC*)&Perl_sv_2iv_flags},
389 {"Perl_newXS_flags", (PERL_PROC*)&Perl_newXS_flags},
390#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391 {"Perl_sv_bless", (PERL_PROC*)&Perl_sv_bless},
392#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
393 {"Perl_sv_catpvn_flags", (PERL_PROC*)&Perl_sv_catpvn_flags},
394#else
395 {"Perl_sv_catpvn", (PERL_PROC*)&Perl_sv_catpvn},
396#endif
397 {"Perl_sv_free", (PERL_PROC*)&Perl_sv_free},
398 {"Perl_sv_isa", (PERL_PROC*)&Perl_sv_isa},
399 {"Perl_sv_magic", (PERL_PROC*)&Perl_sv_magic},
400 {"Perl_sv_setiv", (PERL_PROC*)&Perl_sv_setiv},
401 {"Perl_sv_setpv", (PERL_PROC*)&Perl_sv_setpv},
402 {"Perl_sv_setpvn", (PERL_PROC*)&Perl_sv_setpvn},
403#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
404 {"Perl_sv_setsv_flags", (PERL_PROC*)&Perl_sv_setsv_flags},
405#else
406 {"Perl_sv_setsv", (PERL_PROC*)&Perl_sv_setsv},
407#endif
408 {"Perl_sv_upgrade", (PERL_PROC*)&Perl_sv_upgrade},
Bram Moolenaarc236c162008-07-13 17:41:49 +0000409#if (PERL_REVISION == 5) && (PERL_VERSION < 10)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000410 {"Perl_Tstack_sp_ptr", (PERL_PROC*)&Perl_Tstack_sp_ptr},
411 {"Perl_Top_ptr", (PERL_PROC*)&Perl_Top_ptr},
412 {"Perl_Tstack_base_ptr", (PERL_PROC*)&Perl_Tstack_base_ptr},
413 {"Perl_Tstack_max_ptr", (PERL_PROC*)&Perl_Tstack_max_ptr},
414 {"Perl_Ttmps_ix_ptr", (PERL_PROC*)&Perl_Ttmps_ix_ptr},
415 {"Perl_Ttmps_floor_ptr", (PERL_PROC*)&Perl_Ttmps_floor_ptr},
416 {"Perl_Tmarkstack_ptr_ptr", (PERL_PROC*)&Perl_Tmarkstack_ptr_ptr},
417 {"Perl_Tmarkstack_max_ptr", (PERL_PROC*)&Perl_Tmarkstack_max_ptr},
418 {"Perl_TSv_ptr", (PERL_PROC*)&Perl_TSv_ptr},
419 {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr},
420 {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
Bram Moolenaarc236c162008-07-13 17:41:49 +0000421#else
Bram Moolenaarccf22172008-09-01 15:56:45 +0000422 {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
Bram Moolenaar4eac38f2008-12-03 12:18:55 +0000423 {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init},
Bram Moolenaarc236c162008-07-13 17:41:49 +0000424 {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200425 {"Perl_call_list", (PERL_PROC*)&Perl_call_list},
426# if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
427# else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000428 {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
Bram Moolenaarc236c162008-07-13 17:41:49 +0000429 {"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr},
Bram Moolenaare06c1882010-07-21 22:05:20 +0200430 {"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr},
431 {"Perl_IXpv_ptr", (PERL_PROC*)&Perl_IXpv_ptr},
Bram Moolenaarc236c162008-07-13 17:41:49 +0000432 {"Perl_Itmps_ix_ptr", (PERL_PROC*)&Perl_Itmps_ix_ptr},
433 {"Perl_Itmps_floor_ptr", (PERL_PROC*)&Perl_Itmps_floor_ptr},
Bram Moolenaare06c1882010-07-21 22:05:20 +0200434 {"Perl_Ina_ptr", (PERL_PROC*)&Perl_Ina_ptr},
Bram Moolenaarc236c162008-07-13 17:41:49 +0000435 {"Perl_Imarkstack_ptr_ptr", (PERL_PROC*)&Perl_Imarkstack_ptr_ptr},
436 {"Perl_Imarkstack_max_ptr", (PERL_PROC*)&Perl_Imarkstack_max_ptr},
Bram Moolenaare06c1882010-07-21 22:05:20 +0200437 {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
438 {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr},
Bram Moolenaarc236c162008-07-13 17:41:49 +0000439 {"Perl_Iscopestack_ix_ptr", (PERL_PROC*)&Perl_Iscopestack_ix_ptr},
440 {"Perl_Iunitcheckav_ptr", (PERL_PROC*)&Perl_Iunitcheckav_ptr},
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200441# endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000442#endif
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200443#if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
444#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000445 {"Perl_Idefgv_ptr", (PERL_PROC*)&Perl_Idefgv_ptr},
446 {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr},
447 {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr},
Bram Moolenaare06c1882010-07-21 22:05:20 +0200448 {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr},
Bram Moolenaar6dfff542011-09-07 18:47:23 +0200449#endif
450 {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader},
Bram Moolenaar071d4272004-06-13 20:20:40 +0000451 {"", NULL},
452};
453
454/*
455 * Make all runtime-links of perl.
456 *
457 * 1. Get module handle using LoadLibraryEx.
458 * 2. Get pointer to perl function by GetProcAddress.
459 * 3. Repeat 2, until get all functions will be used.
460 *
461 * Parameter 'libname' provides name of DLL.
462 * Return OK or FAIL.
463 */
464 static int
465perl_runtime_link_init(char *libname, int verbose)
466{
467 int i;
468
469 if (hPerlLib != NULL)
470 return OK;
Bram Moolenaare06c1882010-07-21 22:05:20 +0200471 if ((hPerlLib = load_dll(libname)) == NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000472 {
473 if (verbose)
474 EMSG2(_("E370: Could not load library %s"), libname);
475 return FAIL;
476 }
477 for (i = 0; perl_funcname_table[i].ptr; ++i)
478 {
Bram Moolenaare06c1882010-07-21 22:05:20 +0200479 if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480 perl_funcname_table[i].name)))
481 {
Bram Moolenaare06c1882010-07-21 22:05:20 +0200482 close_dll(hPerlLib);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000483 hPerlLib = NULL;
484 if (verbose)
485 EMSG2(_(e_loadfunc), perl_funcname_table[i].name);
486 return FAIL;
487 }
488 }
489 return OK;
490}
491
492/*
493 * If runtime-link-perl(DLL) was loaded successfully, return TRUE.
494 * There were no DLL loaded, return FALSE.
495 */
496 int
497perl_enabled(verbose)
498 int verbose;
499{
500 return perl_runtime_link_init(DYNAMIC_PERL_DLL, verbose) == OK;
501}
502#endif /* DYNAMIC_PERL */
503
504/*
505 * perl_init(): initialize perl interpreter
506 * We have to call perl_parse to initialize some structures,
507 * there's nothing to actually parse.
508 */
509 static void
510perl_init()
511{
Bram Moolenaarc236c162008-07-13 17:41:49 +0000512 char *bootargs[] = { "VI", NULL };
513 int argc = 3;
514 static char *argv[] = { "", "-e", "" };
Bram Moolenaar071d4272004-06-13 20:20:40 +0000515
Bram Moolenaarc236c162008-07-13 17:41:49 +0000516#if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
Bram Moolenaar4eac38f2008-12-03 12:18:55 +0000517 Perl_sys_init(&argc, (char***)&argv);
Bram Moolenaarc236c162008-07-13 17:41:49 +0000518#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000519 perl_interp = perl_alloc();
520 perl_construct(perl_interp);
Bram Moolenaarc236c162008-07-13 17:41:49 +0000521 perl_parse(perl_interp, xs_init, argc, argv, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000522 perl_call_argv("VIM::bootstrap", (long)G_DISCARD, bootargs);
523 VIM_init();
524#ifdef USE_SFIO
525 sfdisc(PerlIO_stdout(), sfdcnewvim());
526 sfdisc(PerlIO_stderr(), sfdcnewvim());
527 sfsetbuf(PerlIO_stdout(), NULL, 0);
528 sfsetbuf(PerlIO_stderr(), NULL, 0);
529#endif
530}
531
532/*
533 * perl_end(): clean up after ourselves
534 */
535 void
536perl_end()
537{
538 if (perl_interp)
539 {
540 perl_run(perl_interp);
541 perl_destruct(perl_interp);
542 perl_free(perl_interp);
543 perl_interp = NULL;
Bram Moolenaarc236c162008-07-13 17:41:49 +0000544#if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
545 Perl_sys_term();
546#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000547 }
548#ifdef DYNAMIC_PERL
549 if (hPerlLib)
550 {
Bram Moolenaare06c1882010-07-21 22:05:20 +0200551 close_dll(hPerlLib);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000552 hPerlLib = NULL;
553 }
554#endif
555}
556
557/*
558 * msg_split(): send a message to the message handling routines
559 * split at '\n' first though.
560 */
561 void
562msg_split(s, attr)
563 char_u *s;
564 int attr; /* highlighting attributes */
565{
566 char *next;
567 char *token = (char *)s;
568
Bram Moolenaaraa8494a2007-10-09 08:47:27 +0000569 while ((next = strchr(token, '\n')) && !got_int)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000570 {
571 *next++ = '\0'; /* replace \n with \0 */
572 msg_attr((char_u *)token, attr);
573 token = next;
574 }
Bram Moolenaaraa8494a2007-10-09 08:47:27 +0000575 if (*token && !got_int)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000576 msg_attr((char_u *)token, attr);
577}
578
579#ifndef FEAT_EVAL
580/*
581 * This stub is needed because an "#ifdef FEAT_EVAL" around Eval() doesn't
582 * work properly.
583 */
584 char_u *
Bram Moolenaar362e1a32006-03-06 23:29:24 +0000585eval_to_string(arg, nextcmd, dolist)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000586 char_u *arg;
587 char_u **nextcmd;
Bram Moolenaar362e1a32006-03-06 23:29:24 +0000588 int dolist;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000589{
590 return NULL;
591}
592#endif
593
594/*
595 * Create a new reference to an SV pointing to the SCR structure
Bram Moolenaare344bea2005-09-01 20:46:49 +0000596 * The b_perl_private/w_perl_private part of the SCR structure points to the
597 * SV, so there can only be one such SV for a particular SCR structure. When
598 * the last reference has gone (DESTROY is called),
599 * b_perl_private/w_perl_private is reset; When the screen goes away before
Bram Moolenaar071d4272004-06-13 20:20:40 +0000600 * all references are gone, the value of the SV is reset;
601 * any subsequent use of any of those reference will produce
602 * a warning. (see typemap)
603 */
Bram Moolenaare344bea2005-09-01 20:46:49 +0000604
605 static SV *
606newWINrv(rv, ptr)
607 SV *rv;
608 win_T *ptr;
609{
610 sv_upgrade(rv, SVt_RV);
611 if (ptr->w_perl_private == NULL)
612 {
613 ptr->w_perl_private = newSV(0);
614 sv_setiv(ptr->w_perl_private, (IV)ptr);
615 }
616 else
617 SvREFCNT_inc(ptr->w_perl_private);
618 SvRV(rv) = ptr->w_perl_private;
619 SvROK_on(rv);
620 return sv_bless(rv, gv_stashpv("VIWIN", TRUE));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000621}
622
Bram Moolenaare344bea2005-09-01 20:46:49 +0000623 static SV *
624newBUFrv(rv, ptr)
625 SV *rv;
626 buf_T *ptr;
627{
628 sv_upgrade(rv, SVt_RV);
629 if (ptr->b_perl_private == NULL)
630 {
631 ptr->b_perl_private = newSV(0);
632 sv_setiv(ptr->b_perl_private, (IV)ptr);
633 }
634 else
635 SvREFCNT_inc(ptr->b_perl_private);
636 SvRV(rv) = ptr->b_perl_private;
637 SvROK_on(rv);
638 return sv_bless(rv, gv_stashpv("VIBUF", TRUE));
639}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000640
641/*
642 * perl_win_free
643 * Remove all refences to the window to be destroyed
644 */
645 void
646perl_win_free(wp)
647 win_T *wp;
648{
Bram Moolenaare344bea2005-09-01 20:46:49 +0000649 if (wp->w_perl_private)
650 sv_setiv((SV *)wp->w_perl_private, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000651 return;
652}
653
654 void
655perl_buf_free(bp)
656 buf_T *bp;
657{
Bram Moolenaare344bea2005-09-01 20:46:49 +0000658 if (bp->b_perl_private)
659 sv_setiv((SV *)bp->b_perl_private, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000660 return;
661}
662
663#ifndef PROTO
664# if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
665I32 cur_val(pTHX_ IV iv, SV *sv);
666# else
667I32 cur_val(IV iv, SV *sv);
668#endif
669
670/*
671 * Handler for the magic variables $main::curwin and $main::curbuf.
672 * The handler is put into the magic vtbl for these variables.
673 * (This is effectively a C-level equivalent of a tied variable).
674 * There is no "set" function as the variables are read-only.
675 */
676# if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
677I32 cur_val(pTHX_ IV iv, SV *sv)
678# else
679I32 cur_val(IV iv, SV *sv)
680# endif
681{
682 SV *rv;
683 if (iv == 0)
684 rv = newWINrv(newSV(0), curwin);
685 else
686 rv = newBUFrv(newSV(0), curbuf);
687 sv_setsv(sv, rv);
688 return 0;
689}
690#endif /* !PROTO */
691
692struct ufuncs cw_funcs = { cur_val, 0, 0 };
693struct ufuncs cb_funcs = { cur_val, 0, 1 };
694
695/*
696 * VIM_init(): Vim-specific initialisation.
697 * Make the magical main::curwin and main::curbuf variables
698 */
699 static void
700VIM_init()
701{
702 static char cw[] = "main::curwin";
703 static char cb[] = "main::curbuf";
704 SV *sv;
705
706 sv = perl_get_sv(cw, TRUE);
707 sv_magic(sv, NULL, 'U', (char *)&cw_funcs, sizeof(cw_funcs));
708 SvREADONLY_on(sv);
709
710 sv = perl_get_sv(cb, TRUE);
711 sv_magic(sv, NULL, 'U', (char *)&cb_funcs, sizeof(cb_funcs));
712 SvREADONLY_on(sv);
713
714 /*
715 * Setup the Safe compartment.
716 * It shouldn't be a fatal error if the Safe module is missing.
717 * XXX: Only shares the 'Msg' routine (which has to be called
718 * like 'Msg(...)').
719 */
720 (void)perl_eval_pv( "if ( eval( 'require Safe' ) ) { $VIM::safe = Safe->new(); $VIM::safe->share_from( 'VIM', ['Msg'] ); }", G_DISCARD | G_VOID );
721
722}
723
724#ifdef DYNAMIC_PERL
725static char *e_noperl = N_("Sorry, this command is disabled: the Perl library could not be loaded.");
726#endif
727
728/*
729 * ":perl"
730 */
731 void
732ex_perl(eap)
733 exarg_T *eap;
734{
735 char *err;
736 char *script;
737 STRLEN length;
738 SV *sv;
Bram Moolenaar9d6650f2010-06-06 23:04:47 +0200739#ifdef HAVE_SANDBOX
Bram Moolenaar071d4272004-06-13 20:20:40 +0000740 SV *safe;
Bram Moolenaar9d6650f2010-06-06 23:04:47 +0200741#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000742
743 script = (char *)script_get(eap, eap->arg);
744 if (eap->skip)
745 {
746 vim_free(script);
747 return;
748 }
749
750 if (perl_interp == NULL)
751 {
752#ifdef DYNAMIC_PERL
753 if (!perl_enabled(TRUE))
754 {
755 EMSG(_(e_noperl));
756 vim_free(script);
757 return;
758 }
759#endif
760 perl_init();
761 }
762
763 {
764 dSP;
765 ENTER;
766 SAVETMPS;
767
768 if (script == NULL)
769 sv = newSVpv((char *)eap->arg, 0);
770 else
771 {
772 sv = newSVpv(script, 0);
773 vim_free(script);
774 }
775
776#ifdef HAVE_SANDBOX
777 if (sandbox)
778 {
Bram Moolenaara1711622011-07-27 14:15:46 +0200779 safe = perl_get_sv("VIM::safe", FALSE);
Bram Moolenaar3f947ea2009-07-14 14:04:54 +0000780# ifndef MAKE_TEST /* avoid a warning for unreachable code */
Bram Moolenaar954e8c52009-11-11 13:45:33 +0000781 if (safe == NULL || !SvTRUE(safe))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000782 EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module"));
783 else
Bram Moolenaar3f947ea2009-07-14 14:04:54 +0000784# endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000785 {
786 PUSHMARK(SP);
787 XPUSHs(safe);
788 XPUSHs(sv);
789 PUTBACK;
790 perl_call_method("reval", G_DISCARD);
791 }
792 }
793 else
794#endif
795 perl_eval_sv(sv, G_DISCARD | G_NOARGS);
796
797 SvREFCNT_dec(sv);
798
799 err = SvPV(GvSV(PL_errgv), length);
800
801 FREETMPS;
802 LEAVE;
803
804 if (!length)
805 return;
806
807 msg_split((char_u *)err, highlight_attr[HLF_E]);
808 return;
809 }
810}
811
812 static int
813replace_line(line, end)
814 linenr_T *line, *end;
815{
816 char *str;
817
818 if (SvOK(GvSV(PL_defgv)))
819 {
820 str = SvPV(GvSV(PL_defgv), PL_na);
821 ml_replace(*line, (char_u *)str, 1);
822 changed_bytes(*line, 0);
823 }
824 else
825 {
826 ml_delete(*line, FALSE);
827 deleted_lines_mark(*line, 1L);
828 --(*end);
829 --(*line);
830 }
831 return OK;
832}
833
834/*
835 * ":perldo".
836 */
837 void
838ex_perldo(eap)
839 exarg_T *eap;
840{
841 STRLEN length;
842 SV *sv;
843 char *str;
844 linenr_T i;
845
846 if (bufempty())
847 return;
848
849 if (perl_interp == NULL)
850 {
851#ifdef DYNAMIC_PERL
852 if (!perl_enabled(TRUE))
853 {
854 EMSG(_(e_noperl));
855 return;
856 }
857#endif
858 perl_init();
859 }
860 {
861 dSP;
862 length = strlen((char *)eap->arg);
Bram Moolenaar9d75c832005-01-25 21:57:23 +0000863 sv = newSV(length + sizeof("sub VIM::perldo {") - 1 + 1);
864 sv_setpvn(sv, "sub VIM::perldo {", sizeof("sub VIM::perldo {") - 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000865 sv_catpvn(sv, (char *)eap->arg, length);
866 sv_catpvn(sv, "}", 1);
867 perl_eval_sv(sv, G_DISCARD | G_NOARGS);
868 SvREFCNT_dec(sv);
869 str = SvPV(GvSV(PL_errgv), length);
870 if (length)
871 goto err;
872
873 if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
874 return;
875
876 ENTER;
877 SAVETMPS;
878 for (i = eap->line1; i <= eap->line2; i++)
879 {
Bram Moolenaar9d75c832005-01-25 21:57:23 +0000880 sv_setpv(GvSV(PL_defgv), (char *)ml_get(i));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000881 PUSHMARK(sp);
882 perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL);
883 str = SvPV(GvSV(PL_errgv), length);
884 if (length)
885 break;
886 SPAGAIN;
887 if (SvTRUEx(POPs))
888 {
889 if (replace_line(&i, &eap->line2) != OK)
890 {
891 PUTBACK;
892 break;
893 }
894 }
895 PUTBACK;
896 }
897 FREETMPS;
898 LEAVE;
899 check_cursor();
900 update_screen(NOT_VALID);
901 if (!length)
902 return;
903
904err:
905 msg_split((char_u *)str, highlight_attr[HLF_E]);
906 return;
907 }
908}
909
Bram Moolenaar01dd60c2008-07-24 14:24:48 +0000910#ifndef FEAT_WINDOWS
911int win_valid(win_T *w) { return TRUE; }
912int win_count() { return 1; }
913win_T *win_find_nr(int n) { return curwin; }
914#endif
915
Bram Moolenaar071d4272004-06-13 20:20:40 +0000916XS(XS_VIM_Msg);
917XS(XS_VIM_SetOption);
918XS(XS_VIM_DoCommand);
919XS(XS_VIM_Eval);
920XS(XS_VIM_Buffers);
921XS(XS_VIM_Windows);
922XS(XS_VIWIN_DESTROY);
923XS(XS_VIWIN_Buffer);
924XS(XS_VIWIN_SetHeight);
925XS(XS_VIWIN_Cursor);
926XS(XS_VIBUF_DESTROY);
927XS(XS_VIBUF_Name);
928XS(XS_VIBUF_Number);
929XS(XS_VIBUF_Count);
930XS(XS_VIBUF_Get);
931XS(XS_VIBUF_Set);
932XS(XS_VIBUF_Delete);
933XS(XS_VIBUF_Append);
934XS(boot_VIM);
935
936 static void
937xs_init(pTHX)
938{
939 char *file = __FILE__;
940
941 /* DynaLoader is a special case */
942 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
943 newXS("VIM::bootstrap", boot_VIM, file);
944}
945
946typedef win_T * VIWIN;
947typedef buf_T * VIBUF;
948
949MODULE = VIM PACKAGE = VIM
950
951void
952Msg(text, hl=NULL)
953 char *text;
954 char *hl;
955
956 PREINIT:
957 int attr;
958 int id;
959
960 PPCODE:
961 if (text != NULL)
962 {
963 attr = 0;
964 if (hl != NULL)
965 {
966 id = syn_name2id((char_u *)hl);
967 if (id != 0)
968 attr = syn_id2attr(id);
969 }
970 msg_split((char_u *)text, attr);
971 }
972
973void
974SetOption(line)
975 char *line;
976
977 PPCODE:
978 if (line != NULL)
979 do_set((char_u *)line, 0);
980 update_screen(NOT_VALID);
981
982void
983DoCommand(line)
984 char *line;
985
986 PPCODE:
987 if (line != NULL)
988 do_cmdline_cmd((char_u *)line);
989
990void
991Eval(str)
992 char *str;
993
994 PREINIT:
995 char_u *value;
996 PPCODE:
Bram Moolenaar362e1a32006-03-06 23:29:24 +0000997 value = eval_to_string((char_u *)str, (char_u **)0, TRUE);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000998 if (value == NULL)
999 {
1000 XPUSHs(sv_2mortal(newSViv(0)));
1001 XPUSHs(sv_2mortal(newSVpv("", 0)));
1002 }
1003 else
1004 {
1005 XPUSHs(sv_2mortal(newSViv(1)));
1006 XPUSHs(sv_2mortal(newSVpv((char *)value, 0)));
1007 vim_free(value);
1008 }
1009
1010void
1011Buffers(...)
1012
1013 PREINIT:
1014 buf_T *vimbuf;
1015 int i, b;
1016
1017 PPCODE:
1018 if (items == 0)
1019 {
1020 if (GIMME == G_SCALAR)
1021 {
1022 i = 0;
1023 for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next)
1024 ++i;
1025
1026 XPUSHs(sv_2mortal(newSViv(i)));
1027 }
1028 else
1029 {
1030 for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next)
1031 XPUSHs(newBUFrv(newSV(0), vimbuf));
1032 }
1033 }
1034 else
1035 {
1036 for (i = 0; i < items; i++)
1037 {
1038 SV *sv = ST(i);
1039 if (SvIOK(sv))
1040 b = SvIV(ST(i));
1041 else
1042 {
1043 char_u *pat;
1044 STRLEN len;
1045
1046 pat = (char_u *)SvPV(sv, len);
1047 ++emsg_off;
1048 b = buflist_findpat(pat, pat+len, FALSE, FALSE);
1049 --emsg_off;
1050 }
1051
1052 if (b >= 0)
1053 {
1054 vimbuf = buflist_findnr(b);
1055 if (vimbuf)
1056 XPUSHs(newBUFrv(newSV(0), vimbuf));
1057 }
1058 }
1059 }
1060
1061void
1062Windows(...)
1063
1064 PREINIT:
1065 win_T *vimwin;
1066 int i, w;
1067
1068 PPCODE:
1069 if (items == 0)
1070 {
1071 if (GIMME == G_SCALAR)
1072 XPUSHs(sv_2mortal(newSViv(win_count())));
1073 else
1074 {
1075 for (vimwin = firstwin; vimwin != NULL; vimwin = W_NEXT(vimwin))
1076 XPUSHs(newWINrv(newSV(0), vimwin));
1077 }
1078 }
1079 else
1080 {
1081 for (i = 0; i < items; i++)
1082 {
1083 w = SvIV(ST(i));
1084 vimwin = win_find_nr(w);
1085 if (vimwin)
1086 XPUSHs(newWINrv(newSV(0), vimwin));
1087 }
1088 }
1089
1090MODULE = VIM PACKAGE = VIWIN
1091
1092void
1093DESTROY(win)
1094 VIWIN win
1095
1096 CODE:
1097 if (win_valid(win))
Bram Moolenaare344bea2005-09-01 20:46:49 +00001098 win->w_perl_private = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001099
1100SV *
1101Buffer(win)
1102 VIWIN win
1103
1104 CODE:
1105 if (!win_valid(win))
1106 win = curwin;
1107 RETVAL = newBUFrv(newSV(0), win->w_buffer);
1108 OUTPUT:
1109 RETVAL
1110
1111void
1112SetHeight(win, height)
1113 VIWIN win
1114 int height;
1115
1116 PREINIT:
1117 win_T *savewin;
1118
1119 PPCODE:
1120 if (!win_valid(win))
1121 win = curwin;
1122 savewin = curwin;
1123 curwin = win;
1124 win_setheight(height);
1125 curwin = savewin;
1126
1127void
1128Cursor(win, ...)
1129 VIWIN win
1130
1131 PPCODE:
Bram Moolenaara1711622011-07-27 14:15:46 +02001132 if (items == 1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001133 {
1134 EXTEND(sp, 2);
1135 if (!win_valid(win))
1136 win = curwin;
1137 PUSHs(sv_2mortal(newSViv(win->w_cursor.lnum)));
1138 PUSHs(sv_2mortal(newSViv(win->w_cursor.col)));
1139 }
Bram Moolenaara1711622011-07-27 14:15:46 +02001140 else if (items == 3)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001141 {
1142 int lnum, col;
1143
1144 if (!win_valid(win))
1145 win = curwin;
1146 lnum = SvIV(ST(1));
1147 col = SvIV(ST(2));
1148 win->w_cursor.lnum = lnum;
1149 win->w_cursor.col = col;
1150 check_cursor(); /* put cursor on an existing line */
1151 update_screen(NOT_VALID);
1152 }
1153
1154MODULE = VIM PACKAGE = VIBUF
1155
1156void
1157DESTROY(vimbuf)
1158 VIBUF vimbuf;
1159
1160 CODE:
1161 if (buf_valid(vimbuf))
Bram Moolenaare344bea2005-09-01 20:46:49 +00001162 vimbuf->b_perl_private = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001163
1164void
1165Name(vimbuf)
1166 VIBUF vimbuf;
1167
1168 PPCODE:
1169 if (!buf_valid(vimbuf))
1170 vimbuf = curbuf;
1171 /* No file name returns an empty string */
1172 if (vimbuf->b_fname == NULL)
1173 XPUSHs(sv_2mortal(newSVpv("", 0)));
1174 else
1175 XPUSHs(sv_2mortal(newSVpv((char *)vimbuf->b_fname, 0)));
1176
1177void
1178Number(vimbuf)
1179 VIBUF vimbuf;
1180
1181 PPCODE:
1182 if (!buf_valid(vimbuf))
1183 vimbuf = curbuf;
1184 XPUSHs(sv_2mortal(newSViv(vimbuf->b_fnum)));
1185
1186void
1187Count(vimbuf)
1188 VIBUF vimbuf;
1189
1190 PPCODE:
1191 if (!buf_valid(vimbuf))
1192 vimbuf = curbuf;
1193 XPUSHs(sv_2mortal(newSViv(vimbuf->b_ml.ml_line_count)));
1194
1195void
1196Get(vimbuf, ...)
1197 VIBUF vimbuf;
1198
1199 PREINIT:
1200 char_u *line;
1201 int i;
1202 long lnum;
1203 PPCODE:
1204 if (buf_valid(vimbuf))
1205 {
1206 for (i = 1; i < items; i++)
1207 {
1208 lnum = SvIV(ST(i));
1209 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
1210 {
1211 line = ml_get_buf(vimbuf, lnum, FALSE);
1212 XPUSHs(sv_2mortal(newSVpv((char *)line, 0)));
1213 }
1214 }
1215 }
1216
1217void
1218Set(vimbuf, ...)
1219 VIBUF vimbuf;
1220
1221 PREINIT:
1222 int i;
1223 long lnum;
1224 char *line;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001225 PPCODE:
1226 if (buf_valid(vimbuf))
1227 {
1228 if (items < 3)
1229 croak("Usage: VIBUF::Set(vimbuf, lnum, @lines)");
1230
1231 lnum = SvIV(ST(1));
1232 for(i = 2; i < items; i++, lnum++)
1233 {
1234 line = SvPV(ST(i),PL_na);
1235 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
1236 {
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001237 aco_save_T aco;
1238
1239 /* set curwin/curbuf for "vimbuf" and save some things */
1240 aucmd_prepbuf(&aco, vimbuf);
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001241
Bram Moolenaar071d4272004-06-13 20:20:40 +00001242 if (u_savesub(lnum) == OK)
1243 {
1244 ml_replace(lnum, (char_u *)line, TRUE);
1245 changed_bytes(lnum, 0);
1246 }
Bram Moolenaarf30e74c2006-08-16 17:35:00 +00001247
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001248 /* restore curwin/curbuf and a few other things */
1249 aucmd_restbuf(&aco);
1250 /* Careful: autocommands may have made "vimbuf" invalid! */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001251 }
1252 }
1253 }
1254
1255void
1256Delete(vimbuf, ...)
1257 VIBUF vimbuf;
1258
1259 PREINIT:
1260 long i, lnum = 0, count = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001261 PPCODE:
1262 if (buf_valid(vimbuf))
1263 {
1264 if (items == 2)
1265 {
1266 lnum = SvIV(ST(1));
1267 count = 1;
1268 }
1269 else if (items == 3)
1270 {
1271 lnum = SvIV(ST(1));
1272 count = 1 + SvIV(ST(2)) - lnum;
Bram Moolenaara1711622011-07-27 14:15:46 +02001273 if (count == 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001274 count = 1;
Bram Moolenaara1711622011-07-27 14:15:46 +02001275 if (count < 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001276 {
1277 lnum -= count;
1278 count = -count;
1279 }
1280 }
1281 if (items >= 2)
1282 {
1283 for (i = 0; i < count; i++)
1284 {
1285 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
1286 {
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001287 aco_save_T aco;
1288
1289 /* set curwin/curbuf for "vimbuf" and save some things */
1290 aucmd_prepbuf(&aco, vimbuf);
Bram Moolenaarf30e74c2006-08-16 17:35:00 +00001291
Bram Moolenaar071d4272004-06-13 20:20:40 +00001292 if (u_savedel(lnum, 1) == OK)
1293 {
1294 ml_delete(lnum, 0);
Bram Moolenaarcdcaa582009-07-09 18:06:49 +00001295 check_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001296 deleted_lines_mark(lnum, 1L);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001297 }
Bram Moolenaarf30e74c2006-08-16 17:35:00 +00001298
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001299 /* restore curwin/curbuf and a few other things */
1300 aucmd_restbuf(&aco);
1301 /* Careful: autocommands may have made "vimbuf" invalid! */
Bram Moolenaarf30e74c2006-08-16 17:35:00 +00001302
Bram Moolenaar071d4272004-06-13 20:20:40 +00001303 update_curbuf(VALID);
1304 }
1305 }
1306 }
1307 }
1308
1309void
1310Append(vimbuf, ...)
1311 VIBUF vimbuf;
1312
1313 PREINIT:
1314 int i;
1315 long lnum;
1316 char *line;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001317 PPCODE:
1318 if (buf_valid(vimbuf))
1319 {
1320 if (items < 3)
1321 croak("Usage: VIBUF::Append(vimbuf, lnum, @lines)");
1322
1323 lnum = SvIV(ST(1));
1324 for (i = 2; i < items; i++, lnum++)
1325 {
1326 line = SvPV(ST(i),PL_na);
1327 if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
1328 {
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001329 aco_save_T aco;
1330
1331 /* set curwin/curbuf for "vimbuf" and save some things */
1332 aucmd_prepbuf(&aco, vimbuf);
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001333
Bram Moolenaar071d4272004-06-13 20:20:40 +00001334 if (u_inssub(lnum + 1) == OK)
1335 {
1336 ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE);
1337 appended_lines_mark(lnum, 1L);
1338 }
Bram Moolenaarf30e74c2006-08-16 17:35:00 +00001339
Bram Moolenaar334a3bf2006-08-08 14:45:44 +00001340 /* restore curwin/curbuf and a few other things */
1341 aucmd_restbuf(&aco);
1342 /* Careful: autocommands may have made "vimbuf" invalid! */
Bram Moolenaarf30e74c2006-08-16 17:35:00 +00001343
Bram Moolenaar071d4272004-06-13 20:20:40 +00001344 update_curbuf(VALID);
1345 }
1346 }
1347 }
1348