Mercurial > vim
annotate src/if_perl.xs @ 7372:6b057079a836 v7.4.991
commit https://github.com/vim/vim/commit/096c8bb40d51b22a4b1d761baf7bb79fb9e55a28
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Dec 29 14:26:57 2015 +0100
patch 7.4.991
Problem: When running new style tests the output is not visible.
Solution: Add the testdir/messages file and show it. Update the list of
test names.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 29 Dec 2015 14:30:04 +0100 |
parents | b58e16f9119e |
children | 53163e4d9e4f |
rev | line source |
---|---|
7 | 1 /* 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 | |
5261
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
16 /* |
5537 | 17 * Currently 32-bit version of ActivePerl is built with VC6 (or MinGW since |
18 * ActivePerl 5.18). | |
5261
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
19 * (http://community.activestate.com/faq/windows-compilers-perl-modules) |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
20 * It means that time_t should be 32-bit. However the default size of |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
21 * time_t is 64-bit since VC8. So we have to define _USE_32BIT_TIME_T. |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
22 */ |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
23 #if defined(WIN32) && !defined(_WIN64) |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
24 # define _USE_32BIT_TIME_T |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
25 #endif |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
26 |
5537 | 27 /* |
28 * Prevent including winsock.h. perl.h tries to detect whether winsock.h is | |
29 * already included before including winsock2.h, because winsock2.h isn't | |
30 * compatible with winsock.h. However the detection doesn't work with some | |
31 * versions of MinGW. If WIN32_LEAN_AND_MEAN is defined, windows.h will not | |
32 * include winsock.h. | |
33 */ | |
34 #ifdef WIN32 | |
35 # define WIN32_LEAN_AND_MEAN | |
36 #endif | |
37 | |
7 | 38 #include "vim.h" |
39 | |
5558 | 40 /* Work around for perl-5.18. |
41 * Don't include "perl\lib\CORE\inline.h" for now, | |
42 * include it after Perl_sv_free2 is defined. */ | |
43 #ifdef DYNAMIC_PERL | |
44 # define PERL_NO_INLINE_FUNCTIONS | |
45 #endif | |
46 | |
5560 | 47 /* Work around for using MSVC and ActivePerl 5.18. */ |
48 #ifdef _MSC_VER | |
49 # define __inline__ __inline | |
50 #endif | |
51 | |
5261
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
52 #include <EXTERN.h> |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
53 #include <perl.h> |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
54 #include <XSUB.h> |
b882d4b14e00
updated for version 7.4b.007
Bram Moolenaar <bram@vim.org>
parents:
4905
diff
changeset
|
55 |
7 | 56 |
57 /* | |
58 * Work around clashes between Perl and Vim namespace. proto.h doesn't | |
59 * include if_perl.pro and perlsfio.pro when IN_PERL_FILE is defined, because | |
60 * we need the CV typedef. proto.h can't be moved to after including | |
61 * if_perl.h, because we get all sorts of name clashes then. | |
62 */ | |
63 #ifndef PROTO | |
64 #ifndef __MINGW32__ | |
65 # include "proto/if_perl.pro" | |
66 # include "proto/if_perlsfio.pro" | |
67 #endif | |
68 #endif | |
69 | |
70 /* Perl compatibility stuff. This should ensure compatibility with older | |
71 * versions of Perl. | |
72 */ | |
73 | |
74 #ifndef PERL_VERSION | |
75 # include <patchlevel.h> | |
76 # define PERL_REVISION 5 | |
77 # define PERL_VERSION PATCHLEVEL | |
78 # define PERL_SUBVERSION SUBVERSION | |
79 #endif | |
80 | |
1387 | 81 /* |
82 * Quoting Jan Dubois of Active State: | |
83 * ActivePerl build 822 still identifies itself as 5.8.8 but already | |
84 * contains many of the changes from the upcoming Perl 5.8.9 release. | |
85 * | |
86 * The changes include addition of two symbols (Perl_sv_2iv_flags, | |
87 * Perl_newXS_flags) not present in earlier releases. | |
88 * | |
1395 | 89 * Jan Dubois suggested the following guarding scheme. |
90 * | |
91 * Active State defined ACTIVEPERL_VERSION as a string in versions before | |
92 * 5.8.8; and so the comparison to 822 below needs to be guarded. | |
1387 | 93 */ |
1395 | 94 #if (PERL_REVISION == 5) && (PERL_VERSION == 8) && (PERL_SUBVERSION >= 8) |
95 # if (ACTIVEPERL_VERSION >= 822) || (PERL_SUBVERSION >= 9) | |
96 # define PERL589_OR_LATER | |
97 # endif | |
1387 | 98 #endif |
99 #if (PERL_REVISION == 5) && (PERL_VERSION >= 9) | |
100 # define PERL589_OR_LATER | |
101 #endif | |
102 | |
2096
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
103 #if (PERL_REVISION == 5) && ((PERL_VERSION > 10) || \ |
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
104 (PERL_VERSION == 10) && (PERL_SUBVERSION >= 1)) |
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
105 # define PERL5101_OR_LATER |
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
106 #endif |
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
107 |
7 | 108 #ifndef pTHX |
109 # define pTHX void | |
110 # define pTHX_ | |
111 #endif | |
112 | |
113 #ifndef EXTERN_C | |
114 # define EXTERN_C | |
115 #endif | |
116 | |
3728 | 117 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) && defined(_MSC_VER) |
118 /* Using PL_errgv to get the error message after perl_eval_sv() causes a crash | |
119 * with MSVC and Perl version 5.14. */ | |
120 # define AVOID_PL_ERRGV | |
121 #endif | |
122 | |
7 | 123 /* Compatibility hacks over */ |
124 | |
125 static PerlInterpreter *perl_interp = NULL; | |
126 static void xs_init __ARGS((pTHX)); | |
127 static void VIM_init __ARGS((void)); | |
128 EXTERN_C void boot_DynaLoader __ARGS((pTHX_ CV*)); | |
129 | |
130 /* | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
131 * For dynamic linked perl. |
7 | 132 */ |
133 #if defined(DYNAMIC_PERL) || defined(PROTO) | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
134 |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
135 #ifndef DYNAMIC_PERL /* just generating prototypes */ |
2372
a42d19b78c93
Fix building with Perl on Windows with MingW. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2370
diff
changeset
|
136 #ifdef WIN3264 |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
137 typedef int HANDLE; |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
138 #endif |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
139 typedef int XSINIT_t; |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
140 typedef int XSUBADDR_t; |
5706 | 141 #endif |
142 #ifndef USE_ITHREADS | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
143 typedef int perl_key; |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
144 #endif |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
145 |
2372
a42d19b78c93
Fix building with Perl on Windows with MingW. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2370
diff
changeset
|
146 #ifndef WIN3264 |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
147 #include <dlfcn.h> |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
148 #define HANDLE void* |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
149 #define PERL_PROC void* |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
150 #define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL) |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
151 #define symbol_from_dll dlsym |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
152 #define close_dll dlclose |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
153 #else |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
154 #define PERL_PROC FARPROC |
2612 | 155 #define load_dll vimLoadLib |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
156 #define symbol_from_dll GetProcAddress |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
157 #define close_dll FreeLibrary |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
158 #endif |
7 | 159 /* |
160 * Wrapper defines | |
161 */ | |
162 # define perl_alloc dll_perl_alloc | |
163 # define perl_construct dll_perl_construct | |
164 # define perl_parse dll_perl_parse | |
165 # define perl_run dll_perl_run | |
166 # define perl_destruct dll_perl_destruct | |
167 # define perl_free dll_perl_free | |
168 # define Perl_get_context dll_Perl_get_context | |
169 # define Perl_croak dll_Perl_croak | |
2096
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
170 # ifdef PERL5101_OR_LATER |
2079
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
171 # define Perl_croak_xs_usage dll_Perl_croak_xs_usage |
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
172 # endif |
7 | 173 # ifndef PROTO |
174 # define Perl_croak_nocontext dll_Perl_croak_nocontext | |
175 # define Perl_call_argv dll_Perl_call_argv | |
176 # define Perl_call_pv dll_Perl_call_pv | |
177 # define Perl_eval_sv dll_Perl_eval_sv | |
178 # define Perl_get_sv dll_Perl_get_sv | |
179 # define Perl_eval_pv dll_Perl_eval_pv | |
180 # define Perl_call_method dll_Perl_call_method | |
181 # endif | |
182 # define Perl_dowantarray dll_Perl_dowantarray | |
183 # define Perl_free_tmps dll_Perl_free_tmps | |
184 # define Perl_gv_stashpv dll_Perl_gv_stashpv | |
185 # define Perl_markstack_grow dll_Perl_markstack_grow | |
186 # define Perl_mg_find dll_Perl_mg_find | |
187 # define Perl_newXS dll_Perl_newXS | |
188 # define Perl_newSV dll_Perl_newSV | |
189 # define Perl_newSViv dll_Perl_newSViv | |
190 # define Perl_newSVpv dll_Perl_newSVpv | |
191 # define Perl_pop_scope dll_Perl_pop_scope | |
192 # define Perl_push_scope dll_Perl_push_scope | |
193 # define Perl_save_int dll_Perl_save_int | |
5960 | 194 # if (PERL_REVISION == 5) && (PERL_VERSION >= 20) |
195 # define Perl_save_strlen dll_Perl_save_strlen | |
196 # endif | |
7 | 197 # define Perl_stack_grow dll_Perl_stack_grow |
198 # define Perl_set_context dll_Perl_set_context | |
3050 | 199 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
6872 | 200 # define Perl_sv_2bool_flags dll_Perl_sv_2bool_flags |
201 # if (PERL_REVISION == 5) && (PERL_VERSION < 22) | |
202 # define Perl_xs_apiversion_bootcheck dll_Perl_xs_apiversion_bootcheck | |
203 # endif | |
3050 | 204 # else |
6872 | 205 # define Perl_sv_2bool dll_Perl_sv_2bool |
3050 | 206 # endif |
7 | 207 # define Perl_sv_2iv dll_Perl_sv_2iv |
208 # define Perl_sv_2mortal dll_Perl_sv_2mortal | |
209 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
210 # define Perl_sv_2pv_flags dll_Perl_sv_2pv_flags | |
211 # define Perl_sv_2pv_nolen dll_Perl_sv_2pv_nolen | |
212 # else | |
213 # define Perl_sv_2pv dll_Perl_sv_2pv | |
214 # endif | |
215 # define Perl_sv_bless dll_Perl_sv_bless | |
216 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
217 # define Perl_sv_catpvn_flags dll_Perl_sv_catpvn_flags | |
218 # else | |
219 # define Perl_sv_catpvn dll_Perl_sv_catpvn | |
220 # endif | |
1387 | 221 #ifdef PERL589_OR_LATER |
222 # define Perl_sv_2iv_flags dll_Perl_sv_2iv_flags | |
223 # define Perl_newXS_flags dll_Perl_newXS_flags | |
224 #endif | |
7 | 225 # define Perl_sv_free dll_Perl_sv_free |
1711 | 226 # if (PERL_REVISION == 5) && (PERL_VERSION >= 10) |
227 # define Perl_sv_free2 dll_Perl_sv_free2 | |
228 # endif | |
7 | 229 # define Perl_sv_isa dll_Perl_sv_isa |
230 # define Perl_sv_magic dll_Perl_sv_magic | |
231 # define Perl_sv_setiv dll_Perl_sv_setiv | |
232 # define Perl_sv_setpv dll_Perl_sv_setpv | |
233 # define Perl_sv_setpvn dll_Perl_sv_setpvn | |
234 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
235 # define Perl_sv_setsv_flags dll_Perl_sv_setsv_flags | |
236 # else | |
237 # define Perl_sv_setsv dll_Perl_sv_setsv | |
238 # endif | |
239 # define Perl_sv_upgrade dll_Perl_sv_upgrade | |
240 # define Perl_Tstack_sp_ptr dll_Perl_Tstack_sp_ptr | |
241 # define Perl_Top_ptr dll_Perl_Top_ptr | |
242 # define Perl_Tstack_base_ptr dll_Perl_Tstack_base_ptr | |
243 # define Perl_Tstack_max_ptr dll_Perl_Tstack_max_ptr | |
244 # define Perl_Ttmps_ix_ptr dll_Perl_Ttmps_ix_ptr | |
245 # define Perl_Ttmps_floor_ptr dll_Perl_Ttmps_floor_ptr | |
246 # define Perl_Tmarkstack_ptr_ptr dll_Perl_Tmarkstack_ptr_ptr | |
247 # define Perl_Tmarkstack_max_ptr dll_Perl_Tmarkstack_max_ptr | |
248 # define Perl_TSv_ptr dll_Perl_TSv_ptr | |
249 # define Perl_TXpv_ptr dll_Perl_TXpv_ptr | |
250 # define Perl_Tna_ptr dll_Perl_Tna_ptr | |
251 # define Perl_Idefgv_ptr dll_Perl_Idefgv_ptr | |
252 # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr | |
253 # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr | |
254 # define boot_DynaLoader dll_boot_DynaLoader | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
255 # define Perl_Gthr_key_ptr dll_Perl_Gthr_key_ptr |
7 | 256 |
1765 | 257 # define Perl_sys_init dll_Perl_sys_init |
1668 | 258 # define Perl_sys_term dll_Perl_sys_term |
259 # define Perl_ISv_ptr dll_Perl_ISv_ptr | |
260 # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr | |
261 # define Perl_Istack_base_ptr dll_Perl_Istack_base_ptr | |
262 # define Perl_Itmps_ix_ptr dll_Perl_Itmps_ix_ptr | |
263 # define Perl_Itmps_floor_ptr dll_Perl_Itmps_floor_ptr | |
264 # define Perl_IXpv_ptr dll_Perl_IXpv_ptr | |
265 # define Perl_Ina_ptr dll_Perl_Ina_ptr | |
266 # define Perl_Imarkstack_ptr_ptr dll_Perl_Imarkstack_ptr_ptr | |
267 # define Perl_Imarkstack_max_ptr dll_Perl_Imarkstack_max_ptr | |
268 # define Perl_Istack_sp_ptr dll_Perl_Istack_sp_ptr | |
269 # define Perl_Iop_ptr dll_Perl_Iop_ptr | |
270 # define Perl_call_list dll_Perl_call_list | |
271 # define Perl_Iscopestack_ix_ptr dll_Perl_Iscopestack_ix_ptr | |
272 # define Perl_Iunitcheckav_ptr dll_Perl_Iunitcheckav_ptr | |
6872 | 273 # if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
274 # define Perl_xs_handshake dll_Perl_xs_handshake | |
275 # define Perl_xs_boot_epilog dll_Perl_xs_boot_epilog | |
276 # endif | |
3820 | 277 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
5706 | 278 # ifdef USE_ITHREADS |
279 # define PL_thr_key *dll_PL_thr_key | |
280 # endif | |
3820 | 281 # endif |
1668 | 282 |
7 | 283 /* |
284 * Declare HANDLE for perl.dll and function pointers. | |
285 */ | |
286 static HANDLE hPerlLib = NULL; | |
287 | |
288 static PerlInterpreter* (*perl_alloc)(); | |
289 static void (*perl_construct)(PerlInterpreter*); | |
290 static void (*perl_destruct)(PerlInterpreter*); | |
291 static void (*perl_free)(PerlInterpreter*); | |
292 static int (*perl_run)(PerlInterpreter*); | |
293 static int (*perl_parse)(PerlInterpreter*, XSINIT_t, int, char**, char**); | |
294 static void* (*Perl_get_context)(void); | |
933 | 295 static void (*Perl_croak)(pTHX_ const char*, ...); |
2096
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
296 #ifdef PERL5101_OR_LATER |
5537 | 297 /* Perl-5.18 has a different Perl_croak_xs_usage signature. */ |
298 # if (PERL_REVISION == 5) && (PERL_VERSION >= 18) | |
299 static void (*Perl_croak_xs_usage)(const CV *const, const char *const params); | |
300 # else | |
2079
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
301 static void (*Perl_croak_xs_usage)(pTHX_ const CV *const, const char *const params); |
5537 | 302 # endif |
4905
517fa1a34c7c
updated for version 7.3.1198
Bram Moolenaar <bram@vim.org>
parents:
4352
diff
changeset
|
303 #endif |
933 | 304 static void (*Perl_croak_nocontext)(const char*, ...); |
7 | 305 static I32 (*Perl_dowantarray)(pTHX); |
306 static void (*Perl_free_tmps)(pTHX); | |
307 static HV* (*Perl_gv_stashpv)(pTHX_ const char*, I32); | |
6872 | 308 #if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
309 static I32* (*Perl_markstack_grow)(pTHX); | |
310 #else | |
7 | 311 static void (*Perl_markstack_grow)(pTHX); |
6872 | 312 #endif |
7 | 313 static MAGIC* (*Perl_mg_find)(pTHX_ SV*, int); |
314 static CV* (*Perl_newXS)(pTHX_ char*, XSUBADDR_t, char*); | |
315 static SV* (*Perl_newSV)(pTHX_ STRLEN); | |
316 static SV* (*Perl_newSViv)(pTHX_ IV); | |
317 static SV* (*Perl_newSVpv)(pTHX_ const char*, STRLEN); | |
318 static I32 (*Perl_call_argv)(pTHX_ const char*, I32, char**); | |
319 static I32 (*Perl_call_pv)(pTHX_ const char*, I32); | |
320 static I32 (*Perl_eval_sv)(pTHX_ SV*, I32); | |
321 static SV* (*Perl_get_sv)(pTHX_ const char*, I32); | |
322 static SV* (*Perl_eval_pv)(pTHX_ const char*, I32); | |
323 static SV* (*Perl_call_method)(pTHX_ const char*, I32); | |
324 static void (*Perl_pop_scope)(pTHX); | |
325 static void (*Perl_push_scope)(pTHX); | |
326 static void (*Perl_save_int)(pTHX_ int*); | |
5960 | 327 #if (PERL_REVISION == 5) && (PERL_VERSION >= 20) |
328 static void (*Perl_save_strlen)(pTHX_ STRLEN* ptr); | |
329 #endif | |
7 | 330 static SV** (*Perl_stack_grow)(pTHX_ SV**, SV**p, int); |
331 static SV** (*Perl_set_context)(void*); | |
3050 | 332 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
333 static bool (*Perl_sv_2bool_flags)(pTHX_ SV*, I32); | |
6872 | 334 # if (PERL_REVISION == 5) && (PERL_VERSION < 22) |
3050 | 335 static void (*Perl_xs_apiversion_bootcheck)(pTHX_ SV *module, const char *api_p, STRLEN api_len); |
6872 | 336 # endif |
3050 | 337 #else |
7 | 338 static bool (*Perl_sv_2bool)(pTHX_ SV*); |
3050 | 339 #endif |
7 | 340 static IV (*Perl_sv_2iv)(pTHX_ SV*); |
341 static SV* (*Perl_sv_2mortal)(pTHX_ SV*); | |
342 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
343 static char* (*Perl_sv_2pv_flags)(pTHX_ SV*, STRLEN*, I32); | |
344 static char* (*Perl_sv_2pv_nolen)(pTHX_ SV*); | |
345 #else | |
346 static char* (*Perl_sv_2pv)(pTHX_ SV*, STRLEN*); | |
347 #endif | |
348 static SV* (*Perl_sv_bless)(pTHX_ SV*, HV*); | |
349 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
350 static void (*Perl_sv_catpvn_flags)(pTHX_ SV* , const char*, STRLEN, I32); | |
351 #else | |
352 static void (*Perl_sv_catpvn)(pTHX_ SV*, const char*, STRLEN); | |
353 #endif | |
1387 | 354 #ifdef PERL589_OR_LATER |
355 static IV (*Perl_sv_2iv_flags)(pTHX_ SV* sv, I32 flags); | |
356 static CV * (*Perl_newXS_flags)(pTHX_ const char *name, XSUBADDR_t subaddr, const char *const filename, const char *const proto, U32 flags); | |
357 #endif | |
7 | 358 static void (*Perl_sv_free)(pTHX_ SV*); |
359 static int (*Perl_sv_isa)(pTHX_ SV*, const char*); | |
360 static void (*Perl_sv_magic)(pTHX_ SV*, SV*, int, const char*, I32); | |
361 static void (*Perl_sv_setiv)(pTHX_ SV*, IV); | |
362 static void (*Perl_sv_setpv)(pTHX_ SV*, const char*); | |
363 static void (*Perl_sv_setpvn)(pTHX_ SV*, const char*, STRLEN); | |
364 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
365 static void (*Perl_sv_setsv_flags)(pTHX_ SV*, SV*, I32); | |
366 #else | |
367 static void (*Perl_sv_setsv)(pTHX_ SV*, SV*); | |
368 #endif | |
369 static bool (*Perl_sv_upgrade)(pTHX_ SV*, U32); | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
370 #if (PERL_REVISION == 5) && (PERL_VERSION < 10) |
7 | 371 static SV*** (*Perl_Tstack_sp_ptr)(register PerlInterpreter*); |
372 static OP** (*Perl_Top_ptr)(register PerlInterpreter*); | |
373 static SV*** (*Perl_Tstack_base_ptr)(register PerlInterpreter*); | |
374 static SV*** (*Perl_Tstack_max_ptr)(register PerlInterpreter*); | |
375 static I32* (*Perl_Ttmps_ix_ptr)(register PerlInterpreter*); | |
376 static I32* (*Perl_Ttmps_floor_ptr)(register PerlInterpreter*); | |
377 static I32** (*Perl_Tmarkstack_ptr_ptr)(register PerlInterpreter*); | |
378 static I32** (*Perl_Tmarkstack_max_ptr)(register PerlInterpreter*); | |
379 static SV** (*Perl_TSv_ptr)(register PerlInterpreter*); | |
380 static XPV** (*Perl_TXpv_ptr)(register PerlInterpreter*); | |
381 static STRLEN* (*Perl_Tna_ptr)(register PerlInterpreter*); | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
382 #else |
5537 | 383 /* Perl-5.18 has a different Perl_sv_free2 signature. */ |
384 # if (PERL_REVISION == 5) && (PERL_VERSION >= 18) | |
385 static void (*Perl_sv_free2)(pTHX_ SV*, const U32); | |
386 # else | |
1711 | 387 static void (*Perl_sv_free2)(pTHX_ SV*); |
5537 | 388 # endif |
1765 | 389 static void (*Perl_sys_init)(int* argc, char*** argv); |
1668 | 390 static void (*Perl_sys_term)(void); |
3818 | 391 static void (*Perl_call_list)(pTHX_ I32, AV*); |
392 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) | |
393 # else | |
1668 | 394 static SV** (*Perl_ISv_ptr)(register PerlInterpreter*); |
395 static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*); | |
396 static SV*** (*Perl_Istack_base_ptr)(register PerlInterpreter*); | |
397 static XPV** (*Perl_IXpv_ptr)(register PerlInterpreter*); | |
398 static I32* (*Perl_Itmps_ix_ptr)(register PerlInterpreter*); | |
399 static I32* (*Perl_Itmps_floor_ptr)(register PerlInterpreter*); | |
400 static STRLEN* (*Perl_Ina_ptr)(register PerlInterpreter*); | |
401 static I32** (*Perl_Imarkstack_ptr_ptr)(register PerlInterpreter*); | |
402 static I32** (*Perl_Imarkstack_max_ptr)(register PerlInterpreter*); | |
403 static SV*** (*Perl_Istack_sp_ptr)(register PerlInterpreter*); | |
404 static OP** (*Perl_Iop_ptr)(register PerlInterpreter*); | |
405 static I32* (*Perl_Iscopestack_ix_ptr)(register PerlInterpreter*); | |
406 static AV** (*Perl_Iunitcheckav_ptr)(register PerlInterpreter*); | |
3818 | 407 # endif |
1668 | 408 #endif |
6872 | 409 #if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
410 static I32 (*Perl_xs_handshake)(const U32, void *, const char *, ...); | |
411 static void (*Perl_xs_boot_epilog)(pTHX_ const U32); | |
412 #endif | |
7 | 413 |
3818 | 414 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
5706 | 415 # ifdef USE_ITHREADS |
3820 | 416 static perl_key* dll_PL_thr_key; |
5706 | 417 # endif |
3818 | 418 #else |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
419 static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*); |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
420 static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
421 static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); |
3818 | 422 static perl_key* (*Perl_Gthr_key_ptr)_((pTHX)); |
423 #endif | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
424 static void (*boot_DynaLoader)_((pTHX_ CV*)); |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
425 |
7 | 426 /* |
427 * Table of name to function pointer of perl. | |
428 */ | |
429 static struct { | |
430 char* name; | |
431 PERL_PROC* ptr; | |
432 } perl_funcname_table[] = { | |
433 {"perl_alloc", (PERL_PROC*)&perl_alloc}, | |
434 {"perl_construct", (PERL_PROC*)&perl_construct}, | |
435 {"perl_destruct", (PERL_PROC*)&perl_destruct}, | |
436 {"perl_free", (PERL_PROC*)&perl_free}, | |
437 {"perl_run", (PERL_PROC*)&perl_run}, | |
438 {"perl_parse", (PERL_PROC*)&perl_parse}, | |
439 {"Perl_get_context", (PERL_PROC*)&Perl_get_context}, | |
440 {"Perl_croak", (PERL_PROC*)&Perl_croak}, | |
2096
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
441 #ifdef PERL5101_OR_LATER |
2079
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
442 {"Perl_croak_xs_usage", (PERL_PROC*)&Perl_croak_xs_usage}, |
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
443 #endif |
5706 | 444 #ifdef PERL_IMPLICIT_CONTEXT |
7 | 445 {"Perl_croak_nocontext", (PERL_PROC*)&Perl_croak_nocontext}, |
5706 | 446 #endif |
7 | 447 {"Perl_dowantarray", (PERL_PROC*)&Perl_dowantarray}, |
448 {"Perl_free_tmps", (PERL_PROC*)&Perl_free_tmps}, | |
449 {"Perl_gv_stashpv", (PERL_PROC*)&Perl_gv_stashpv}, | |
450 {"Perl_markstack_grow", (PERL_PROC*)&Perl_markstack_grow}, | |
451 {"Perl_mg_find", (PERL_PROC*)&Perl_mg_find}, | |
452 {"Perl_newXS", (PERL_PROC*)&Perl_newXS}, | |
453 {"Perl_newSV", (PERL_PROC*)&Perl_newSV}, | |
454 {"Perl_newSViv", (PERL_PROC*)&Perl_newSViv}, | |
455 {"Perl_newSVpv", (PERL_PROC*)&Perl_newSVpv}, | |
456 {"Perl_call_argv", (PERL_PROC*)&Perl_call_argv}, | |
457 {"Perl_call_pv", (PERL_PROC*)&Perl_call_pv}, | |
458 {"Perl_eval_sv", (PERL_PROC*)&Perl_eval_sv}, | |
459 {"Perl_get_sv", (PERL_PROC*)&Perl_get_sv}, | |
460 {"Perl_eval_pv", (PERL_PROC*)&Perl_eval_pv}, | |
461 {"Perl_call_method", (PERL_PROC*)&Perl_call_method}, | |
462 {"Perl_pop_scope", (PERL_PROC*)&Perl_pop_scope}, | |
463 {"Perl_push_scope", (PERL_PROC*)&Perl_push_scope}, | |
464 {"Perl_save_int", (PERL_PROC*)&Perl_save_int}, | |
5960 | 465 #if (PERL_REVISION == 5) && (PERL_VERSION >= 20) |
466 {"Perl_save_strlen", (PERL_PROC*)&Perl_save_strlen}, | |
467 #endif | |
7 | 468 {"Perl_stack_grow", (PERL_PROC*)&Perl_stack_grow}, |
469 {"Perl_set_context", (PERL_PROC*)&Perl_set_context}, | |
3050 | 470 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
471 {"Perl_sv_2bool_flags", (PERL_PROC*)&Perl_sv_2bool_flags}, | |
6872 | 472 # if (PERL_REVISION == 5) && (PERL_VERSION < 22) |
3050 | 473 {"Perl_xs_apiversion_bootcheck",(PERL_PROC*)&Perl_xs_apiversion_bootcheck}, |
6872 | 474 # endif |
3050 | 475 #else |
7 | 476 {"Perl_sv_2bool", (PERL_PROC*)&Perl_sv_2bool}, |
3050 | 477 #endif |
7 | 478 {"Perl_sv_2iv", (PERL_PROC*)&Perl_sv_2iv}, |
479 {"Perl_sv_2mortal", (PERL_PROC*)&Perl_sv_2mortal}, | |
480 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
481 {"Perl_sv_2pv_flags", (PERL_PROC*)&Perl_sv_2pv_flags}, | |
482 {"Perl_sv_2pv_nolen", (PERL_PROC*)&Perl_sv_2pv_nolen}, | |
483 #else | |
484 {"Perl_sv_2pv", (PERL_PROC*)&Perl_sv_2pv}, | |
485 #endif | |
1387 | 486 #ifdef PERL589_OR_LATER |
487 {"Perl_sv_2iv_flags", (PERL_PROC*)&Perl_sv_2iv_flags}, | |
488 {"Perl_newXS_flags", (PERL_PROC*)&Perl_newXS_flags}, | |
489 #endif | |
7 | 490 {"Perl_sv_bless", (PERL_PROC*)&Perl_sv_bless}, |
491 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
492 {"Perl_sv_catpvn_flags", (PERL_PROC*)&Perl_sv_catpvn_flags}, | |
493 #else | |
494 {"Perl_sv_catpvn", (PERL_PROC*)&Perl_sv_catpvn}, | |
495 #endif | |
496 {"Perl_sv_free", (PERL_PROC*)&Perl_sv_free}, | |
497 {"Perl_sv_isa", (PERL_PROC*)&Perl_sv_isa}, | |
498 {"Perl_sv_magic", (PERL_PROC*)&Perl_sv_magic}, | |
499 {"Perl_sv_setiv", (PERL_PROC*)&Perl_sv_setiv}, | |
500 {"Perl_sv_setpv", (PERL_PROC*)&Perl_sv_setpv}, | |
501 {"Perl_sv_setpvn", (PERL_PROC*)&Perl_sv_setpvn}, | |
502 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
503 {"Perl_sv_setsv_flags", (PERL_PROC*)&Perl_sv_setsv_flags}, | |
504 #else | |
505 {"Perl_sv_setsv", (PERL_PROC*)&Perl_sv_setsv}, | |
506 #endif | |
507 {"Perl_sv_upgrade", (PERL_PROC*)&Perl_sv_upgrade}, | |
1668 | 508 #if (PERL_REVISION == 5) && (PERL_VERSION < 10) |
7 | 509 {"Perl_Tstack_sp_ptr", (PERL_PROC*)&Perl_Tstack_sp_ptr}, |
510 {"Perl_Top_ptr", (PERL_PROC*)&Perl_Top_ptr}, | |
511 {"Perl_Tstack_base_ptr", (PERL_PROC*)&Perl_Tstack_base_ptr}, | |
512 {"Perl_Tstack_max_ptr", (PERL_PROC*)&Perl_Tstack_max_ptr}, | |
513 {"Perl_Ttmps_ix_ptr", (PERL_PROC*)&Perl_Ttmps_ix_ptr}, | |
514 {"Perl_Ttmps_floor_ptr", (PERL_PROC*)&Perl_Ttmps_floor_ptr}, | |
515 {"Perl_Tmarkstack_ptr_ptr", (PERL_PROC*)&Perl_Tmarkstack_ptr_ptr}, | |
516 {"Perl_Tmarkstack_max_ptr", (PERL_PROC*)&Perl_Tmarkstack_max_ptr}, | |
517 {"Perl_TSv_ptr", (PERL_PROC*)&Perl_TSv_ptr}, | |
518 {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr}, | |
519 {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr}, | |
1668 | 520 #else |
1711 | 521 {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2}, |
1765 | 522 {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init}, |
1668 | 523 {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term}, |
3050 | 524 {"Perl_call_list", (PERL_PROC*)&Perl_call_list}, |
525 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) | |
526 # else | |
1668 | 527 {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
528 {"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr}, |
1668 | 529 {"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr}, |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
530 {"Perl_IXpv_ptr", (PERL_PROC*)&Perl_IXpv_ptr}, |
1668 | 531 {"Perl_Itmps_ix_ptr", (PERL_PROC*)&Perl_Itmps_ix_ptr}, |
532 {"Perl_Itmps_floor_ptr", (PERL_PROC*)&Perl_Itmps_floor_ptr}, | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
533 {"Perl_Ina_ptr", (PERL_PROC*)&Perl_Ina_ptr}, |
1668 | 534 {"Perl_Imarkstack_ptr_ptr", (PERL_PROC*)&Perl_Imarkstack_ptr_ptr}, |
535 {"Perl_Imarkstack_max_ptr", (PERL_PROC*)&Perl_Imarkstack_max_ptr}, | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
536 {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr}, |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
537 {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr}, |
1668 | 538 {"Perl_Iscopestack_ix_ptr", (PERL_PROC*)&Perl_Iscopestack_ix_ptr}, |
539 {"Perl_Iunitcheckav_ptr", (PERL_PROC*)&Perl_Iunitcheckav_ptr}, | |
3050 | 540 # endif |
1668 | 541 #endif |
6872 | 542 #if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
543 {"Perl_xs_handshake", (PERL_PROC*)&Perl_xs_handshake}, | |
544 {"Perl_xs_boot_epilog", (PERL_PROC*)&Perl_xs_boot_epilog}, | |
545 #endif | |
3050 | 546 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
5706 | 547 # ifdef USE_ITHREADS |
3820 | 548 {"PL_thr_key", (PERL_PROC*)&dll_PL_thr_key}, |
5706 | 549 # endif |
3050 | 550 #else |
7 | 551 {"Perl_Idefgv_ptr", (PERL_PROC*)&Perl_Idefgv_ptr}, |
552 {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr}, | |
553 {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr}, | |
3050 | 554 {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr}, |
555 #endif | |
7 | 556 {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader}, |
557 {"", NULL}, | |
558 }; | |
559 | |
5537 | 560 /* Work around for perl-5.18. |
561 * The definitions of S_SvREFCNT_inc and S_SvREFCNT_dec are needed, so include | |
562 * "perl\lib\CORE\inline.h", after Perl_sv_free2 is defined. | |
563 * The linker won't complain about undefined __impl_Perl_sv_free2. */ | |
564 #if (PERL_REVISION == 5) && (PERL_VERSION >= 18) | |
565 # include <inline.h> | |
566 #endif | |
567 | |
7 | 568 /* |
569 * Make all runtime-links of perl. | |
570 * | |
5267
585b623a1aa3
updated for version 7.4b.010
Bram Moolenaar <bram@vim.org>
parents:
5261
diff
changeset
|
571 * 1. Get module handle using dlopen() or vimLoadLib(). |
7 | 572 * 2. Get pointer to perl function by GetProcAddress. |
573 * 3. Repeat 2, until get all functions will be used. | |
574 * | |
575 * Parameter 'libname' provides name of DLL. | |
576 * Return OK or FAIL. | |
577 */ | |
578 static int | |
579 perl_runtime_link_init(char *libname, int verbose) | |
580 { | |
581 int i; | |
582 | |
583 if (hPerlLib != NULL) | |
584 return OK; | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
585 if ((hPerlLib = load_dll(libname)) == NULL) |
7 | 586 { |
587 if (verbose) | |
588 EMSG2(_("E370: Could not load library %s"), libname); | |
589 return FAIL; | |
590 } | |
591 for (i = 0; perl_funcname_table[i].ptr; ++i) | |
592 { | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
593 if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib, |
7 | 594 perl_funcname_table[i].name))) |
595 { | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
596 close_dll(hPerlLib); |
7 | 597 hPerlLib = NULL; |
598 if (verbose) | |
599 EMSG2(_(e_loadfunc), perl_funcname_table[i].name); | |
600 return FAIL; | |
601 } | |
602 } | |
603 return OK; | |
604 } | |
605 | |
606 /* | |
607 * If runtime-link-perl(DLL) was loaded successfully, return TRUE. | |
608 * There were no DLL loaded, return FALSE. | |
609 */ | |
610 int | |
611 perl_enabled(verbose) | |
612 int verbose; | |
613 { | |
7198
b58e16f9119e
commit https://github.com/vim/vim/commit/a16f472edfa028e5574c7c145d02f3821edbc698
Christian Brabandt <cb@256bit.org>
parents:
7196
diff
changeset
|
614 #ifdef WIN3264 |
7196
42717d048817
commit https://github.com/vim/vim/commit/d94464ee294a351ce7b6ba18e8bd3f24f1bef920
Christian Brabandt <cb@256bit.org>
parents:
6872
diff
changeset
|
615 char *dll = DYNAMIC_PERL_DLL; |
42717d048817
commit https://github.com/vim/vim/commit/d94464ee294a351ce7b6ba18e8bd3f24f1bef920
Christian Brabandt <cb@256bit.org>
parents:
6872
diff
changeset
|
616 #else |
42717d048817
commit https://github.com/vim/vim/commit/d94464ee294a351ce7b6ba18e8bd3f24f1bef920
Christian Brabandt <cb@256bit.org>
parents:
6872
diff
changeset
|
617 char *dll = *p_perldll ? (char *)p_perldll : DYNAMIC_PERL_DLL; |
42717d048817
commit https://github.com/vim/vim/commit/d94464ee294a351ce7b6ba18e8bd3f24f1bef920
Christian Brabandt <cb@256bit.org>
parents:
6872
diff
changeset
|
618 #endif |
42717d048817
commit https://github.com/vim/vim/commit/d94464ee294a351ce7b6ba18e8bd3f24f1bef920
Christian Brabandt <cb@256bit.org>
parents:
6872
diff
changeset
|
619 return perl_runtime_link_init(dll, verbose) == OK; |
7 | 620 } |
621 #endif /* DYNAMIC_PERL */ | |
622 | |
623 /* | |
624 * perl_init(): initialize perl interpreter | |
625 * We have to call perl_parse to initialize some structures, | |
626 * there's nothing to actually parse. | |
627 */ | |
628 static void | |
629 perl_init() | |
630 { | |
1668 | 631 char *bootargs[] = { "VI", NULL }; |
632 int argc = 3; | |
633 static char *argv[] = { "", "-e", "" }; | |
7 | 634 |
1668 | 635 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) |
1765 | 636 Perl_sys_init(&argc, (char***)&argv); |
1668 | 637 #endif |
7 | 638 perl_interp = perl_alloc(); |
639 perl_construct(perl_interp); | |
1668 | 640 perl_parse(perl_interp, xs_init, argc, argv, 0); |
7 | 641 perl_call_argv("VIM::bootstrap", (long)G_DISCARD, bootargs); |
642 VIM_init(); | |
643 #ifdef USE_SFIO | |
644 sfdisc(PerlIO_stdout(), sfdcnewvim()); | |
645 sfdisc(PerlIO_stderr(), sfdcnewvim()); | |
646 sfsetbuf(PerlIO_stdout(), NULL, 0); | |
647 sfsetbuf(PerlIO_stderr(), NULL, 0); | |
648 #endif | |
649 } | |
650 | |
651 /* | |
652 * perl_end(): clean up after ourselves | |
653 */ | |
654 void | |
655 perl_end() | |
656 { | |
657 if (perl_interp) | |
658 { | |
659 perl_run(perl_interp); | |
660 perl_destruct(perl_interp); | |
661 perl_free(perl_interp); | |
662 perl_interp = NULL; | |
1668 | 663 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) |
664 Perl_sys_term(); | |
665 #endif | |
7 | 666 } |
667 #ifdef DYNAMIC_PERL | |
668 if (hPerlLib) | |
669 { | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
670 close_dll(hPerlLib); |
7 | 671 hPerlLib = NULL; |
672 } | |
673 #endif | |
674 } | |
675 | |
676 /* | |
677 * msg_split(): send a message to the message handling routines | |
678 * split at '\n' first though. | |
679 */ | |
680 void | |
681 msg_split(s, attr) | |
682 char_u *s; | |
683 int attr; /* highlighting attributes */ | |
684 { | |
685 char *next; | |
686 char *token = (char *)s; | |
687 | |
1423 | 688 while ((next = strchr(token, '\n')) && !got_int) |
7 | 689 { |
690 *next++ = '\0'; /* replace \n with \0 */ | |
691 msg_attr((char_u *)token, attr); | |
692 token = next; | |
693 } | |
1423 | 694 if (*token && !got_int) |
7 | 695 msg_attr((char_u *)token, attr); |
696 } | |
697 | |
698 #ifndef FEAT_EVAL | |
699 /* | |
700 * This stub is needed because an "#ifdef FEAT_EVAL" around Eval() doesn't | |
701 * work properly. | |
702 */ | |
703 char_u * | |
714 | 704 eval_to_string(arg, nextcmd, dolist) |
4135 | 705 char_u *arg UNUSED; |
706 char_u **nextcmd UNUSED; | |
707 int dolist UNUSED; | |
7 | 708 { |
709 return NULL; | |
710 } | |
711 #endif | |
712 | |
713 /* | |
714 * Create a new reference to an SV pointing to the SCR structure | |
502 | 715 * The b_perl_private/w_perl_private part of the SCR structure points to the |
716 * SV, so there can only be one such SV for a particular SCR structure. When | |
717 * the last reference has gone (DESTROY is called), | |
718 * b_perl_private/w_perl_private is reset; When the screen goes away before | |
7 | 719 * all references are gone, the value of the SV is reset; |
720 * any subsequent use of any of those reference will produce | |
721 * a warning. (see typemap) | |
722 */ | |
502 | 723 |
724 static SV * | |
725 newWINrv(rv, ptr) | |
726 SV *rv; | |
727 win_T *ptr; | |
728 { | |
729 sv_upgrade(rv, SVt_RV); | |
730 if (ptr->w_perl_private == NULL) | |
731 { | |
732 ptr->w_perl_private = newSV(0); | |
3344 | 733 sv_setiv(ptr->w_perl_private, PTR2IV(ptr)); |
502 | 734 } |
735 else | |
736 SvREFCNT_inc(ptr->w_perl_private); | |
737 SvRV(rv) = ptr->w_perl_private; | |
738 SvROK_on(rv); | |
739 return sv_bless(rv, gv_stashpv("VIWIN", TRUE)); | |
7 | 740 } |
741 | |
502 | 742 static SV * |
743 newBUFrv(rv, ptr) | |
744 SV *rv; | |
745 buf_T *ptr; | |
746 { | |
747 sv_upgrade(rv, SVt_RV); | |
748 if (ptr->b_perl_private == NULL) | |
749 { | |
750 ptr->b_perl_private = newSV(0); | |
3344 | 751 sv_setiv(ptr->b_perl_private, PTR2IV(ptr)); |
502 | 752 } |
753 else | |
754 SvREFCNT_inc(ptr->b_perl_private); | |
755 SvRV(rv) = ptr->b_perl_private; | |
756 SvROK_on(rv); | |
757 return sv_bless(rv, gv_stashpv("VIBUF", TRUE)); | |
758 } | |
7 | 759 |
760 /* | |
761 * perl_win_free | |
4352 | 762 * Remove all references to the window to be destroyed |
7 | 763 */ |
764 void | |
765 perl_win_free(wp) | |
766 win_T *wp; | |
767 { | |
502 | 768 if (wp->w_perl_private) |
769 sv_setiv((SV *)wp->w_perl_private, 0); | |
7 | 770 return; |
771 } | |
772 | |
773 void | |
774 perl_buf_free(bp) | |
775 buf_T *bp; | |
776 { | |
502 | 777 if (bp->b_perl_private) |
778 sv_setiv((SV *)bp->b_perl_private, 0); | |
7 | 779 return; |
780 } | |
781 | |
782 #ifndef PROTO | |
783 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
784 I32 cur_val(pTHX_ IV iv, SV *sv); | |
785 # else | |
786 I32 cur_val(IV iv, SV *sv); | |
787 #endif | |
788 | |
789 /* | |
790 * Handler for the magic variables $main::curwin and $main::curbuf. | |
791 * The handler is put into the magic vtbl for these variables. | |
792 * (This is effectively a C-level equivalent of a tied variable). | |
793 * There is no "set" function as the variables are read-only. | |
794 */ | |
795 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
796 I32 cur_val(pTHX_ IV iv, SV *sv) | |
797 # else | |
798 I32 cur_val(IV iv, SV *sv) | |
799 # endif | |
800 { | |
801 SV *rv; | |
802 if (iv == 0) | |
803 rv = newWINrv(newSV(0), curwin); | |
804 else | |
805 rv = newBUFrv(newSV(0), curbuf); | |
806 sv_setsv(sv, rv); | |
807 return 0; | |
808 } | |
809 #endif /* !PROTO */ | |
810 | |
811 struct ufuncs cw_funcs = { cur_val, 0, 0 }; | |
812 struct ufuncs cb_funcs = { cur_val, 0, 1 }; | |
813 | |
814 /* | |
815 * VIM_init(): Vim-specific initialisation. | |
816 * Make the magical main::curwin and main::curbuf variables | |
817 */ | |
818 static void | |
819 VIM_init() | |
820 { | |
821 static char cw[] = "main::curwin"; | |
822 static char cb[] = "main::curbuf"; | |
823 SV *sv; | |
824 | |
825 sv = perl_get_sv(cw, TRUE); | |
826 sv_magic(sv, NULL, 'U', (char *)&cw_funcs, sizeof(cw_funcs)); | |
827 SvREADONLY_on(sv); | |
828 | |
829 sv = perl_get_sv(cb, TRUE); | |
830 sv_magic(sv, NULL, 'U', (char *)&cb_funcs, sizeof(cb_funcs)); | |
831 SvREADONLY_on(sv); | |
832 | |
833 /* | |
834 * Setup the Safe compartment. | |
835 * It shouldn't be a fatal error if the Safe module is missing. | |
836 * XXX: Only shares the 'Msg' routine (which has to be called | |
837 * like 'Msg(...)'). | |
838 */ | |
839 (void)perl_eval_pv( "if ( eval( 'require Safe' ) ) { $VIM::safe = Safe->new(); $VIM::safe->share_from( 'VIM', ['Msg'] ); }", G_DISCARD | G_VOID ); | |
840 | |
841 } | |
842 | |
843 #ifdef DYNAMIC_PERL | |
844 static char *e_noperl = N_("Sorry, this command is disabled: the Perl library could not be loaded."); | |
845 #endif | |
846 | |
847 /* | |
848 * ":perl" | |
849 */ | |
850 void | |
851 ex_perl(eap) | |
852 exarg_T *eap; | |
853 { | |
854 char *err; | |
855 char *script; | |
856 STRLEN length; | |
857 SV *sv; | |
2255 | 858 #ifdef HAVE_SANDBOX |
7 | 859 SV *safe; |
2255 | 860 #endif |
7 | 861 |
862 script = (char *)script_get(eap, eap->arg); | |
863 if (eap->skip) | |
864 { | |
865 vim_free(script); | |
866 return; | |
867 } | |
868 | |
869 if (perl_interp == NULL) | |
870 { | |
871 #ifdef DYNAMIC_PERL | |
872 if (!perl_enabled(TRUE)) | |
873 { | |
874 EMSG(_(e_noperl)); | |
875 vim_free(script); | |
876 return; | |
877 } | |
878 #endif | |
879 perl_init(); | |
880 } | |
881 | |
882 { | |
883 dSP; | |
884 ENTER; | |
885 SAVETMPS; | |
886 | |
887 if (script == NULL) | |
888 sv = newSVpv((char *)eap->arg, 0); | |
889 else | |
890 { | |
891 sv = newSVpv(script, 0); | |
892 vim_free(script); | |
893 } | |
894 | |
895 #ifdef HAVE_SANDBOX | |
896 if (sandbox) | |
897 { | |
2982 | 898 safe = perl_get_sv("VIM::safe", FALSE); |
1934 | 899 # ifndef MAKE_TEST /* avoid a warning for unreachable code */ |
1990 | 900 if (safe == NULL || !SvTRUE(safe)) |
7 | 901 EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module")); |
902 else | |
1934 | 903 # endif |
7 | 904 { |
905 PUSHMARK(SP); | |
906 XPUSHs(safe); | |
907 XPUSHs(sv); | |
908 PUTBACK; | |
909 perl_call_method("reval", G_DISCARD); | |
910 } | |
911 } | |
912 else | |
913 #endif | |
914 perl_eval_sv(sv, G_DISCARD | G_NOARGS); | |
915 | |
916 SvREFCNT_dec(sv); | |
917 | |
3728 | 918 #ifdef AVOID_PL_ERRGV |
919 err = SvPV(perl_get_sv("@", GV_ADD), length); | |
920 #else | |
7 | 921 err = SvPV(GvSV(PL_errgv), length); |
3728 | 922 #endif |
7 | 923 |
924 FREETMPS; | |
925 LEAVE; | |
926 | |
927 if (!length) | |
928 return; | |
929 | |
930 msg_split((char_u *)err, highlight_attr[HLF_E]); | |
931 return; | |
932 } | |
933 } | |
934 | |
935 static int | |
936 replace_line(line, end) | |
937 linenr_T *line, *end; | |
938 { | |
939 char *str; | |
940 | |
941 if (SvOK(GvSV(PL_defgv))) | |
942 { | |
943 str = SvPV(GvSV(PL_defgv), PL_na); | |
944 ml_replace(*line, (char_u *)str, 1); | |
945 changed_bytes(*line, 0); | |
946 } | |
947 else | |
948 { | |
949 ml_delete(*line, FALSE); | |
950 deleted_lines_mark(*line, 1L); | |
951 --(*end); | |
952 --(*line); | |
953 } | |
954 return OK; | |
955 } | |
956 | |
957 /* | |
958 * ":perldo". | |
959 */ | |
960 void | |
961 ex_perldo(eap) | |
962 exarg_T *eap; | |
963 { | |
964 STRLEN length; | |
965 SV *sv; | |
966 char *str; | |
967 linenr_T i; | |
968 | |
969 if (bufempty()) | |
970 return; | |
971 | |
972 if (perl_interp == NULL) | |
973 { | |
974 #ifdef DYNAMIC_PERL | |
975 if (!perl_enabled(TRUE)) | |
976 { | |
977 EMSG(_(e_noperl)); | |
978 return; | |
979 } | |
980 #endif | |
981 perl_init(); | |
982 } | |
983 { | |
984 dSP; | |
985 length = strlen((char *)eap->arg); | |
129 | 986 sv = newSV(length + sizeof("sub VIM::perldo {") - 1 + 1); |
987 sv_setpvn(sv, "sub VIM::perldo {", sizeof("sub VIM::perldo {") - 1); | |
7 | 988 sv_catpvn(sv, (char *)eap->arg, length); |
989 sv_catpvn(sv, "}", 1); | |
990 perl_eval_sv(sv, G_DISCARD | G_NOARGS); | |
991 SvREFCNT_dec(sv); | |
3728 | 992 #ifdef AVOID_PL_ERRGV |
993 str = SvPV(perl_get_sv("@", GV_ADD), length); | |
994 #else | |
7 | 995 str = SvPV(GvSV(PL_errgv), length); |
3728 | 996 #endif |
7 | 997 if (length) |
998 goto err; | |
999 | |
1000 if (u_save(eap->line1 - 1, eap->line2 + 1) != OK) | |
1001 return; | |
1002 | |
1003 ENTER; | |
1004 SAVETMPS; | |
1005 for (i = eap->line1; i <= eap->line2; i++) | |
1006 { | |
129 | 1007 sv_setpv(GvSV(PL_defgv), (char *)ml_get(i)); |
7 | 1008 PUSHMARK(sp); |
1009 perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL); | |
3728 | 1010 #ifdef AVOID_PL_ERRGV |
1011 str = SvPV(perl_get_sv("@", GV_ADD), length); | |
1012 #else | |
7 | 1013 str = SvPV(GvSV(PL_errgv), length); |
3728 | 1014 #endif |
7 | 1015 if (length) |
1016 break; | |
1017 SPAGAIN; | |
1018 if (SvTRUEx(POPs)) | |
1019 { | |
1020 if (replace_line(&i, &eap->line2) != OK) | |
1021 { | |
1022 PUTBACK; | |
1023 break; | |
1024 } | |
1025 } | |
1026 PUTBACK; | |
1027 } | |
1028 FREETMPS; | |
1029 LEAVE; | |
1030 check_cursor(); | |
1031 update_screen(NOT_VALID); | |
1032 if (!length) | |
1033 return; | |
1034 | |
1035 err: | |
1036 msg_split((char_u *)str, highlight_attr[HLF_E]); | |
1037 return; | |
1038 } | |
1039 } | |
1040 | |
1681 | 1041 #ifndef FEAT_WINDOWS |
1042 int win_valid(win_T *w) { return TRUE; } | |
1043 int win_count() { return 1; } | |
1044 win_T *win_find_nr(int n) { return curwin; } | |
1045 #endif | |
1046 | |
7 | 1047 XS(boot_VIM); |
1048 | |
1049 static void | |
1050 xs_init(pTHX) | |
1051 { | |
1052 char *file = __FILE__; | |
1053 | |
1054 /* DynaLoader is a special case */ | |
1055 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); | |
1056 newXS("VIM::bootstrap", boot_VIM, file); | |
1057 } | |
1058 | |
1059 typedef win_T * VIWIN; | |
1060 typedef buf_T * VIBUF; | |
1061 | |
1062 MODULE = VIM PACKAGE = VIM | |
1063 | |
1064 void | |
1065 Msg(text, hl=NULL) | |
1066 char *text; | |
1067 char *hl; | |
1068 | |
1069 PREINIT: | |
1070 int attr; | |
1071 int id; | |
1072 | |
1073 PPCODE: | |
1074 if (text != NULL) | |
1075 { | |
1076 attr = 0; | |
1077 if (hl != NULL) | |
1078 { | |
1079 id = syn_name2id((char_u *)hl); | |
1080 if (id != 0) | |
1081 attr = syn_id2attr(id); | |
1082 } | |
1083 msg_split((char_u *)text, attr); | |
1084 } | |
1085 | |
1086 void | |
1087 SetOption(line) | |
1088 char *line; | |
1089 | |
1090 PPCODE: | |
1091 if (line != NULL) | |
1092 do_set((char_u *)line, 0); | |
1093 update_screen(NOT_VALID); | |
1094 | |
1095 void | |
1096 DoCommand(line) | |
1097 char *line; | |
1098 | |
1099 PPCODE: | |
1100 if (line != NULL) | |
1101 do_cmdline_cmd((char_u *)line); | |
1102 | |
1103 void | |
1104 Eval(str) | |
1105 char *str; | |
1106 | |
1107 PREINIT: | |
1108 char_u *value; | |
1109 PPCODE: | |
714 | 1110 value = eval_to_string((char_u *)str, (char_u **)0, TRUE); |
7 | 1111 if (value == NULL) |
1112 { | |
1113 XPUSHs(sv_2mortal(newSViv(0))); | |
1114 XPUSHs(sv_2mortal(newSVpv("", 0))); | |
1115 } | |
1116 else | |
1117 { | |
1118 XPUSHs(sv_2mortal(newSViv(1))); | |
1119 XPUSHs(sv_2mortal(newSVpv((char *)value, 0))); | |
1120 vim_free(value); | |
1121 } | |
1122 | |
1123 void | |
1124 Buffers(...) | |
1125 | |
1126 PREINIT: | |
1127 buf_T *vimbuf; | |
1128 int i, b; | |
1129 | |
1130 PPCODE: | |
1131 if (items == 0) | |
1132 { | |
1133 if (GIMME == G_SCALAR) | |
1134 { | |
1135 i = 0; | |
1136 for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next) | |
1137 ++i; | |
1138 | |
1139 XPUSHs(sv_2mortal(newSViv(i))); | |
1140 } | |
1141 else | |
1142 { | |
1143 for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next) | |
1144 XPUSHs(newBUFrv(newSV(0), vimbuf)); | |
1145 } | |
1146 } | |
1147 else | |
1148 { | |
1149 for (i = 0; i < items; i++) | |
1150 { | |
1151 SV *sv = ST(i); | |
1152 if (SvIOK(sv)) | |
4105 | 1153 b = (int) SvIV(ST(i)); |
7 | 1154 else |
1155 { | |
1156 char_u *pat; | |
1157 STRLEN len; | |
1158 | |
1159 pat = (char_u *)SvPV(sv, len); | |
1160 ++emsg_off; | |
4236 | 1161 b = buflist_findpat(pat, pat+len, FALSE, FALSE, FALSE); |
7 | 1162 --emsg_off; |
1163 } | |
1164 | |
1165 if (b >= 0) | |
1166 { | |
1167 vimbuf = buflist_findnr(b); | |
1168 if (vimbuf) | |
1169 XPUSHs(newBUFrv(newSV(0), vimbuf)); | |
1170 } | |
1171 } | |
1172 } | |
1173 | |
1174 void | |
1175 Windows(...) | |
1176 | |
1177 PREINIT: | |
1178 win_T *vimwin; | |
1179 int i, w; | |
1180 | |
1181 PPCODE: | |
1182 if (items == 0) | |
1183 { | |
1184 if (GIMME == G_SCALAR) | |
1185 XPUSHs(sv_2mortal(newSViv(win_count()))); | |
1186 else | |
1187 { | |
1188 for (vimwin = firstwin; vimwin != NULL; vimwin = W_NEXT(vimwin)) | |
1189 XPUSHs(newWINrv(newSV(0), vimwin)); | |
1190 } | |
1191 } | |
1192 else | |
1193 { | |
1194 for (i = 0; i < items; i++) | |
1195 { | |
4105 | 1196 w = (int) SvIV(ST(i)); |
7 | 1197 vimwin = win_find_nr(w); |
1198 if (vimwin) | |
1199 XPUSHs(newWINrv(newSV(0), vimwin)); | |
1200 } | |
1201 } | |
1202 | |
1203 MODULE = VIM PACKAGE = VIWIN | |
1204 | |
1205 void | |
1206 DESTROY(win) | |
1207 VIWIN win | |
1208 | |
1209 CODE: | |
1210 if (win_valid(win)) | |
502 | 1211 win->w_perl_private = 0; |
7 | 1212 |
1213 SV * | |
1214 Buffer(win) | |
1215 VIWIN win | |
1216 | |
1217 CODE: | |
1218 if (!win_valid(win)) | |
1219 win = curwin; | |
1220 RETVAL = newBUFrv(newSV(0), win->w_buffer); | |
1221 OUTPUT: | |
1222 RETVAL | |
1223 | |
1224 void | |
1225 SetHeight(win, height) | |
1226 VIWIN win | |
1227 int height; | |
1228 | |
1229 PREINIT: | |
1230 win_T *savewin; | |
1231 | |
1232 PPCODE: | |
1233 if (!win_valid(win)) | |
1234 win = curwin; | |
1235 savewin = curwin; | |
1236 curwin = win; | |
1237 win_setheight(height); | |
1238 curwin = savewin; | |
1239 | |
1240 void | |
1241 Cursor(win, ...) | |
1242 VIWIN win | |
1243 | |
1244 PPCODE: | |
2982 | 1245 if (items == 1) |
7 | 1246 { |
1247 EXTEND(sp, 2); | |
1248 if (!win_valid(win)) | |
1249 win = curwin; | |
1250 PUSHs(sv_2mortal(newSViv(win->w_cursor.lnum))); | |
1251 PUSHs(sv_2mortal(newSViv(win->w_cursor.col))); | |
1252 } | |
2982 | 1253 else if (items == 3) |
7 | 1254 { |
1255 int lnum, col; | |
1256 | |
1257 if (!win_valid(win)) | |
1258 win = curwin; | |
4105 | 1259 lnum = (int) SvIV(ST(1)); |
1260 col = (int) SvIV(ST(2)); | |
7 | 1261 win->w_cursor.lnum = lnum; |
1262 win->w_cursor.col = col; | |
1263 check_cursor(); /* put cursor on an existing line */ | |
1264 update_screen(NOT_VALID); | |
1265 } | |
1266 | |
1267 MODULE = VIM PACKAGE = VIBUF | |
1268 | |
1269 void | |
1270 DESTROY(vimbuf) | |
1271 VIBUF vimbuf; | |
1272 | |
1273 CODE: | |
1274 if (buf_valid(vimbuf)) | |
502 | 1275 vimbuf->b_perl_private = 0; |
7 | 1276 |
1277 void | |
1278 Name(vimbuf) | |
1279 VIBUF vimbuf; | |
1280 | |
1281 PPCODE: | |
1282 if (!buf_valid(vimbuf)) | |
1283 vimbuf = curbuf; | |
1284 /* No file name returns an empty string */ | |
1285 if (vimbuf->b_fname == NULL) | |
1286 XPUSHs(sv_2mortal(newSVpv("", 0))); | |
1287 else | |
1288 XPUSHs(sv_2mortal(newSVpv((char *)vimbuf->b_fname, 0))); | |
1289 | |
1290 void | |
1291 Number(vimbuf) | |
1292 VIBUF vimbuf; | |
1293 | |
1294 PPCODE: | |
1295 if (!buf_valid(vimbuf)) | |
1296 vimbuf = curbuf; | |
1297 XPUSHs(sv_2mortal(newSViv(vimbuf->b_fnum))); | |
1298 | |
1299 void | |
1300 Count(vimbuf) | |
1301 VIBUF vimbuf; | |
1302 | |
1303 PPCODE: | |
1304 if (!buf_valid(vimbuf)) | |
1305 vimbuf = curbuf; | |
1306 XPUSHs(sv_2mortal(newSViv(vimbuf->b_ml.ml_line_count))); | |
1307 | |
1308 void | |
1309 Get(vimbuf, ...) | |
1310 VIBUF vimbuf; | |
1311 | |
1312 PREINIT: | |
1313 char_u *line; | |
1314 int i; | |
1315 long lnum; | |
1316 PPCODE: | |
1317 if (buf_valid(vimbuf)) | |
1318 { | |
1319 for (i = 1; i < items; i++) | |
1320 { | |
4105 | 1321 lnum = (long) SvIV(ST(i)); |
7 | 1322 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count) |
1323 { | |
1324 line = ml_get_buf(vimbuf, lnum, FALSE); | |
1325 XPUSHs(sv_2mortal(newSVpv((char *)line, 0))); | |
1326 } | |
1327 } | |
1328 } | |
1329 | |
1330 void | |
1331 Set(vimbuf, ...) | |
1332 VIBUF vimbuf; | |
1333 | |
1334 PREINIT: | |
1335 int i; | |
1336 long lnum; | |
1337 char *line; | |
1338 PPCODE: | |
1339 if (buf_valid(vimbuf)) | |
1340 { | |
1341 if (items < 3) | |
1342 croak("Usage: VIBUF::Set(vimbuf, lnum, @lines)"); | |
1343 | |
4105 | 1344 lnum = (long) SvIV(ST(1)); |
7 | 1345 for(i = 2; i < items; i++, lnum++) |
1346 { | |
1347 line = SvPV(ST(i),PL_na); | |
1348 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) | |
1349 { | |
918 | 1350 aco_save_T aco; |
1351 | |
1352 /* set curwin/curbuf for "vimbuf" and save some things */ | |
1353 aucmd_prepbuf(&aco, vimbuf); | |
1354 | |
7 | 1355 if (u_savesub(lnum) == OK) |
1356 { | |
1357 ml_replace(lnum, (char_u *)line, TRUE); | |
1358 changed_bytes(lnum, 0); | |
1359 } | |
934 | 1360 |
918 | 1361 /* restore curwin/curbuf and a few other things */ |
1362 aucmd_restbuf(&aco); | |
1363 /* Careful: autocommands may have made "vimbuf" invalid! */ | |
7 | 1364 } |
1365 } | |
1366 } | |
1367 | |
1368 void | |
1369 Delete(vimbuf, ...) | |
1370 VIBUF vimbuf; | |
1371 | |
1372 PREINIT: | |
1373 long i, lnum = 0, count = 0; | |
1374 PPCODE: | |
1375 if (buf_valid(vimbuf)) | |
1376 { | |
1377 if (items == 2) | |
1378 { | |
4105 | 1379 lnum = (long) SvIV(ST(1)); |
7 | 1380 count = 1; |
1381 } | |
1382 else if (items == 3) | |
1383 { | |
4105 | 1384 lnum = (long) SvIV(ST(1)); |
1385 count = (long) 1 + SvIV(ST(2)) - lnum; | |
2982 | 1386 if (count == 0) |
7 | 1387 count = 1; |
2982 | 1388 if (count < 0) |
7 | 1389 { |
1390 lnum -= count; | |
1391 count = -count; | |
1392 } | |
1393 } | |
1394 if (items >= 2) | |
1395 { | |
1396 for (i = 0; i < count; i++) | |
1397 { | |
1398 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count) | |
1399 { | |
918 | 1400 aco_save_T aco; |
1401 | |
1402 /* set curwin/curbuf for "vimbuf" and save some things */ | |
1403 aucmd_prepbuf(&aco, vimbuf); | |
934 | 1404 |
7 | 1405 if (u_savedel(lnum, 1) == OK) |
1406 { | |
1407 ml_delete(lnum, 0); | |
1929 | 1408 check_cursor(); |
7 | 1409 deleted_lines_mark(lnum, 1L); |
1410 } | |
934 | 1411 |
918 | 1412 /* restore curwin/curbuf and a few other things */ |
1413 aucmd_restbuf(&aco); | |
1414 /* Careful: autocommands may have made "vimbuf" invalid! */ | |
934 | 1415 |
7 | 1416 update_curbuf(VALID); |
1417 } | |
1418 } | |
1419 } | |
1420 } | |
1421 | |
1422 void | |
1423 Append(vimbuf, ...) | |
1424 VIBUF vimbuf; | |
1425 | |
1426 PREINIT: | |
1427 int i; | |
1428 long lnum; | |
1429 char *line; | |
1430 PPCODE: | |
1431 if (buf_valid(vimbuf)) | |
1432 { | |
1433 if (items < 3) | |
1434 croak("Usage: VIBUF::Append(vimbuf, lnum, @lines)"); | |
1435 | |
4105 | 1436 lnum = (long) SvIV(ST(1)); |
7 | 1437 for (i = 2; i < items; i++, lnum++) |
1438 { | |
1439 line = SvPV(ST(i),PL_na); | |
1440 if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) | |
1441 { | |
918 | 1442 aco_save_T aco; |
1443 | |
1444 /* set curwin/curbuf for "vimbuf" and save some things */ | |
1445 aucmd_prepbuf(&aco, vimbuf); | |
1446 | |
7 | 1447 if (u_inssub(lnum + 1) == OK) |
1448 { | |
1449 ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE); | |
1450 appended_lines_mark(lnum, 1L); | |
1451 } | |
934 | 1452 |
918 | 1453 /* restore curwin/curbuf and a few other things */ |
1454 aucmd_restbuf(&aco); | |
1455 /* Careful: autocommands may have made "vimbuf" invalid! */ | |
934 | 1456 |
7 | 1457 update_curbuf(VALID); |
1458 } | |
1459 } | |
1460 } | |
1461 |