Mercurial > vim
annotate src/if_perl.xs @ 7666:8edd1afaf6b7 v7.4.1132
commit https://github.com/vim/vim/commit/99dbe291f55022bd5166c9c3c7967b8693cd9d1b
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jan 19 13:07:23 2016 +0100
patch 7.4.1132
Problem: Old style tests for the argument list.
Solution: Add more new style tests. (Yegappan Lakshmanan)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 19 Jan 2016 13:15:05 +0100 |
parents | c7575b07de98 |
children | 1a5d34492798 |
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. */ | |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
120 # define CHECK_EVAL_ERR(len) SvPV(perl_get_sv("@", GV_ADD), (len)); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
121 #else |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
122 # define CHECK_EVAL_ERR(len) SvPV(GvSV(PL_errgv), (len)); |
3728 | 123 #endif |
124 | |
7 | 125 /* Compatibility hacks over */ |
126 | |
127 static PerlInterpreter *perl_interp = NULL; | |
128 static void xs_init __ARGS((pTHX)); | |
129 static void VIM_init __ARGS((void)); | |
130 EXTERN_C void boot_DynaLoader __ARGS((pTHX_ CV*)); | |
131 | |
132 /* | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
133 * For dynamic linked perl. |
7 | 134 */ |
135 #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
|
136 |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
137 #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
|
138 #ifdef WIN3264 |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
139 typedef int HANDLE; |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
140 #endif |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
141 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
|
142 typedef int XSUBADDR_t; |
5706 | 143 #endif |
144 #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
|
145 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
|
146 #endif |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
147 |
2372
a42d19b78c93
Fix building with Perl on Windows with MingW. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2370
diff
changeset
|
148 #ifndef WIN3264 |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
149 #include <dlfcn.h> |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
150 #define HANDLE void* |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
151 #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
|
152 #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
|
153 #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
|
154 #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
|
155 #else |
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
156 #define PERL_PROC FARPROC |
2612 | 157 #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
|
158 #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
|
159 #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
|
160 #endif |
7 | 161 /* |
162 * Wrapper defines | |
163 */ | |
164 # define perl_alloc dll_perl_alloc | |
165 # define perl_construct dll_perl_construct | |
166 # define perl_parse dll_perl_parse | |
167 # define perl_run dll_perl_run | |
168 # define perl_destruct dll_perl_destruct | |
169 # define perl_free dll_perl_free | |
170 # define Perl_get_context dll_Perl_get_context | |
171 # define Perl_croak dll_Perl_croak | |
2096
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
172 # ifdef PERL5101_OR_LATER |
2079
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
173 # 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
|
174 # endif |
7 | 175 # ifndef PROTO |
176 # define Perl_croak_nocontext dll_Perl_croak_nocontext | |
177 # define Perl_call_argv dll_Perl_call_argv | |
178 # define Perl_call_pv dll_Perl_call_pv | |
179 # define Perl_eval_sv dll_Perl_eval_sv | |
180 # define Perl_get_sv dll_Perl_get_sv | |
181 # define Perl_eval_pv dll_Perl_eval_pv | |
182 # define Perl_call_method dll_Perl_call_method | |
183 # endif | |
184 # define Perl_dowantarray dll_Perl_dowantarray | |
185 # define Perl_free_tmps dll_Perl_free_tmps | |
186 # define Perl_gv_stashpv dll_Perl_gv_stashpv | |
187 # define Perl_markstack_grow dll_Perl_markstack_grow | |
188 # define Perl_mg_find dll_Perl_mg_find | |
189 # define Perl_newXS dll_Perl_newXS | |
190 # define Perl_newSV dll_Perl_newSV | |
191 # define Perl_newSViv dll_Perl_newSViv | |
192 # define Perl_newSVpv dll_Perl_newSVpv | |
193 # define Perl_pop_scope dll_Perl_pop_scope | |
194 # define Perl_push_scope dll_Perl_push_scope | |
195 # define Perl_save_int dll_Perl_save_int | |
5960 | 196 # if (PERL_REVISION == 5) && (PERL_VERSION >= 20) |
197 # define Perl_save_strlen dll_Perl_save_strlen | |
198 # endif | |
7 | 199 # define Perl_stack_grow dll_Perl_stack_grow |
200 # define Perl_set_context dll_Perl_set_context | |
3050 | 201 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
6872 | 202 # define Perl_sv_2bool_flags dll_Perl_sv_2bool_flags |
203 # if (PERL_REVISION == 5) && (PERL_VERSION < 22) | |
204 # define Perl_xs_apiversion_bootcheck dll_Perl_xs_apiversion_bootcheck | |
205 # endif | |
3050 | 206 # else |
6872 | 207 # define Perl_sv_2bool dll_Perl_sv_2bool |
3050 | 208 # endif |
7 | 209 # define Perl_sv_2iv dll_Perl_sv_2iv |
210 # define Perl_sv_2mortal dll_Perl_sv_2mortal | |
211 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
212 # define Perl_sv_2pv_flags dll_Perl_sv_2pv_flags | |
213 # define Perl_sv_2pv_nolen dll_Perl_sv_2pv_nolen | |
214 # else | |
215 # define Perl_sv_2pv dll_Perl_sv_2pv | |
216 # endif | |
217 # define Perl_sv_bless dll_Perl_sv_bless | |
218 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
219 # define Perl_sv_catpvn_flags dll_Perl_sv_catpvn_flags | |
220 # else | |
221 # define Perl_sv_catpvn dll_Perl_sv_catpvn | |
222 # endif | |
1387 | 223 #ifdef PERL589_OR_LATER |
224 # define Perl_sv_2iv_flags dll_Perl_sv_2iv_flags | |
225 # define Perl_newXS_flags dll_Perl_newXS_flags | |
226 #endif | |
7 | 227 # define Perl_sv_free dll_Perl_sv_free |
1711 | 228 # if (PERL_REVISION == 5) && (PERL_VERSION >= 10) |
229 # define Perl_sv_free2 dll_Perl_sv_free2 | |
230 # endif | |
7 | 231 # define Perl_sv_isa dll_Perl_sv_isa |
232 # define Perl_sv_magic dll_Perl_sv_magic | |
233 # define Perl_sv_setiv dll_Perl_sv_setiv | |
234 # define Perl_sv_setpv dll_Perl_sv_setpv | |
235 # define Perl_sv_setpvn dll_Perl_sv_setpvn | |
236 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
237 # define Perl_sv_setsv_flags dll_Perl_sv_setsv_flags | |
238 # else | |
239 # define Perl_sv_setsv dll_Perl_sv_setsv | |
240 # endif | |
241 # define Perl_sv_upgrade dll_Perl_sv_upgrade | |
242 # define Perl_Tstack_sp_ptr dll_Perl_Tstack_sp_ptr | |
243 # define Perl_Top_ptr dll_Perl_Top_ptr | |
244 # define Perl_Tstack_base_ptr dll_Perl_Tstack_base_ptr | |
245 # define Perl_Tstack_max_ptr dll_Perl_Tstack_max_ptr | |
246 # define Perl_Ttmps_ix_ptr dll_Perl_Ttmps_ix_ptr | |
247 # define Perl_Ttmps_floor_ptr dll_Perl_Ttmps_floor_ptr | |
248 # define Perl_Tmarkstack_ptr_ptr dll_Perl_Tmarkstack_ptr_ptr | |
249 # define Perl_Tmarkstack_max_ptr dll_Perl_Tmarkstack_max_ptr | |
250 # define Perl_TSv_ptr dll_Perl_TSv_ptr | |
251 # define Perl_TXpv_ptr dll_Perl_TXpv_ptr | |
252 # define Perl_Tna_ptr dll_Perl_Tna_ptr | |
253 # define Perl_Idefgv_ptr dll_Perl_Idefgv_ptr | |
254 # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr | |
255 # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr | |
256 # 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
|
257 # define Perl_Gthr_key_ptr dll_Perl_Gthr_key_ptr |
7 | 258 |
1765 | 259 # define Perl_sys_init dll_Perl_sys_init |
1668 | 260 # define Perl_sys_term dll_Perl_sys_term |
261 # define Perl_ISv_ptr dll_Perl_ISv_ptr | |
262 # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr | |
263 # define Perl_Istack_base_ptr dll_Perl_Istack_base_ptr | |
264 # define Perl_Itmps_ix_ptr dll_Perl_Itmps_ix_ptr | |
265 # define Perl_Itmps_floor_ptr dll_Perl_Itmps_floor_ptr | |
266 # define Perl_IXpv_ptr dll_Perl_IXpv_ptr | |
267 # define Perl_Ina_ptr dll_Perl_Ina_ptr | |
268 # define Perl_Imarkstack_ptr_ptr dll_Perl_Imarkstack_ptr_ptr | |
269 # define Perl_Imarkstack_max_ptr dll_Perl_Imarkstack_max_ptr | |
270 # define Perl_Istack_sp_ptr dll_Perl_Istack_sp_ptr | |
271 # define Perl_Iop_ptr dll_Perl_Iop_ptr | |
272 # define Perl_call_list dll_Perl_call_list | |
273 # define Perl_Iscopestack_ix_ptr dll_Perl_Iscopestack_ix_ptr | |
274 # define Perl_Iunitcheckav_ptr dll_Perl_Iunitcheckav_ptr | |
6872 | 275 # if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
276 # define Perl_xs_handshake dll_Perl_xs_handshake | |
277 # define Perl_xs_boot_epilog dll_Perl_xs_boot_epilog | |
278 # endif | |
3820 | 279 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
5706 | 280 # ifdef USE_ITHREADS |
281 # define PL_thr_key *dll_PL_thr_key | |
282 # endif | |
3820 | 283 # endif |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
284 # define Perl_hv_iternext_flags dll_Perl_hv_iternext_flags |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
285 # define Perl_hv_iterinit dll_Perl_hv_iterinit |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
286 # define Perl_hv_iterkey dll_Perl_hv_iterkey |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
287 # define Perl_hv_iterval dll_Perl_hv_iterval |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
288 # define Perl_av_fetch dll_Perl_av_fetch |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
289 # define Perl_av_len dll_Perl_av_len |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
290 # define Perl_sv_2nv_flags dll_Perl_sv_2nv_flags |
1668 | 291 |
7 | 292 /* |
293 * Declare HANDLE for perl.dll and function pointers. | |
294 */ | |
295 static HANDLE hPerlLib = NULL; | |
296 | |
297 static PerlInterpreter* (*perl_alloc)(); | |
298 static void (*perl_construct)(PerlInterpreter*); | |
299 static void (*perl_destruct)(PerlInterpreter*); | |
300 static void (*perl_free)(PerlInterpreter*); | |
301 static int (*perl_run)(PerlInterpreter*); | |
302 static int (*perl_parse)(PerlInterpreter*, XSINIT_t, int, char**, char**); | |
303 static void* (*Perl_get_context)(void); | |
933 | 304 static void (*Perl_croak)(pTHX_ const char*, ...); |
2096
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
305 #ifdef PERL5101_OR_LATER |
5537 | 306 /* Perl-5.18 has a different Perl_croak_xs_usage signature. */ |
307 # if (PERL_REVISION == 5) && (PERL_VERSION >= 18) | |
308 static void (*Perl_croak_xs_usage)(const CV *const, const char *const params); | |
309 # else | |
2079
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
310 static void (*Perl_croak_xs_usage)(pTHX_ const CV *const, const char *const params); |
5537 | 311 # endif |
4905
517fa1a34c7c
updated for version 7.3.1198
Bram Moolenaar <bram@vim.org>
parents:
4352
diff
changeset
|
312 #endif |
933 | 313 static void (*Perl_croak_nocontext)(const char*, ...); |
7 | 314 static I32 (*Perl_dowantarray)(pTHX); |
315 static void (*Perl_free_tmps)(pTHX); | |
316 static HV* (*Perl_gv_stashpv)(pTHX_ const char*, I32); | |
6872 | 317 #if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
318 static I32* (*Perl_markstack_grow)(pTHX); | |
319 #else | |
7 | 320 static void (*Perl_markstack_grow)(pTHX); |
6872 | 321 #endif |
7 | 322 static MAGIC* (*Perl_mg_find)(pTHX_ SV*, int); |
323 static CV* (*Perl_newXS)(pTHX_ char*, XSUBADDR_t, char*); | |
324 static SV* (*Perl_newSV)(pTHX_ STRLEN); | |
325 static SV* (*Perl_newSViv)(pTHX_ IV); | |
326 static SV* (*Perl_newSVpv)(pTHX_ const char*, STRLEN); | |
327 static I32 (*Perl_call_argv)(pTHX_ const char*, I32, char**); | |
328 static I32 (*Perl_call_pv)(pTHX_ const char*, I32); | |
329 static I32 (*Perl_eval_sv)(pTHX_ SV*, I32); | |
330 static SV* (*Perl_get_sv)(pTHX_ const char*, I32); | |
331 static SV* (*Perl_eval_pv)(pTHX_ const char*, I32); | |
332 static SV* (*Perl_call_method)(pTHX_ const char*, I32); | |
333 static void (*Perl_pop_scope)(pTHX); | |
334 static void (*Perl_push_scope)(pTHX); | |
335 static void (*Perl_save_int)(pTHX_ int*); | |
5960 | 336 #if (PERL_REVISION == 5) && (PERL_VERSION >= 20) |
337 static void (*Perl_save_strlen)(pTHX_ STRLEN* ptr); | |
338 #endif | |
7 | 339 static SV** (*Perl_stack_grow)(pTHX_ SV**, SV**p, int); |
340 static SV** (*Perl_set_context)(void*); | |
3050 | 341 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
342 static bool (*Perl_sv_2bool_flags)(pTHX_ SV*, I32); | |
6872 | 343 # if (PERL_REVISION == 5) && (PERL_VERSION < 22) |
3050 | 344 static void (*Perl_xs_apiversion_bootcheck)(pTHX_ SV *module, const char *api_p, STRLEN api_len); |
6872 | 345 # endif |
3050 | 346 #else |
7 | 347 static bool (*Perl_sv_2bool)(pTHX_ SV*); |
3050 | 348 #endif |
7 | 349 static IV (*Perl_sv_2iv)(pTHX_ SV*); |
350 static SV* (*Perl_sv_2mortal)(pTHX_ SV*); | |
351 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
352 static char* (*Perl_sv_2pv_flags)(pTHX_ SV*, STRLEN*, I32); | |
353 static char* (*Perl_sv_2pv_nolen)(pTHX_ SV*); | |
354 #else | |
355 static char* (*Perl_sv_2pv)(pTHX_ SV*, STRLEN*); | |
356 #endif | |
357 static SV* (*Perl_sv_bless)(pTHX_ SV*, HV*); | |
358 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
359 static void (*Perl_sv_catpvn_flags)(pTHX_ SV* , const char*, STRLEN, I32); | |
360 #else | |
361 static void (*Perl_sv_catpvn)(pTHX_ SV*, const char*, STRLEN); | |
362 #endif | |
1387 | 363 #ifdef PERL589_OR_LATER |
364 static IV (*Perl_sv_2iv_flags)(pTHX_ SV* sv, I32 flags); | |
365 static CV * (*Perl_newXS_flags)(pTHX_ const char *name, XSUBADDR_t subaddr, const char *const filename, const char *const proto, U32 flags); | |
366 #endif | |
7 | 367 static void (*Perl_sv_free)(pTHX_ SV*); |
368 static int (*Perl_sv_isa)(pTHX_ SV*, const char*); | |
369 static void (*Perl_sv_magic)(pTHX_ SV*, SV*, int, const char*, I32); | |
370 static void (*Perl_sv_setiv)(pTHX_ SV*, IV); | |
371 static void (*Perl_sv_setpv)(pTHX_ SV*, const char*); | |
372 static void (*Perl_sv_setpvn)(pTHX_ SV*, const char*, STRLEN); | |
373 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
374 static void (*Perl_sv_setsv_flags)(pTHX_ SV*, SV*, I32); | |
375 #else | |
376 static void (*Perl_sv_setsv)(pTHX_ SV*, SV*); | |
377 #endif | |
378 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
|
379 #if (PERL_REVISION == 5) && (PERL_VERSION < 10) |
7 | 380 static SV*** (*Perl_Tstack_sp_ptr)(register PerlInterpreter*); |
381 static OP** (*Perl_Top_ptr)(register PerlInterpreter*); | |
382 static SV*** (*Perl_Tstack_base_ptr)(register PerlInterpreter*); | |
383 static SV*** (*Perl_Tstack_max_ptr)(register PerlInterpreter*); | |
384 static I32* (*Perl_Ttmps_ix_ptr)(register PerlInterpreter*); | |
385 static I32* (*Perl_Ttmps_floor_ptr)(register PerlInterpreter*); | |
386 static I32** (*Perl_Tmarkstack_ptr_ptr)(register PerlInterpreter*); | |
387 static I32** (*Perl_Tmarkstack_max_ptr)(register PerlInterpreter*); | |
388 static SV** (*Perl_TSv_ptr)(register PerlInterpreter*); | |
389 static XPV** (*Perl_TXpv_ptr)(register PerlInterpreter*); | |
390 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
|
391 #else |
5537 | 392 /* Perl-5.18 has a different Perl_sv_free2 signature. */ |
393 # if (PERL_REVISION == 5) && (PERL_VERSION >= 18) | |
394 static void (*Perl_sv_free2)(pTHX_ SV*, const U32); | |
395 # else | |
1711 | 396 static void (*Perl_sv_free2)(pTHX_ SV*); |
5537 | 397 # endif |
1765 | 398 static void (*Perl_sys_init)(int* argc, char*** argv); |
1668 | 399 static void (*Perl_sys_term)(void); |
3818 | 400 static void (*Perl_call_list)(pTHX_ I32, AV*); |
401 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) | |
402 # else | |
1668 | 403 static SV** (*Perl_ISv_ptr)(register PerlInterpreter*); |
404 static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*); | |
405 static SV*** (*Perl_Istack_base_ptr)(register PerlInterpreter*); | |
406 static XPV** (*Perl_IXpv_ptr)(register PerlInterpreter*); | |
407 static I32* (*Perl_Itmps_ix_ptr)(register PerlInterpreter*); | |
408 static I32* (*Perl_Itmps_floor_ptr)(register PerlInterpreter*); | |
409 static STRLEN* (*Perl_Ina_ptr)(register PerlInterpreter*); | |
410 static I32** (*Perl_Imarkstack_ptr_ptr)(register PerlInterpreter*); | |
411 static I32** (*Perl_Imarkstack_max_ptr)(register PerlInterpreter*); | |
412 static SV*** (*Perl_Istack_sp_ptr)(register PerlInterpreter*); | |
413 static OP** (*Perl_Iop_ptr)(register PerlInterpreter*); | |
414 static I32* (*Perl_Iscopestack_ix_ptr)(register PerlInterpreter*); | |
415 static AV** (*Perl_Iunitcheckav_ptr)(register PerlInterpreter*); | |
3818 | 416 # endif |
1668 | 417 #endif |
6872 | 418 #if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
419 static I32 (*Perl_xs_handshake)(const U32, void *, const char *, ...); | |
420 static void (*Perl_xs_boot_epilog)(pTHX_ const U32); | |
421 #endif | |
7 | 422 |
3818 | 423 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
5706 | 424 # ifdef USE_ITHREADS |
3820 | 425 static perl_key* dll_PL_thr_key; |
5706 | 426 # endif |
3818 | 427 #else |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
428 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
|
429 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
|
430 static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); |
3818 | 431 static perl_key* (*Perl_Gthr_key_ptr)_((pTHX)); |
432 #endif | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
433 static void (*boot_DynaLoader)_((pTHX_ CV*)); |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
434 static HE * (*Perl_hv_iternext_flags)(pTHX_ HV *, I32); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
435 static I32 (*Perl_hv_iterinit)(pTHX_ HV *); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
436 static char * (*Perl_hv_iterkey)(pTHX_ HE *, I32 *); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
437 static SV * (*Perl_hv_iterval)(pTHX_ HV *, HE *); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
438 static SV** (*Perl_av_fetch)(pTHX_ AV *, SSize_t, I32); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
439 static SSize_t (*Perl_av_len)(pTHX_ AV *); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
440 static NV (*Perl_sv_2nv_flags)(pTHX_ SV *const, const I32); |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
441 |
7 | 442 /* |
443 * Table of name to function pointer of perl. | |
444 */ | |
445 static struct { | |
446 char* name; | |
447 PERL_PROC* ptr; | |
448 } perl_funcname_table[] = { | |
449 {"perl_alloc", (PERL_PROC*)&perl_alloc}, | |
450 {"perl_construct", (PERL_PROC*)&perl_construct}, | |
451 {"perl_destruct", (PERL_PROC*)&perl_destruct}, | |
452 {"perl_free", (PERL_PROC*)&perl_free}, | |
453 {"perl_run", (PERL_PROC*)&perl_run}, | |
454 {"perl_parse", (PERL_PROC*)&perl_parse}, | |
455 {"Perl_get_context", (PERL_PROC*)&Perl_get_context}, | |
456 {"Perl_croak", (PERL_PROC*)&Perl_croak}, | |
2096
6510d834609f
updated for version 7.2.380
Bram Moolenaar <bram@zimbu.org>
parents:
2079
diff
changeset
|
457 #ifdef PERL5101_OR_LATER |
2079
5abd3e3c0085
updated for version 7.2.363
Bram Moolenaar <bram@zimbu.org>
parents:
1990
diff
changeset
|
458 {"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
|
459 #endif |
5706 | 460 #ifdef PERL_IMPLICIT_CONTEXT |
7 | 461 {"Perl_croak_nocontext", (PERL_PROC*)&Perl_croak_nocontext}, |
5706 | 462 #endif |
7 | 463 {"Perl_dowantarray", (PERL_PROC*)&Perl_dowantarray}, |
464 {"Perl_free_tmps", (PERL_PROC*)&Perl_free_tmps}, | |
465 {"Perl_gv_stashpv", (PERL_PROC*)&Perl_gv_stashpv}, | |
466 {"Perl_markstack_grow", (PERL_PROC*)&Perl_markstack_grow}, | |
467 {"Perl_mg_find", (PERL_PROC*)&Perl_mg_find}, | |
468 {"Perl_newXS", (PERL_PROC*)&Perl_newXS}, | |
469 {"Perl_newSV", (PERL_PROC*)&Perl_newSV}, | |
470 {"Perl_newSViv", (PERL_PROC*)&Perl_newSViv}, | |
471 {"Perl_newSVpv", (PERL_PROC*)&Perl_newSVpv}, | |
472 {"Perl_call_argv", (PERL_PROC*)&Perl_call_argv}, | |
473 {"Perl_call_pv", (PERL_PROC*)&Perl_call_pv}, | |
474 {"Perl_eval_sv", (PERL_PROC*)&Perl_eval_sv}, | |
475 {"Perl_get_sv", (PERL_PROC*)&Perl_get_sv}, | |
476 {"Perl_eval_pv", (PERL_PROC*)&Perl_eval_pv}, | |
477 {"Perl_call_method", (PERL_PROC*)&Perl_call_method}, | |
478 {"Perl_pop_scope", (PERL_PROC*)&Perl_pop_scope}, | |
479 {"Perl_push_scope", (PERL_PROC*)&Perl_push_scope}, | |
480 {"Perl_save_int", (PERL_PROC*)&Perl_save_int}, | |
5960 | 481 #if (PERL_REVISION == 5) && (PERL_VERSION >= 20) |
482 {"Perl_save_strlen", (PERL_PROC*)&Perl_save_strlen}, | |
483 #endif | |
7 | 484 {"Perl_stack_grow", (PERL_PROC*)&Perl_stack_grow}, |
485 {"Perl_set_context", (PERL_PROC*)&Perl_set_context}, | |
3050 | 486 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
487 {"Perl_sv_2bool_flags", (PERL_PROC*)&Perl_sv_2bool_flags}, | |
6872 | 488 # if (PERL_REVISION == 5) && (PERL_VERSION < 22) |
3050 | 489 {"Perl_xs_apiversion_bootcheck",(PERL_PROC*)&Perl_xs_apiversion_bootcheck}, |
6872 | 490 # endif |
3050 | 491 #else |
7 | 492 {"Perl_sv_2bool", (PERL_PROC*)&Perl_sv_2bool}, |
3050 | 493 #endif |
7 | 494 {"Perl_sv_2iv", (PERL_PROC*)&Perl_sv_2iv}, |
495 {"Perl_sv_2mortal", (PERL_PROC*)&Perl_sv_2mortal}, | |
496 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
497 {"Perl_sv_2pv_flags", (PERL_PROC*)&Perl_sv_2pv_flags}, | |
498 {"Perl_sv_2pv_nolen", (PERL_PROC*)&Perl_sv_2pv_nolen}, | |
499 #else | |
500 {"Perl_sv_2pv", (PERL_PROC*)&Perl_sv_2pv}, | |
501 #endif | |
1387 | 502 #ifdef PERL589_OR_LATER |
503 {"Perl_sv_2iv_flags", (PERL_PROC*)&Perl_sv_2iv_flags}, | |
504 {"Perl_newXS_flags", (PERL_PROC*)&Perl_newXS_flags}, | |
505 #endif | |
7 | 506 {"Perl_sv_bless", (PERL_PROC*)&Perl_sv_bless}, |
507 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
508 {"Perl_sv_catpvn_flags", (PERL_PROC*)&Perl_sv_catpvn_flags}, | |
509 #else | |
510 {"Perl_sv_catpvn", (PERL_PROC*)&Perl_sv_catpvn}, | |
511 #endif | |
512 {"Perl_sv_free", (PERL_PROC*)&Perl_sv_free}, | |
513 {"Perl_sv_isa", (PERL_PROC*)&Perl_sv_isa}, | |
514 {"Perl_sv_magic", (PERL_PROC*)&Perl_sv_magic}, | |
515 {"Perl_sv_setiv", (PERL_PROC*)&Perl_sv_setiv}, | |
516 {"Perl_sv_setpv", (PERL_PROC*)&Perl_sv_setpv}, | |
517 {"Perl_sv_setpvn", (PERL_PROC*)&Perl_sv_setpvn}, | |
518 #if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
519 {"Perl_sv_setsv_flags", (PERL_PROC*)&Perl_sv_setsv_flags}, | |
520 #else | |
521 {"Perl_sv_setsv", (PERL_PROC*)&Perl_sv_setsv}, | |
522 #endif | |
523 {"Perl_sv_upgrade", (PERL_PROC*)&Perl_sv_upgrade}, | |
1668 | 524 #if (PERL_REVISION == 5) && (PERL_VERSION < 10) |
7 | 525 {"Perl_Tstack_sp_ptr", (PERL_PROC*)&Perl_Tstack_sp_ptr}, |
526 {"Perl_Top_ptr", (PERL_PROC*)&Perl_Top_ptr}, | |
527 {"Perl_Tstack_base_ptr", (PERL_PROC*)&Perl_Tstack_base_ptr}, | |
528 {"Perl_Tstack_max_ptr", (PERL_PROC*)&Perl_Tstack_max_ptr}, | |
529 {"Perl_Ttmps_ix_ptr", (PERL_PROC*)&Perl_Ttmps_ix_ptr}, | |
530 {"Perl_Ttmps_floor_ptr", (PERL_PROC*)&Perl_Ttmps_floor_ptr}, | |
531 {"Perl_Tmarkstack_ptr_ptr", (PERL_PROC*)&Perl_Tmarkstack_ptr_ptr}, | |
532 {"Perl_Tmarkstack_max_ptr", (PERL_PROC*)&Perl_Tmarkstack_max_ptr}, | |
533 {"Perl_TSv_ptr", (PERL_PROC*)&Perl_TSv_ptr}, | |
534 {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr}, | |
535 {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr}, | |
1668 | 536 #else |
1711 | 537 {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2}, |
1765 | 538 {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init}, |
1668 | 539 {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term}, |
3050 | 540 {"Perl_call_list", (PERL_PROC*)&Perl_call_list}, |
541 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) | |
542 # else | |
1668 | 543 {"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
|
544 {"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr}, |
1668 | 545 {"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
|
546 {"Perl_IXpv_ptr", (PERL_PROC*)&Perl_IXpv_ptr}, |
1668 | 547 {"Perl_Itmps_ix_ptr", (PERL_PROC*)&Perl_Itmps_ix_ptr}, |
548 {"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
|
549 {"Perl_Ina_ptr", (PERL_PROC*)&Perl_Ina_ptr}, |
1668 | 550 {"Perl_Imarkstack_ptr_ptr", (PERL_PROC*)&Perl_Imarkstack_ptr_ptr}, |
551 {"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
|
552 {"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
|
553 {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr}, |
1668 | 554 {"Perl_Iscopestack_ix_ptr", (PERL_PROC*)&Perl_Iscopestack_ix_ptr}, |
555 {"Perl_Iunitcheckav_ptr", (PERL_PROC*)&Perl_Iunitcheckav_ptr}, | |
3050 | 556 # endif |
1668 | 557 #endif |
6872 | 558 #if (PERL_REVISION == 5) && (PERL_VERSION >= 22) |
559 {"Perl_xs_handshake", (PERL_PROC*)&Perl_xs_handshake}, | |
560 {"Perl_xs_boot_epilog", (PERL_PROC*)&Perl_xs_boot_epilog}, | |
561 #endif | |
3050 | 562 #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) |
5706 | 563 # ifdef USE_ITHREADS |
3820 | 564 {"PL_thr_key", (PERL_PROC*)&dll_PL_thr_key}, |
5706 | 565 # endif |
3050 | 566 #else |
7 | 567 {"Perl_Idefgv_ptr", (PERL_PROC*)&Perl_Idefgv_ptr}, |
568 {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr}, | |
569 {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr}, | |
3050 | 570 {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr}, |
571 #endif | |
7 | 572 {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader}, |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
573 {"Perl_hv_iternext_flags", (PERL_PROC*)&Perl_hv_iternext_flags}, |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
574 {"Perl_hv_iterinit", (PERL_PROC*)&Perl_hv_iterinit}, |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
575 {"Perl_hv_iterkey", (PERL_PROC*)&Perl_hv_iterkey}, |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
576 {"Perl_hv_iterval", (PERL_PROC*)&Perl_hv_iterval}, |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
577 {"Perl_av_fetch", (PERL_PROC*)&Perl_av_fetch}, |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
578 {"Perl_av_len", (PERL_PROC*)&Perl_av_len}, |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
579 {"Perl_sv_2nv_flags", (PERL_PROC*)&Perl_sv_2nv_flags}, |
7 | 580 {"", NULL}, |
581 }; | |
582 | |
5537 | 583 /* Work around for perl-5.18. |
584 * The definitions of S_SvREFCNT_inc and S_SvREFCNT_dec are needed, so include | |
585 * "perl\lib\CORE\inline.h", after Perl_sv_free2 is defined. | |
586 * The linker won't complain about undefined __impl_Perl_sv_free2. */ | |
587 #if (PERL_REVISION == 5) && (PERL_VERSION >= 18) | |
588 # include <inline.h> | |
589 #endif | |
590 | |
7 | 591 /* |
592 * Make all runtime-links of perl. | |
593 * | |
5267
585b623a1aa3
updated for version 7.4b.010
Bram Moolenaar <bram@vim.org>
parents:
5261
diff
changeset
|
594 * 1. Get module handle using dlopen() or vimLoadLib(). |
7 | 595 * 2. Get pointer to perl function by GetProcAddress. |
596 * 3. Repeat 2, until get all functions will be used. | |
597 * | |
598 * Parameter 'libname' provides name of DLL. | |
599 * Return OK or FAIL. | |
600 */ | |
601 static int | |
602 perl_runtime_link_init(char *libname, int verbose) | |
603 { | |
604 int i; | |
605 | |
606 if (hPerlLib != NULL) | |
607 return OK; | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
608 if ((hPerlLib = load_dll(libname)) == NULL) |
7 | 609 { |
610 if (verbose) | |
611 EMSG2(_("E370: Could not load library %s"), libname); | |
612 return FAIL; | |
613 } | |
614 for (i = 0; perl_funcname_table[i].ptr; ++i) | |
615 { | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
616 if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib, |
7 | 617 perl_funcname_table[i].name))) |
618 { | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
619 close_dll(hPerlLib); |
7 | 620 hPerlLib = NULL; |
621 if (verbose) | |
622 EMSG2(_(e_loadfunc), perl_funcname_table[i].name); | |
623 return FAIL; | |
624 } | |
625 } | |
626 return OK; | |
627 } | |
628 | |
629 /* | |
630 * If runtime-link-perl(DLL) was loaded successfully, return TRUE. | |
631 * There were no DLL loaded, return FALSE. | |
632 */ | |
633 int | |
634 perl_enabled(verbose) | |
635 int verbose; | |
636 { | |
7528
53163e4d9e4f
commit https://github.com/vim/vim/commit/25e4fcde767084d1a79e0926bc301c92987c0cce
Christian Brabandt <cb@256bit.org>
parents:
7198
diff
changeset
|
637 return perl_runtime_link_init((char *)p_perldll, verbose) == OK; |
7 | 638 } |
639 #endif /* DYNAMIC_PERL */ | |
640 | |
641 /* | |
642 * perl_init(): initialize perl interpreter | |
643 * We have to call perl_parse to initialize some structures, | |
644 * there's nothing to actually parse. | |
645 */ | |
646 static void | |
647 perl_init() | |
648 { | |
1668 | 649 char *bootargs[] = { "VI", NULL }; |
650 int argc = 3; | |
651 static char *argv[] = { "", "-e", "" }; | |
7 | 652 |
1668 | 653 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) |
1765 | 654 Perl_sys_init(&argc, (char***)&argv); |
1668 | 655 #endif |
7 | 656 perl_interp = perl_alloc(); |
657 perl_construct(perl_interp); | |
1668 | 658 perl_parse(perl_interp, xs_init, argc, argv, 0); |
7 | 659 perl_call_argv("VIM::bootstrap", (long)G_DISCARD, bootargs); |
660 VIM_init(); | |
661 #ifdef USE_SFIO | |
662 sfdisc(PerlIO_stdout(), sfdcnewvim()); | |
663 sfdisc(PerlIO_stderr(), sfdcnewvim()); | |
664 sfsetbuf(PerlIO_stdout(), NULL, 0); | |
665 sfsetbuf(PerlIO_stderr(), NULL, 0); | |
666 #endif | |
667 } | |
668 | |
669 /* | |
670 * perl_end(): clean up after ourselves | |
671 */ | |
672 void | |
673 perl_end() | |
674 { | |
675 if (perl_interp) | |
676 { | |
677 perl_run(perl_interp); | |
678 perl_destruct(perl_interp); | |
679 perl_free(perl_interp); | |
680 perl_interp = NULL; | |
1668 | 681 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
682 Perl_sys_term(); |
1668 | 683 #endif |
7 | 684 } |
685 #ifdef DYNAMIC_PERL | |
686 if (hPerlLib) | |
687 { | |
2370
454f314d0e61
Make it possible to load Perl dynamically on Unix. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2255
diff
changeset
|
688 close_dll(hPerlLib); |
7 | 689 hPerlLib = NULL; |
690 } | |
691 #endif | |
692 } | |
693 | |
694 /* | |
695 * msg_split(): send a message to the message handling routines | |
696 * split at '\n' first though. | |
697 */ | |
698 void | |
699 msg_split(s, attr) | |
700 char_u *s; | |
701 int attr; /* highlighting attributes */ | |
702 { | |
703 char *next; | |
704 char *token = (char *)s; | |
705 | |
1423 | 706 while ((next = strchr(token, '\n')) && !got_int) |
7 | 707 { |
708 *next++ = '\0'; /* replace \n with \0 */ | |
709 msg_attr((char_u *)token, attr); | |
710 token = next; | |
711 } | |
1423 | 712 if (*token && !got_int) |
7 | 713 msg_attr((char_u *)token, attr); |
714 } | |
715 | |
716 #ifndef FEAT_EVAL | |
717 /* | |
718 * This stub is needed because an "#ifdef FEAT_EVAL" around Eval() doesn't | |
719 * work properly. | |
720 */ | |
721 char_u * | |
714 | 722 eval_to_string(arg, nextcmd, dolist) |
4135 | 723 char_u *arg UNUSED; |
724 char_u **nextcmd UNUSED; | |
725 int dolist UNUSED; | |
7 | 726 { |
727 return NULL; | |
728 } | |
729 #endif | |
730 | |
731 /* | |
732 * Create a new reference to an SV pointing to the SCR structure | |
502 | 733 * The b_perl_private/w_perl_private part of the SCR structure points to the |
734 * SV, so there can only be one such SV for a particular SCR structure. When | |
735 * the last reference has gone (DESTROY is called), | |
736 * b_perl_private/w_perl_private is reset; When the screen goes away before | |
7 | 737 * all references are gone, the value of the SV is reset; |
738 * any subsequent use of any of those reference will produce | |
739 * a warning. (see typemap) | |
740 */ | |
502 | 741 |
742 static SV * | |
743 newWINrv(rv, ptr) | |
744 SV *rv; | |
745 win_T *ptr; | |
746 { | |
747 sv_upgrade(rv, SVt_RV); | |
748 if (ptr->w_perl_private == NULL) | |
749 { | |
750 ptr->w_perl_private = newSV(0); | |
3344 | 751 sv_setiv(ptr->w_perl_private, PTR2IV(ptr)); |
502 | 752 } |
753 else | |
754 SvREFCNT_inc(ptr->w_perl_private); | |
755 SvRV(rv) = ptr->w_perl_private; | |
756 SvROK_on(rv); | |
757 return sv_bless(rv, gv_stashpv("VIWIN", TRUE)); | |
7 | 758 } |
759 | |
502 | 760 static SV * |
761 newBUFrv(rv, ptr) | |
762 SV *rv; | |
763 buf_T *ptr; | |
764 { | |
765 sv_upgrade(rv, SVt_RV); | |
766 if (ptr->b_perl_private == NULL) | |
767 { | |
768 ptr->b_perl_private = newSV(0); | |
3344 | 769 sv_setiv(ptr->b_perl_private, PTR2IV(ptr)); |
502 | 770 } |
771 else | |
772 SvREFCNT_inc(ptr->b_perl_private); | |
773 SvRV(rv) = ptr->b_perl_private; | |
774 SvROK_on(rv); | |
775 return sv_bless(rv, gv_stashpv("VIBUF", TRUE)); | |
776 } | |
7 | 777 |
778 /* | |
779 * perl_win_free | |
4352 | 780 * Remove all references to the window to be destroyed |
7 | 781 */ |
782 void | |
783 perl_win_free(wp) | |
784 win_T *wp; | |
785 { | |
502 | 786 if (wp->w_perl_private) |
787 sv_setiv((SV *)wp->w_perl_private, 0); | |
7 | 788 return; |
789 } | |
790 | |
791 void | |
792 perl_buf_free(bp) | |
793 buf_T *bp; | |
794 { | |
502 | 795 if (bp->b_perl_private) |
796 sv_setiv((SV *)bp->b_perl_private, 0); | |
7 | 797 return; |
798 } | |
799 | |
800 #ifndef PROTO | |
801 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
802 I32 cur_val(pTHX_ IV iv, SV *sv); | |
803 # else | |
804 I32 cur_val(IV iv, SV *sv); | |
805 #endif | |
806 | |
807 /* | |
808 * Handler for the magic variables $main::curwin and $main::curbuf. | |
809 * The handler is put into the magic vtbl for these variables. | |
810 * (This is effectively a C-level equivalent of a tied variable). | |
811 * There is no "set" function as the variables are read-only. | |
812 */ | |
813 # if (PERL_REVISION == 5) && (PERL_VERSION >= 8) | |
814 I32 cur_val(pTHX_ IV iv, SV *sv) | |
815 # else | |
816 I32 cur_val(IV iv, SV *sv) | |
817 # endif | |
818 { | |
819 SV *rv; | |
820 if (iv == 0) | |
821 rv = newWINrv(newSV(0), curwin); | |
822 else | |
823 rv = newBUFrv(newSV(0), curbuf); | |
824 sv_setsv(sv, rv); | |
825 return 0; | |
826 } | |
827 #endif /* !PROTO */ | |
828 | |
829 struct ufuncs cw_funcs = { cur_val, 0, 0 }; | |
830 struct ufuncs cb_funcs = { cur_val, 0, 1 }; | |
831 | |
832 /* | |
833 * VIM_init(): Vim-specific initialisation. | |
834 * Make the magical main::curwin and main::curbuf variables | |
835 */ | |
836 static void | |
837 VIM_init() | |
838 { | |
839 static char cw[] = "main::curwin"; | |
840 static char cb[] = "main::curbuf"; | |
841 SV *sv; | |
842 | |
843 sv = perl_get_sv(cw, TRUE); | |
844 sv_magic(sv, NULL, 'U', (char *)&cw_funcs, sizeof(cw_funcs)); | |
845 SvREADONLY_on(sv); | |
846 | |
847 sv = perl_get_sv(cb, TRUE); | |
848 sv_magic(sv, NULL, 'U', (char *)&cb_funcs, sizeof(cb_funcs)); | |
849 SvREADONLY_on(sv); | |
850 | |
851 /* | |
852 * Setup the Safe compartment. | |
853 * It shouldn't be a fatal error if the Safe module is missing. | |
854 * XXX: Only shares the 'Msg' routine (which has to be called | |
855 * like 'Msg(...)'). | |
856 */ | |
857 (void)perl_eval_pv( "if ( eval( 'require Safe' ) ) { $VIM::safe = Safe->new(); $VIM::safe->share_from( 'VIM', ['Msg'] ); }", G_DISCARD | G_VOID ); | |
858 | |
859 } | |
860 | |
861 #ifdef DYNAMIC_PERL | |
862 static char *e_noperl = N_("Sorry, this command is disabled: the Perl library could not be loaded."); | |
863 #endif | |
864 | |
865 /* | |
866 * ":perl" | |
867 */ | |
868 void | |
869 ex_perl(eap) | |
870 exarg_T *eap; | |
871 { | |
872 char *err; | |
873 char *script; | |
874 STRLEN length; | |
875 SV *sv; | |
2255 | 876 #ifdef HAVE_SANDBOX |
7 | 877 SV *safe; |
2255 | 878 #endif |
7 | 879 |
880 script = (char *)script_get(eap, eap->arg); | |
881 if (eap->skip) | |
882 { | |
883 vim_free(script); | |
884 return; | |
885 } | |
886 | |
887 if (perl_interp == NULL) | |
888 { | |
889 #ifdef DYNAMIC_PERL | |
890 if (!perl_enabled(TRUE)) | |
891 { | |
892 EMSG(_(e_noperl)); | |
893 vim_free(script); | |
894 return; | |
895 } | |
896 #endif | |
897 perl_init(); | |
898 } | |
899 | |
900 { | |
901 dSP; | |
902 ENTER; | |
903 SAVETMPS; | |
904 | |
905 if (script == NULL) | |
906 sv = newSVpv((char *)eap->arg, 0); | |
907 else | |
908 { | |
909 sv = newSVpv(script, 0); | |
910 vim_free(script); | |
911 } | |
912 | |
913 #ifdef HAVE_SANDBOX | |
914 if (sandbox) | |
915 { | |
2982 | 916 safe = perl_get_sv("VIM::safe", FALSE); |
1934 | 917 # ifndef MAKE_TEST /* avoid a warning for unreachable code */ |
1990 | 918 if (safe == NULL || !SvTRUE(safe)) |
7 | 919 EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module")); |
920 else | |
1934 | 921 # endif |
7 | 922 { |
923 PUSHMARK(SP); | |
924 XPUSHs(safe); | |
925 XPUSHs(sv); | |
926 PUTBACK; | |
927 perl_call_method("reval", G_DISCARD); | |
928 } | |
929 } | |
930 else | |
931 #endif | |
932 perl_eval_sv(sv, G_DISCARD | G_NOARGS); | |
933 | |
934 SvREFCNT_dec(sv); | |
935 | |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
936 err = CHECK_EVAL_ERR(length); |
7 | 937 |
938 FREETMPS; | |
939 LEAVE; | |
940 | |
941 if (!length) | |
942 return; | |
943 | |
944 msg_split((char_u *)err, highlight_attr[HLF_E]); | |
945 return; | |
946 } | |
947 } | |
948 | |
949 static int | |
950 replace_line(line, end) | |
951 linenr_T *line, *end; | |
952 { | |
953 char *str; | |
954 | |
955 if (SvOK(GvSV(PL_defgv))) | |
956 { | |
957 str = SvPV(GvSV(PL_defgv), PL_na); | |
958 ml_replace(*line, (char_u *)str, 1); | |
959 changed_bytes(*line, 0); | |
960 } | |
961 else | |
962 { | |
963 ml_delete(*line, FALSE); | |
964 deleted_lines_mark(*line, 1L); | |
965 --(*end); | |
966 --(*line); | |
967 } | |
968 return OK; | |
969 } | |
970 | |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
971 static struct ref_map_S { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
972 void *vim_ref; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
973 SV *perl_ref; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
974 struct ref_map_S *next; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
975 } *ref_map = NULL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
976 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
977 static void |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
978 ref_map_free(void) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
979 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
980 struct ref_map_S *tofree; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
981 struct ref_map_S *refs = ref_map; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
982 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
983 while (refs) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
984 tofree = refs; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
985 refs = refs->next; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
986 vim_free(tofree); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
987 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
988 ref_map = NULL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
989 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
990 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
991 static struct ref_map_S * |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
992 ref_map_find_SV(sv) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
993 SV *const sv; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
994 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
995 struct ref_map_S *refs = ref_map; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
996 int count = 350; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
997 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
998 while (refs) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
999 if (refs->perl_ref == sv) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1000 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1001 refs = refs->next; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1002 count--; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1003 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1004 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1005 if (!refs && count > 0) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1006 refs = (struct ref_map_S *)alloc(sizeof(struct ref_map_S)); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1007 if (!refs) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1008 return NULL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1009 refs->perl_ref = sv; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1010 refs->vim_ref = NULL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1011 refs->next = ref_map; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1012 ref_map = refs; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1013 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1014 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1015 return refs; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1016 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1017 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1018 static int |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1019 perl_to_vim(sv, rettv) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1020 SV *sv; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1021 typval_T *rettv; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1022 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1023 if (SvROK(sv)) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1024 sv = SvRV(sv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1025 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1026 switch (SvTYPE(sv)) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1027 case SVt_NULL: |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1028 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1029 case SVt_NV: /* float */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1030 #ifdef FEAT_FLOAT |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1031 rettv->v_type = VAR_FLOAT; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1032 rettv->vval.v_float = SvNV(sv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1033 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1034 #endif |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1035 case SVt_IV: /* integer */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1036 if (!SvROK(sv)) { /* references should be string */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1037 rettv->vval.v_number = SvIV(sv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1038 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1039 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1040 case SVt_PV: /* string */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1041 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1042 size_t len = 0; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1043 char * str_from = SvPV(sv, len); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1044 char_u *str_to = (char_u*)alloc(sizeof(char_u) * (len + 1)); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1045 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1046 if (str_to) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1047 str_to[len] = '\0'; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1048 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1049 while (len--) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1050 if (str_from[len] == '\0') |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1051 str_to[len] = '\n'; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1052 else |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1053 str_to[len] = str_from[len]; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1054 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1055 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1056 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1057 rettv->v_type = VAR_STRING; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1058 rettv->vval.v_string = str_to; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1059 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1060 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1061 case SVt_PVAV: /* list */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1062 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1063 SSize_t size; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1064 listitem_T * item; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1065 SV ** item2; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1066 list_T * list; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1067 struct ref_map_S * refs; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1068 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1069 if ((refs = ref_map_find_SV(sv)) == NULL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1070 return FAIL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1071 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1072 if (refs->vim_ref) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1073 list = (list_T *) refs->vim_ref; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1074 else |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1075 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1076 if ((list = list_alloc()) == NULL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1077 return FAIL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1078 refs->vim_ref = list; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1079 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1080 for (size = av_len((AV*)sv); size >= 0; size--) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1081 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1082 if ((item = listitem_alloc()) == NULL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1083 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1084 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1085 item->li_tv.v_type = VAR_NUMBER; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1086 item->li_tv.v_lock = 0; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1087 item->li_tv.vval.v_number = 0; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1088 list_insert(list, item, list->lv_first); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1089 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1090 item2 = av_fetch((AV *)sv, size, 0); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1091 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1092 if (item2 == NULL || *item2 == NULL || |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1093 perl_to_vim(*item2, &item->li_tv) == FAIL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1094 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1095 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1096 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1097 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1098 list->lv_refcount++; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1099 rettv->v_type = VAR_LIST; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1100 rettv->vval.v_list = list; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1101 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1102 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1103 case SVt_PVHV: /* dictionary */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1104 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1105 HE * entry; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1106 size_t key_len; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1107 char * key; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1108 dictitem_T * item; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1109 SV * item2; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1110 dict_T * dict; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1111 struct ref_map_S * refs; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1112 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1113 if ((refs = ref_map_find_SV(sv)) == NULL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1114 return FAIL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1115 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1116 if (refs->vim_ref) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1117 dict = (dict_T *) refs->vim_ref; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1118 else |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1119 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1120 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1121 if ((dict = dict_alloc()) == NULL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1122 return FAIL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1123 refs->vim_ref = dict; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1124 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1125 hv_iterinit((HV *)sv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1126 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1127 for (entry = hv_iternext((HV *)sv); entry; entry = hv_iternext((HV *)sv)) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1128 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1129 key_len = 0; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1130 key = hv_iterkey(entry, (I32 *)&key_len); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1131 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1132 if (!key || !key_len || strlen(key) < key_len) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1133 EMSG2("Malformed key Dictionary '%s'", key && *key ? key : "(empty)"); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1134 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1135 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1136 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1137 if ((item = dictitem_alloc((char_u *)key)) == NULL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1138 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1139 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1140 item->di_tv.v_type = VAR_NUMBER; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1141 item->di_tv.v_lock = 0; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1142 item->di_tv.vval.v_number = 0; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1143 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1144 if (dict_add(dict, item) == FAIL) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1145 dictitem_free(item); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1146 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1147 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1148 item2 = hv_iterval((HV *)sv, entry); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1149 if (item2 == NULL || perl_to_vim(item2, &item->di_tv) == FAIL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1150 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1151 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1152 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1153 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1154 dict->dv_refcount++; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1155 rettv->v_type = VAR_DICT; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1156 rettv->vval.v_dict = dict; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1157 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1158 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1159 default: /* not convertible */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1160 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1161 char *val = SvPV_nolen(sv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1162 rettv->v_type = VAR_STRING; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1163 rettv->vval.v_string = val ? vim_strsave((char_u *)val) : NULL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1164 break; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1165 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1166 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1167 return OK; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1168 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1169 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1170 /* |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1171 * "perleval()" |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1172 */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1173 void |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1174 do_perleval(str, rettv) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1175 char_u *str; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1176 typval_T *rettv; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1177 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1178 char *err = NULL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1179 STRLEN err_len = 0; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1180 SV *sv = NULL; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1181 #ifdef HAVE_SANDBOX |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1182 SV *safe; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1183 #endif |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1184 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1185 if (perl_interp == NULL) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1186 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1187 #ifdef DYNAMIC_PERL |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1188 if (!perl_enabled(TRUE)) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1189 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1190 EMSG(_(e_noperl)); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1191 return; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1192 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1193 #endif |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1194 perl_init(); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1195 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1196 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1197 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1198 dSP; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1199 ENTER; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1200 SAVETMPS; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1201 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1202 #ifdef HAVE_SANDBOX |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1203 if (sandbox) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1204 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1205 safe = get_sv("VIM::safe", FALSE); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1206 # ifndef MAKE_TEST /* avoid a warning for unreachable code */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1207 if (safe == NULL || !SvTRUE(safe)) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1208 EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module")); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1209 else |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1210 # endif |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1211 { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1212 sv = newSVpv((char *)str, 0); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1213 PUSHMARK(SP); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1214 XPUSHs(safe); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1215 XPUSHs(sv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1216 PUTBACK; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1217 call_method("reval", G_SCALAR); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1218 SPAGAIN; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1219 SvREFCNT_dec(sv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1220 sv = POPs; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1221 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1222 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1223 else |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1224 #endif /* HAVE_SANDBOX */ |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1225 sv = eval_pv((char *)str, 0); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1226 |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1227 if (sv) { |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1228 perl_to_vim(sv, rettv); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1229 ref_map_free(); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1230 err = CHECK_EVAL_ERR(err_len); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1231 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1232 PUTBACK; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1233 FREETMPS; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1234 LEAVE; |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1235 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1236 if (err_len) |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1237 msg_split((char_u *)err, highlight_attr[HLF_E]); |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1238 } |
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1239 |
7 | 1240 /* |
1241 * ":perldo". | |
1242 */ | |
1243 void | |
1244 ex_perldo(eap) | |
1245 exarg_T *eap; | |
1246 { | |
1247 STRLEN length; | |
1248 SV *sv; | |
1249 char *str; | |
1250 linenr_T i; | |
1251 | |
1252 if (bufempty()) | |
1253 return; | |
1254 | |
1255 if (perl_interp == NULL) | |
1256 { | |
1257 #ifdef DYNAMIC_PERL | |
1258 if (!perl_enabled(TRUE)) | |
1259 { | |
1260 EMSG(_(e_noperl)); | |
1261 return; | |
1262 } | |
1263 #endif | |
1264 perl_init(); | |
1265 } | |
1266 { | |
1267 dSP; | |
1268 length = strlen((char *)eap->arg); | |
129 | 1269 sv = newSV(length + sizeof("sub VIM::perldo {") - 1 + 1); |
1270 sv_setpvn(sv, "sub VIM::perldo {", sizeof("sub VIM::perldo {") - 1); | |
7 | 1271 sv_catpvn(sv, (char *)eap->arg, length); |
1272 sv_catpvn(sv, "}", 1); | |
1273 perl_eval_sv(sv, G_DISCARD | G_NOARGS); | |
1274 SvREFCNT_dec(sv); | |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1275 str = CHECK_EVAL_ERR(length); |
7 | 1276 if (length) |
1277 goto err; | |
1278 | |
1279 if (u_save(eap->line1 - 1, eap->line2 + 1) != OK) | |
1280 return; | |
1281 | |
1282 ENTER; | |
1283 SAVETMPS; | |
1284 for (i = eap->line1; i <= eap->line2; i++) | |
1285 { | |
129 | 1286 sv_setpv(GvSV(PL_defgv), (char *)ml_get(i)); |
7 | 1287 PUSHMARK(sp); |
1288 perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL); | |
7651
c7575b07de98
commit https://github.com/vim/vim/commit/e9b892ebcd8596bf813793a1eed5a460a9495a28
Christian Brabandt <cb@256bit.org>
parents:
7528
diff
changeset
|
1289 str = CHECK_EVAL_ERR(length); |
7 | 1290 if (length) |
1291 break; | |
1292 SPAGAIN; | |
1293 if (SvTRUEx(POPs)) | |
1294 { | |
1295 if (replace_line(&i, &eap->line2) != OK) | |
1296 { | |
1297 PUTBACK; | |
1298 break; | |
1299 } | |
1300 } | |
1301 PUTBACK; | |
1302 } | |
1303 FREETMPS; | |
1304 LEAVE; | |
1305 check_cursor(); | |
1306 update_screen(NOT_VALID); | |
1307 if (!length) | |
1308 return; | |
1309 | |
1310 err: | |
1311 msg_split((char_u *)str, highlight_attr[HLF_E]); | |
1312 return; | |
1313 } | |
1314 } | |
1315 | |
1681 | 1316 #ifndef FEAT_WINDOWS |
1317 int win_valid(win_T *w) { return TRUE; } | |
1318 int win_count() { return 1; } | |
1319 win_T *win_find_nr(int n) { return curwin; } | |
1320 #endif | |
1321 | |
7 | 1322 XS(boot_VIM); |
1323 | |
1324 static void | |
1325 xs_init(pTHX) | |
1326 { | |
1327 char *file = __FILE__; | |
1328 | |
1329 /* DynaLoader is a special case */ | |
1330 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); | |
1331 newXS("VIM::bootstrap", boot_VIM, file); | |
1332 } | |
1333 | |
1334 typedef win_T * VIWIN; | |
1335 typedef buf_T * VIBUF; | |
1336 | |
1337 MODULE = VIM PACKAGE = VIM | |
1338 | |
1339 void | |
1340 Msg(text, hl=NULL) | |
1341 char *text; | |
1342 char *hl; | |
1343 | |
1344 PREINIT: | |
1345 int attr; | |
1346 int id; | |
1347 | |
1348 PPCODE: | |
1349 if (text != NULL) | |
1350 { | |
1351 attr = 0; | |
1352 if (hl != NULL) | |
1353 { | |
1354 id = syn_name2id((char_u *)hl); | |
1355 if (id != 0) | |
1356 attr = syn_id2attr(id); | |
1357 } | |
1358 msg_split((char_u *)text, attr); | |
1359 } | |
1360 | |
1361 void | |
1362 SetOption(line) | |
1363 char *line; | |
1364 | |
1365 PPCODE: | |
1366 if (line != NULL) | |
1367 do_set((char_u *)line, 0); | |
1368 update_screen(NOT_VALID); | |
1369 | |
1370 void | |
1371 DoCommand(line) | |
1372 char *line; | |
1373 | |
1374 PPCODE: | |
1375 if (line != NULL) | |
1376 do_cmdline_cmd((char_u *)line); | |
1377 | |
1378 void | |
1379 Eval(str) | |
1380 char *str; | |
1381 | |
1382 PREINIT: | |
1383 char_u *value; | |
1384 PPCODE: | |
714 | 1385 value = eval_to_string((char_u *)str, (char_u **)0, TRUE); |
7 | 1386 if (value == NULL) |
1387 { | |
1388 XPUSHs(sv_2mortal(newSViv(0))); | |
1389 XPUSHs(sv_2mortal(newSVpv("", 0))); | |
1390 } | |
1391 else | |
1392 { | |
1393 XPUSHs(sv_2mortal(newSViv(1))); | |
1394 XPUSHs(sv_2mortal(newSVpv((char *)value, 0))); | |
1395 vim_free(value); | |
1396 } | |
1397 | |
1398 void | |
1399 Buffers(...) | |
1400 | |
1401 PREINIT: | |
1402 buf_T *vimbuf; | |
1403 int i, b; | |
1404 | |
1405 PPCODE: | |
1406 if (items == 0) | |
1407 { | |
1408 if (GIMME == G_SCALAR) | |
1409 { | |
1410 i = 0; | |
1411 for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next) | |
1412 ++i; | |
1413 | |
1414 XPUSHs(sv_2mortal(newSViv(i))); | |
1415 } | |
1416 else | |
1417 { | |
1418 for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next) | |
1419 XPUSHs(newBUFrv(newSV(0), vimbuf)); | |
1420 } | |
1421 } | |
1422 else | |
1423 { | |
1424 for (i = 0; i < items; i++) | |
1425 { | |
1426 SV *sv = ST(i); | |
1427 if (SvIOK(sv)) | |
4105 | 1428 b = (int) SvIV(ST(i)); |
7 | 1429 else |
1430 { | |
1431 char_u *pat; | |
1432 STRLEN len; | |
1433 | |
1434 pat = (char_u *)SvPV(sv, len); | |
1435 ++emsg_off; | |
4236 | 1436 b = buflist_findpat(pat, pat+len, FALSE, FALSE, FALSE); |
7 | 1437 --emsg_off; |
1438 } | |
1439 | |
1440 if (b >= 0) | |
1441 { | |
1442 vimbuf = buflist_findnr(b); | |
1443 if (vimbuf) | |
1444 XPUSHs(newBUFrv(newSV(0), vimbuf)); | |
1445 } | |
1446 } | |
1447 } | |
1448 | |
1449 void | |
1450 Windows(...) | |
1451 | |
1452 PREINIT: | |
1453 win_T *vimwin; | |
1454 int i, w; | |
1455 | |
1456 PPCODE: | |
1457 if (items == 0) | |
1458 { | |
1459 if (GIMME == G_SCALAR) | |
1460 XPUSHs(sv_2mortal(newSViv(win_count()))); | |
1461 else | |
1462 { | |
1463 for (vimwin = firstwin; vimwin != NULL; vimwin = W_NEXT(vimwin)) | |
1464 XPUSHs(newWINrv(newSV(0), vimwin)); | |
1465 } | |
1466 } | |
1467 else | |
1468 { | |
1469 for (i = 0; i < items; i++) | |
1470 { | |
4105 | 1471 w = (int) SvIV(ST(i)); |
7 | 1472 vimwin = win_find_nr(w); |
1473 if (vimwin) | |
1474 XPUSHs(newWINrv(newSV(0), vimwin)); | |
1475 } | |
1476 } | |
1477 | |
1478 MODULE = VIM PACKAGE = VIWIN | |
1479 | |
1480 void | |
1481 DESTROY(win) | |
1482 VIWIN win | |
1483 | |
1484 CODE: | |
1485 if (win_valid(win)) | |
502 | 1486 win->w_perl_private = 0; |
7 | 1487 |
1488 SV * | |
1489 Buffer(win) | |
1490 VIWIN win | |
1491 | |
1492 CODE: | |
1493 if (!win_valid(win)) | |
1494 win = curwin; | |
1495 RETVAL = newBUFrv(newSV(0), win->w_buffer); | |
1496 OUTPUT: | |
1497 RETVAL | |
1498 | |
1499 void | |
1500 SetHeight(win, height) | |
1501 VIWIN win | |
1502 int height; | |
1503 | |
1504 PREINIT: | |
1505 win_T *savewin; | |
1506 | |
1507 PPCODE: | |
1508 if (!win_valid(win)) | |
1509 win = curwin; | |
1510 savewin = curwin; | |
1511 curwin = win; | |
1512 win_setheight(height); | |
1513 curwin = savewin; | |
1514 | |
1515 void | |
1516 Cursor(win, ...) | |
1517 VIWIN win | |
1518 | |
1519 PPCODE: | |
2982 | 1520 if (items == 1) |
7 | 1521 { |
1522 EXTEND(sp, 2); | |
1523 if (!win_valid(win)) | |
1524 win = curwin; | |
1525 PUSHs(sv_2mortal(newSViv(win->w_cursor.lnum))); | |
1526 PUSHs(sv_2mortal(newSViv(win->w_cursor.col))); | |
1527 } | |
2982 | 1528 else if (items == 3) |
7 | 1529 { |
1530 int lnum, col; | |
1531 | |
1532 if (!win_valid(win)) | |
1533 win = curwin; | |
4105 | 1534 lnum = (int) SvIV(ST(1)); |
1535 col = (int) SvIV(ST(2)); | |
7 | 1536 win->w_cursor.lnum = lnum; |
1537 win->w_cursor.col = col; | |
1538 check_cursor(); /* put cursor on an existing line */ | |
1539 update_screen(NOT_VALID); | |
1540 } | |
1541 | |
1542 MODULE = VIM PACKAGE = VIBUF | |
1543 | |
1544 void | |
1545 DESTROY(vimbuf) | |
1546 VIBUF vimbuf; | |
1547 | |
1548 CODE: | |
1549 if (buf_valid(vimbuf)) | |
502 | 1550 vimbuf->b_perl_private = 0; |
7 | 1551 |
1552 void | |
1553 Name(vimbuf) | |
1554 VIBUF vimbuf; | |
1555 | |
1556 PPCODE: | |
1557 if (!buf_valid(vimbuf)) | |
1558 vimbuf = curbuf; | |
1559 /* No file name returns an empty string */ | |
1560 if (vimbuf->b_fname == NULL) | |
1561 XPUSHs(sv_2mortal(newSVpv("", 0))); | |
1562 else | |
1563 XPUSHs(sv_2mortal(newSVpv((char *)vimbuf->b_fname, 0))); | |
1564 | |
1565 void | |
1566 Number(vimbuf) | |
1567 VIBUF vimbuf; | |
1568 | |
1569 PPCODE: | |
1570 if (!buf_valid(vimbuf)) | |
1571 vimbuf = curbuf; | |
1572 XPUSHs(sv_2mortal(newSViv(vimbuf->b_fnum))); | |
1573 | |
1574 void | |
1575 Count(vimbuf) | |
1576 VIBUF vimbuf; | |
1577 | |
1578 PPCODE: | |
1579 if (!buf_valid(vimbuf)) | |
1580 vimbuf = curbuf; | |
1581 XPUSHs(sv_2mortal(newSViv(vimbuf->b_ml.ml_line_count))); | |
1582 | |
1583 void | |
1584 Get(vimbuf, ...) | |
1585 VIBUF vimbuf; | |
1586 | |
1587 PREINIT: | |
1588 char_u *line; | |
1589 int i; | |
1590 long lnum; | |
1591 PPCODE: | |
1592 if (buf_valid(vimbuf)) | |
1593 { | |
1594 for (i = 1; i < items; i++) | |
1595 { | |
4105 | 1596 lnum = (long) SvIV(ST(i)); |
7 | 1597 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count) |
1598 { | |
1599 line = ml_get_buf(vimbuf, lnum, FALSE); | |
1600 XPUSHs(sv_2mortal(newSVpv((char *)line, 0))); | |
1601 } | |
1602 } | |
1603 } | |
1604 | |
1605 void | |
1606 Set(vimbuf, ...) | |
1607 VIBUF vimbuf; | |
1608 | |
1609 PREINIT: | |
1610 int i; | |
1611 long lnum; | |
1612 char *line; | |
1613 PPCODE: | |
1614 if (buf_valid(vimbuf)) | |
1615 { | |
1616 if (items < 3) | |
1617 croak("Usage: VIBUF::Set(vimbuf, lnum, @lines)"); | |
1618 | |
4105 | 1619 lnum = (long) SvIV(ST(1)); |
7 | 1620 for(i = 2; i < items; i++, lnum++) |
1621 { | |
1622 line = SvPV(ST(i),PL_na); | |
1623 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) | |
1624 { | |
918 | 1625 aco_save_T aco; |
1626 | |
1627 /* set curwin/curbuf for "vimbuf" and save some things */ | |
1628 aucmd_prepbuf(&aco, vimbuf); | |
1629 | |
7 | 1630 if (u_savesub(lnum) == OK) |
1631 { | |
1632 ml_replace(lnum, (char_u *)line, TRUE); | |
1633 changed_bytes(lnum, 0); | |
1634 } | |
934 | 1635 |
918 | 1636 /* restore curwin/curbuf and a few other things */ |
1637 aucmd_restbuf(&aco); | |
1638 /* Careful: autocommands may have made "vimbuf" invalid! */ | |
7 | 1639 } |
1640 } | |
1641 } | |
1642 | |
1643 void | |
1644 Delete(vimbuf, ...) | |
1645 VIBUF vimbuf; | |
1646 | |
1647 PREINIT: | |
1648 long i, lnum = 0, count = 0; | |
1649 PPCODE: | |
1650 if (buf_valid(vimbuf)) | |
1651 { | |
1652 if (items == 2) | |
1653 { | |
4105 | 1654 lnum = (long) SvIV(ST(1)); |
7 | 1655 count = 1; |
1656 } | |
1657 else if (items == 3) | |
1658 { | |
4105 | 1659 lnum = (long) SvIV(ST(1)); |
1660 count = (long) 1 + SvIV(ST(2)) - lnum; | |
2982 | 1661 if (count == 0) |
7 | 1662 count = 1; |
2982 | 1663 if (count < 0) |
7 | 1664 { |
1665 lnum -= count; | |
1666 count = -count; | |
1667 } | |
1668 } | |
1669 if (items >= 2) | |
1670 { | |
1671 for (i = 0; i < count; i++) | |
1672 { | |
1673 if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count) | |
1674 { | |
918 | 1675 aco_save_T aco; |
1676 | |
1677 /* set curwin/curbuf for "vimbuf" and save some things */ | |
1678 aucmd_prepbuf(&aco, vimbuf); | |
934 | 1679 |
7 | 1680 if (u_savedel(lnum, 1) == OK) |
1681 { | |
1682 ml_delete(lnum, 0); | |
1929 | 1683 check_cursor(); |
7 | 1684 deleted_lines_mark(lnum, 1L); |
1685 } | |
934 | 1686 |
918 | 1687 /* restore curwin/curbuf and a few other things */ |
1688 aucmd_restbuf(&aco); | |
1689 /* Careful: autocommands may have made "vimbuf" invalid! */ | |
934 | 1690 |
7 | 1691 update_curbuf(VALID); |
1692 } | |
1693 } | |
1694 } | |
1695 } | |
1696 | |
1697 void | |
1698 Append(vimbuf, ...) | |
1699 VIBUF vimbuf; | |
1700 | |
1701 PREINIT: | |
1702 int i; | |
1703 long lnum; | |
1704 char *line; | |
1705 PPCODE: | |
1706 if (buf_valid(vimbuf)) | |
1707 { | |
1708 if (items < 3) | |
1709 croak("Usage: VIBUF::Append(vimbuf, lnum, @lines)"); | |
1710 | |
4105 | 1711 lnum = (long) SvIV(ST(1)); |
7 | 1712 for (i = 2; i < items; i++, lnum++) |
1713 { | |
1714 line = SvPV(ST(i),PL_na); | |
1715 if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL) | |
1716 { | |
918 | 1717 aco_save_T aco; |
1718 | |
1719 /* set curwin/curbuf for "vimbuf" and save some things */ | |
1720 aucmd_prepbuf(&aco, vimbuf); | |
1721 | |
7 | 1722 if (u_inssub(lnum + 1) == OK) |
1723 { | |
1724 ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE); | |
1725 appended_lines_mark(lnum, 1L); | |
1726 } | |
934 | 1727 |
918 | 1728 /* restore curwin/curbuf and a few other things */ |
1729 aucmd_restbuf(&aco); | |
1730 /* Careful: autocommands may have made "vimbuf" invalid! */ | |
934 | 1731 |
7 | 1732 update_curbuf(VALID); |
1733 } | |
1734 } | |
1735 } | |
1736 |