See https://groups.google.com/d/topic/vim_dev/p5qS9s8YgAc/discussion for a
description of the problem on windows.
On linux the current if_perl.xs will let you link with a dynamic perl 5.14,
but leads to an error at runtime when actually using perl from vim.
This is caused by changes to perlapi between 5.12 and 5.14. The attached
patch to if_perl.xs works for me on win32 and linux. Tested with perl 5.12
and 5.14.
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
*** vim/src/if_perl.xs 2011-07-27 21:16:37.000000000 -0400
--- vim2/src/if_perl.xs 2011-08-11 21:34:22.000000000 -0400
***************
*** 1,23 ****
/* vi:set ts=8 sts=4 sw=4:
*
! * VIM - Vi IMproved by Bram Moolenaar
*
* Do ":help uganda" in Vim to read copying and usage conditions.
* Do ":help credits" in Vim to see a list of people who contributed.
*/
/*
* if_perl.xs: Main code for Perl interface support.
! * Mostly written by Sven Verdoolaege.
*/
! #define _memory_h /* avoid memset redeclaration */
! #define IN_PERL_FILE /* don't include if_perl.pro from proto.h */
#include "vim.h"
/*
! * Work around clashes between Perl and Vim namespace. proto.h doesn't
* include if_perl.pro and perlsfio.pro when IN_PERL_FILE is defined, because
* we need the CV typedef. proto.h can't be moved to after including
* if_perl.h, because we get all sorts of name clashes then.
--- 1,23 ----
/* vi:set ts=8 sts=4 sw=4:
*
! * VIM - Vi IMproved by Bram Moolenaar
*
* Do ":help uganda" in Vim to read copying and usage conditions.
* Do ":help credits" in Vim to see a list of people who contributed.
*/
/*
* if_perl.xs: Main code for Perl interface support.
! * Mostly written by Sven Verdoolaege.
*/
! #define _memory_h /* avoid memset redeclaration */
! #define IN_PERL_FILE /* don't include if_perl.pro from proto.h */
#include "vim.h"
/*
! * Work around clashes between Perl and Vim namespace. proto.h doesn't
* include if_perl.pro and perlsfio.pro when IN_PERL_FILE is defined, because
* we need the CV typedef. proto.h can't be moved to after including
* if_perl.h, because we get all sorts of name clashes then.
***************
*** 147,153 ****
--- 147,158 ----
# define Perl_save_int dll_Perl_save_int
# define Perl_stack_grow dll_Perl_stack_grow
# define Perl_set_context dll_Perl_set_context
+ # if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
+ # define Perl_sv_2bool_flags dll_Perl_sv_2bool_flags
+ # define Perl_xs_apiversion_bootcheck dll_Perl_xs_apiversion_bootcheck
+ # else
# define Perl_sv_2bool dll_Perl_sv_2bool
+ # endif
# define Perl_sv_2iv dll_Perl_sv_2iv
# define Perl_sv_2mortal dll_Perl_sv_2mortal
# if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
***************
*** 252,258 ****
--- 257,268 ----
static void (*Perl_save_int)(pTHX_ int*);
static SV** (*Perl_stack_grow)(pTHX_ SV**, SV**p, int);
static SV** (*Perl_set_context)(void*);
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
+ static bool (*Perl_sv_2bool_flags)(pTHX_ SV*, I32);
+ static void (*Perl_xs_apiversion_bootcheck)(pTHX_ SV *module, const char *api_p, STRLEN api_len);
+ #else
static bool (*Perl_sv_2bool)(pTHX_ SV*);
+ #endif
static IV (*Perl_sv_2iv)(pTHX_ SV*);
static SV* (*Perl_sv_2mortal)(pTHX_ SV*);
#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
***************
*** 360,366 ****
--- 370,381 ----
{"Perl_save_int", (PERL_PROC*)&Perl_save_int},
{"Perl_stack_grow", (PERL_PROC*)&Perl_stack_grow},
{"Perl_set_context", (PERL_PROC*)&Perl_set_context},
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
+ {"Perl_sv_2bool_flags", (PERL_PROC*)&Perl_sv_2bool_flags},
+ {"Perl_xs_apiversion_bootcheck",(PERL_PROC*)&Perl_xs_apiversion_bootcheck},
+ #else
{"Perl_sv_2bool", (PERL_PROC*)&Perl_sv_2bool},
+ #endif
{"Perl_sv_2iv", (PERL_PROC*)&Perl_sv_2iv},
{"Perl_sv_2mortal", (PERL_PROC*)&Perl_sv_2mortal},
#if (PERL_REVISION == 5) && (PERL_VERSION >= 8)
***************
*** 407,412 ****
--- 422,430 ----
{"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
{"Perl_sys_init", (PERL_PROC*)&Perl_sys_init},
{"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
+ {"Perl_call_list", (PERL_PROC*)&Perl_call_list},
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
+ #else
{"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
{"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr},
{"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr},
***************
*** 418,432 ****
{"Perl_Imarkstack_max_ptr", (PERL_PROC*)&Perl_Imarkstack_max_ptr},
{"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
{"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr},
- {"Perl_call_list", (PERL_PROC*)&Perl_call_list},
{"Perl_Iscopestack_ix_ptr", (PERL_PROC*)&Perl_Iscopestack_ix_ptr},
{"Perl_Iunitcheckav_ptr", (PERL_PROC*)&Perl_Iunitcheckav_ptr},
#endif
{"Perl_Idefgv_ptr", (PERL_PROC*)&Perl_Idefgv_ptr},
{"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr},
{"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr},
- {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader},
{"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr},
{"", NULL},
};
--- 436,453 ----
{"Perl_Imarkstack_max_ptr", (PERL_PROC*)&Perl_Imarkstack_max_ptr},
{"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
{"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr},
{"Perl_Iscopestack_ix_ptr", (PERL_PROC*)&Perl_Iscopestack_ix_ptr},
{"Perl_Iunitcheckav_ptr", (PERL_PROC*)&Perl_Iunitcheckav_ptr},
#endif
+ #endif
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
+ #else
{"Perl_Idefgv_ptr", (PERL_PROC*)&Perl_Idefgv_ptr},
{"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr},
{"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr},
{"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr},
+ #endif
+ {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader},
{"", NULL},
};
***************
*** 446,469 ****
int i;
if (hPerlLib != NULL)
! return OK;
if ((hPerlLib = load_dll(libname)) == NULL)
{
! if (verbose)
! EMSG2(_("E370: Could not load library %s"), libname);
! return FAIL;
}
for (i = 0; perl_funcname_table[i].ptr; ++i)
{
! if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib,
! perl_funcname_table[i].name)))
! {
! close_dll(hPerlLib);
! hPerlLib = NULL;
! if (verbose)
! EMSG2(_(e_loadfunc), perl_funcname_table[i].name);
! return FAIL;
! }
}
return OK;
}
--- 467,490 ----
int i;
if (hPerlLib != NULL)
! return OK;
if ((hPerlLib = load_dll(libname)) == NULL)
{
! if (verbose)
! EMSG2(_("E370: Could not load library %s"), libname);
! return FAIL;
}
for (i = 0; perl_funcname_table[i].ptr; ++i)
{
! if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib,
! perl_funcname_table[i].name)))
! {
! close_dll(hPerlLib);
! hPerlLib = NULL;
! if (verbose)
! EMSG2(_(e_loadfunc), perl_funcname_table[i].name);
! return FAIL;
! }
}
return OK;
}
***************
*** 474,480 ****
*/
int
perl_enabled(verbose)
! int verbose;
{
return perl_runtime_link_init(DYNAMIC_PERL_DLL, verbose) == OK;
}
--- 495,501 ----
*/
int
perl_enabled(verbose)
! int verbose;
{
return perl_runtime_link_init(DYNAMIC_PERL_DLL, verbose) == OK;
}
***************
*** 516,525 ****
{
if (perl_interp)
{
! perl_run(perl_interp);
! perl_destruct(perl_interp);
! perl_free(perl_interp);
! perl_interp = NULL;
#if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
Perl_sys_term();
#endif
--- 537,546 ----
{
if (perl_interp)
{
! perl_run(perl_interp);
! perl_destruct(perl_interp);
! perl_free(perl_interp);
! perl_interp = NULL;
#if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
Perl_sys_term();
#endif
***************
*** 527,534 ****
#ifdef DYNAMIC_PERL
if (hPerlLib)
{
! close_dll(hPerlLib);
! hPerlLib = NULL;
}
#endif
}
--- 548,555 ----
#ifdef DYNAMIC_PERL
if (hPerlLib)
{
! close_dll(hPerlLib);
! hPerlLib = NULL;
}
#endif
}
***************
*** 539,558 ****
*/
void
msg_split(s, attr)
! char_u *s;
! int attr; /* highlighting attributes */
{
char *next;
char *token = (char *)s;
while ((next = strchr(token, '\n')) && !got_int)
{
! *next++ = '\0'; /* replace \n with \0 */
! msg_attr((char_u *)token, attr);
! token = next;
}
if (*token && !got_int)
! msg_attr((char_u *)token, attr);
}
#ifndef FEAT_EVAL
--- 560,579 ----
*/
void
msg_split(s, attr)
! char_u *s;
! int attr; /* highlighting attributes */
{
char *next;
char *token = (char *)s;
while ((next = strchr(token, '\n')) && !got_int)
{
! *next++ = '\0'; /* replace \n with \0 */
! msg_attr((char_u *)token, attr);
! token = next;
}
if (*token && !got_int)
! msg_attr((char_u *)token, attr);
}
#ifndef FEAT_EVAL
***************
*** 562,570 ****
*/
char_u *
eval_to_string(arg, nextcmd, dolist)
! char_u *arg;
! char_u **nextcmd;
! int dolist;
{
return NULL;
}
--- 583,591 ----
*/
char_u *
eval_to_string(arg, nextcmd, dolist)
! char_u *arg;
! char_u **nextcmd;
! int dolist;
{
return NULL;
}
***************
*** 583,599 ****
static SV *
newWINrv(rv, ptr)
! SV *rv;
win_T *ptr;
{
sv_upgrade(rv, SVt_RV);
if (ptr->w_perl_private == NULL)
{
! ptr->w_perl_private = newSV(0);
! sv_setiv(ptr->w_perl_private, (IV)ptr);
}
else
! SvREFCNT_inc(ptr->w_perl_private);
SvRV(rv) = ptr->w_perl_private;
SvROK_on(rv);
return sv_bless(rv, gv_stashpv("VIWIN", TRUE));
--- 604,620 ----
static SV *
newWINrv(rv, ptr)
! SV *rv;
win_T *ptr;
{
sv_upgrade(rv, SVt_RV);
if (ptr->w_perl_private == NULL)
{
! ptr->w_perl_private = newSV(0);
! sv_setiv(ptr->w_perl_private, (IV)ptr);
}
else
! SvREFCNT_inc(ptr->w_perl_private);
SvRV(rv) = ptr->w_perl_private;
SvROK_on(rv);
return sv_bless(rv, gv_stashpv("VIWIN", TRUE));
***************
*** 601,617 ****
static SV *
newBUFrv(rv, ptr)
! SV *rv;
buf_T *ptr;
{
sv_upgrade(rv, SVt_RV);
if (ptr->b_perl_private == NULL)
{
! ptr->b_perl_private = newSV(0);
! sv_setiv(ptr->b_perl_private, (IV)ptr);
}
else
! SvREFCNT_inc(ptr->b_perl_private);
SvRV(rv) = ptr->b_perl_private;
SvROK_on(rv);
return sv_bless(rv, gv_stashpv("VIBUF", TRUE));
--- 622,638 ----
static SV *
newBUFrv(rv, ptr)
! SV *rv;
buf_T *ptr;
{
sv_upgrade(rv, SVt_RV);
if (ptr->b_perl_private == NULL)
{
! ptr->b_perl_private = newSV(0);
! sv_setiv(ptr->b_perl_private, (IV)ptr);
}
else
! SvREFCNT_inc(ptr->b_perl_private);
SvRV(rv) = ptr->b_perl_private;
SvROK_on(rv);
return sv_bless(rv, gv_stashpv("VIBUF", TRUE));
***************
*** 619,632 ****
/*
* perl_win_free
! * Remove all refences to the window to be destroyed
*/
void
perl_win_free(wp)
win_T *wp;
{
if (wp->w_perl_private)
! sv_setiv((SV *)wp->w_perl_private, 0);
return;
}
--- 640,653 ----
/*
* perl_win_free
! * Remove all refences to the window to be destroyed
*/
void
perl_win_free(wp)
win_T *wp;
{
if (wp->w_perl_private)
! sv_setiv((SV *)wp->w_perl_private, 0);
return;
}
***************
*** 635,641 ****
buf_T *bp;
{
if (bp->b_perl_private)
! sv_setiv((SV *)bp->b_perl_private, 0);
return;
}
--- 656,662 ----
buf_T *bp;
{
if (bp->b_perl_private)
! sv_setiv((SV *)bp->b_perl_private, 0);
return;
}
***************
*** 660,668 ****
{
SV *rv;
if (iv == 0)
! rv = newWINrv(newSV(0), curwin);
else
! rv = newBUFrv(newSV(0), curbuf);
sv_setsv(sv, rv);
return 0;
}
--- 681,689 ----
{
SV *rv;
if (iv == 0)
! rv = newWINrv(newSV(0), curwin);
else
! rv = newBUFrv(newSV(0), curbuf);
sv_setsv(sv, rv);
return 0;
}
***************
*** 709,742 ****
*/
void
ex_perl(eap)
! exarg_T *eap;
{
! char *err;
! char *script;
! STRLEN length;
! SV *sv;
#ifdef HAVE_SANDBOX
! SV *safe;
#endif
script = (char *)script_get(eap, eap->arg);
if (eap->skip)
{
! vim_free(script);
! return;
}
if (perl_interp == NULL)
{
#ifdef DYNAMIC_PERL
! if (!perl_enabled(TRUE))
! {
! EMSG(_(e_noperl));
! vim_free(script);
! return;
! }
#endif
! perl_init();
}
{
--- 730,763 ----
*/
void
ex_perl(eap)
! exarg_T *eap;
{
! char *err;
! char *script;
! STRLEN length;
! SV *sv;
#ifdef HAVE_SANDBOX
! SV *safe;
#endif
script = (char *)script_get(eap, eap->arg);
if (eap->skip)
{
! vim_free(script);
! return;
}
if (perl_interp == NULL)
{
#ifdef DYNAMIC_PERL
! if (!perl_enabled(TRUE))
! {
! EMSG(_(e_noperl));
! vim_free(script);
! return;
! }
#endif
! perl_init();
}
{
***************
*** 745,777 ****
SAVETMPS;
if (script == NULL)
! sv = newSVpv((char *)eap->arg, 0);
else
{
! sv = newSVpv(script, 0);
! vim_free(script);
}
#ifdef HAVE_SANDBOX
if (sandbox)
{
! safe = perl_get_sv("VIM::safe", FALSE);
# ifndef MAKE_TEST /* avoid a warning for unreachable code */
! if (safe == NULL || !SvTRUE(safe))
! EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module"));
! else
# endif
! {
! PUSHMARK(SP);
! XPUSHs(safe);
! XPUSHs(sv);
! PUTBACK;
! perl_call_method("reval", G_DISCARD);
! }
}
else
#endif
! perl_eval_sv(sv, G_DISCARD | G_NOARGS);
SvREFCNT_dec(sv);
--- 766,798 ----
SAVETMPS;
if (script == NULL)
! sv = newSVpv((char *)eap->arg, 0);
else
{
! sv = newSVpv(script, 0);
! vim_free(script);
}
#ifdef HAVE_SANDBOX
if (sandbox)
{
! safe = perl_get_sv("VIM::safe", FALSE);
# ifndef MAKE_TEST /* avoid a warning for unreachable code */
! if (safe == NULL || !SvTRUE(safe))
! EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module"));
! else
# endif
! {
! PUSHMARK(SP);
! XPUSHs(safe);
! XPUSHs(sv);
! PUTBACK;
! perl_call_method("reval", G_DISCARD);
! }
}
else
#endif
! perl_eval_sv(sv, G_DISCARD | G_NOARGS);
SvREFCNT_dec(sv);
***************
*** 781,787 ****
LEAVE;
if (!length)
! return;
msg_split((char_u *)err, highlight_attr[HLF_E]);
return;
--- 802,808 ----
LEAVE;
if (!length)
! return;
msg_split((char_u *)err, highlight_attr[HLF_E]);
return;
***************
*** 790,811 ****
static int
replace_line(line, end)
! linenr_T *line, *end;
{
char *str;
if (SvOK(GvSV(PL_defgv)))
{
! str = SvPV(GvSV(PL_defgv), PL_na);
! ml_replace(*line, (char_u *)str, 1);
! changed_bytes(*line, 0);
}
else
{
! ml_delete(*line, FALSE);
! deleted_lines_mark(*line, 1L);
! --(*end);
! --(*line);
}
return OK;
}
--- 811,832 ----
static int
replace_line(line, end)
! linenr_T *line, *end;
{
char *str;
if (SvOK(GvSV(PL_defgv)))
{
! str = SvPV(GvSV(PL_defgv), PL_na);
! ml_replace(*line, (char_u *)str, 1);
! changed_bytes(*line, 0);
}
else
{
! ml_delete(*line, FALSE);
! deleted_lines_mark(*line, 1L);
! --(*end);
! --(*line);
}
return OK;
}
***************
*** 815,840 ****
*/
void
ex_perldo(eap)
! exarg_T *eap;
{
! STRLEN length;
! SV *sv;
! char *str;
! linenr_T i;
if (bufempty())
! return;
if (perl_interp == NULL)
{
#ifdef DYNAMIC_PERL
! if (!perl_enabled(TRUE))
! {
! EMSG(_(e_noperl));
! return;
! }
#endif
! perl_init();
}
{
dSP;
--- 836,861 ----
*/
void
ex_perldo(eap)
! exarg_T *eap;
{
! STRLEN length;
! SV *sv;
! char *str;
! linenr_T i;
if (bufempty())
! return;
if (perl_interp == NULL)
{
#ifdef DYNAMIC_PERL
! if (!perl_enabled(TRUE))
! {
! EMSG(_(e_noperl));
! return;
! }
#endif
! perl_init();
}
{
dSP;
***************
*** 847,884 ****
SvREFCNT_dec(sv);
str = SvPV(GvSV(PL_errgv), length);
if (length)
! goto err;
if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
! return;
ENTER;
SAVETMPS;
for (i = eap->line1; i <= eap->line2; i++)
{
! sv_setpv(GvSV(PL_defgv), (char *)ml_get(i));
! PUSHMARK(sp);
! perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL);
! str = SvPV(GvSV(PL_errgv), length);
! if (length)
! break;
! SPAGAIN;
! if (SvTRUEx(POPs))
! {
! if (replace_line(&i, &eap->line2) != OK)
! {
! PUTBACK;
! break;
! }
! }
! PUTBACK;
}
FREETMPS;
LEAVE;
check_cursor();
update_screen(NOT_VALID);
if (!length)
! return;
err:
msg_split((char_u *)str, highlight_attr[HLF_E]);
--- 868,905 ----
SvREFCNT_dec(sv);
str = SvPV(GvSV(PL_errgv), length);
if (length)
! goto err;
if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
! return;
ENTER;
SAVETMPS;
for (i = eap->line1; i <= eap->line2; i++)
{
! sv_setpv(GvSV(PL_defgv), (char *)ml_get(i));
! PUSHMARK(sp);
! perl_call_pv("VIM::perldo", G_SCALAR | G_EVAL);
! str = SvPV(GvSV(PL_errgv), length);
! if (length)
! break;
! SPAGAIN;
! if (SvTRUEx(POPs))
! {
! if (replace_line(&i, &eap->line2) != OK)
! {
! PUTBACK;
! break;
! }
! }
! PUTBACK;
}
FREETMPS;
LEAVE;
check_cursor();
update_screen(NOT_VALID);
if (!length)
! return;
err:
msg_split((char_u *)str, highlight_attr[HLF_E]);
***************
*** 922,952 ****
newXS("VIM::bootstrap", boot_VIM, file);
}
! typedef win_T * VIWIN;
! typedef buf_T * VIBUF;
! MODULE = VIM PACKAGE = VIM
void
Msg(text, hl=NULL)
! char *text;
! char *hl;
PREINIT:
! int attr;
! int id;
PPCODE:
if (text != NULL)
{
! attr = 0;
! if (hl != NULL)
! {
! id = syn_name2id((char_u *)hl);
! if (id != 0)
! attr = syn_id2attr(id);
! }
! msg_split((char_u *)text, attr);
}
void
--- 943,973 ----
newXS("VIM::bootstrap", boot_VIM, file);
}
! typedef win_T * VIWIN;
! typedef buf_T * VIBUF;
! MODULE = VIM PACKAGE = VIM
void
Msg(text, hl=NULL)
! char *text;
! char *hl;
PREINIT:
! int attr;
! int id;
PPCODE:
if (text != NULL)
{
! attr = 0;
! if (hl != NULL)
! {
! id = syn_name2id((char_u *)hl);
! if (id != 0)
! attr = syn_id2attr(id);
! }
! msg_split((char_u *)text, attr);
}
void
***************
*** 955,961 ****
PPCODE:
if (line != NULL)
! do_set((char_u *)line, 0);
update_screen(NOT_VALID);
void
--- 976,982 ----
PPCODE:
if (line != NULL)
! do_set((char_u *)line, 0);
update_screen(NOT_VALID);
void
***************
*** 964,990 ****
PPCODE:
if (line != NULL)
! do_cmdline_cmd((char_u *)line);
void
Eval(str)
char *str;
PREINIT:
! char_u *value;
PPCODE:
! value = eval_to_string((char_u *)str, (char_u **)0, TRUE);
! if (value == NULL)
! {
! XPUSHs(sv_2mortal(newSViv(0)));
! XPUSHs(sv_2mortal(newSVpv("", 0)));
! }
! else
! {
! XPUSHs(sv_2mortal(newSViv(1)));
! XPUSHs(sv_2mortal(newSVpv((char *)value, 0)));
! vim_free(value);
! }
void
Buffers(...)
--- 985,1011 ----
PPCODE:
if (line != NULL)
! do_cmdline_cmd((char_u *)line);
void
Eval(str)
char *str;
PREINIT:
! char_u *value;
PPCODE:
! value = eval_to_string((char_u *)str, (char_u **)0, TRUE);
! if (value == NULL)
! {
! XPUSHs(sv_2mortal(newSViv(0)));
! XPUSHs(sv_2mortal(newSVpv("", 0)));
! }
! else
! {
! XPUSHs(sv_2mortal(newSViv(1)));
! XPUSHs(sv_2mortal(newSVpv((char *)value, 0)));
! vim_free(value);
! }
void
Buffers(...)
***************
*** 996,1040 ****
PPCODE:
if (items == 0)
{
! if (GIMME == G_SCALAR)
! {
! i = 0;
! for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next)
! ++i;
!
! XPUSHs(sv_2mortal(newSViv(i)));
! }
! else
! {
! for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next)
! XPUSHs(newBUFrv(newSV(0), vimbuf));
! }
}
else
{
! for (i = 0; i < items; i++)
! {
! SV *sv = ST(i);
! if (SvIOK(sv))
! b = SvIV(ST(i));
! else
! {
! char_u *pat;
! STRLEN len;
!
! pat = (char_u *)SvPV(sv, len);
! ++emsg_off;
! b = buflist_findpat(pat, pat+len, FALSE, FALSE);
! --emsg_off;
! }
!
! if (b >= 0)
! {
! vimbuf = buflist_findnr(b);
! if (vimbuf)
! XPUSHs(newBUFrv(newSV(0), vimbuf));
! }
! }
}
void
--- 1017,1061 ----
PPCODE:
if (items == 0)
{
! if (GIMME == G_SCALAR)
! {
! i = 0;
! for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next)
! ++i;
!
! XPUSHs(sv_2mortal(newSViv(i)));
! }
! else
! {
! for (vimbuf = firstbuf; vimbuf; vimbuf = vimbuf->b_next)
! XPUSHs(newBUFrv(newSV(0), vimbuf));
! }
}
else
{
! for (i = 0; i < items; i++)
! {
! SV *sv = ST(i);
! if (SvIOK(sv))
! b = SvIV(ST(i));
! else
! {
! char_u *pat;
! STRLEN len;
!
! pat = (char_u *)SvPV(sv, len);
! ++emsg_off;
! b = buflist_findpat(pat, pat+len, FALSE, FALSE);
! --emsg_off;
! }
!
! if (b >= 0)
! {
! vimbuf = buflist_findnr(b);
! if (vimbuf)
! XPUSHs(newBUFrv(newSV(0), vimbuf));
! }
! }
}
void
***************
*** 1042,1072 ****
PREINIT:
win_T *vimwin;
! int i, w;
PPCODE:
if (items == 0)
{
! if (GIMME == G_SCALAR)
! XPUSHs(sv_2mortal(newSViv(win_count())));
! else
! {
! for (vimwin = firstwin; vimwin != NULL; vimwin = W_NEXT(vimwin))
! XPUSHs(newWINrv(newSV(0), vimwin));
! }
}
else
{
! for (i = 0; i < items; i++)
! {
! w = SvIV(ST(i));
! vimwin = win_find_nr(w);
! if (vimwin)
! XPUSHs(newWINrv(newSV(0), vimwin));
! }
}
! MODULE = VIM PACKAGE = VIWIN
void
DESTROY(win)
--- 1063,1093 ----
PREINIT:
win_T *vimwin;
! int i, w;
PPCODE:
if (items == 0)
{
! if (GIMME == G_SCALAR)
! XPUSHs(sv_2mortal(newSViv(win_count())));
! else
! {
! for (vimwin = firstwin; vimwin != NULL; vimwin = W_NEXT(vimwin))
! XPUSHs(newWINrv(newSV(0), vimwin));
! }
}
else
{
! for (i = 0; i < items; i++)
! {
! w = SvIV(ST(i));
! vimwin = win_find_nr(w);
! if (vimwin)
! XPUSHs(newWINrv(newSV(0), vimwin));
! }
}
! MODULE = VIM PACKAGE = VIWIN
void
DESTROY(win)
***************
*** 1074,1080 ****
CODE:
if (win_valid(win))
! win->w_perl_private = 0;
SV *
Buffer(win)
--- 1095,1101 ----
CODE:
if (win_valid(win))
! win->w_perl_private = 0;
SV *
Buffer(win)
***************
*** 1082,1088 ****
CODE:
if (!win_valid(win))
! win = curwin;
RETVAL = newBUFrv(newSV(0), win->w_buffer);
OUTPUT:
RETVAL
--- 1103,1109 ----
CODE:
if (!win_valid(win))
! win = curwin;
RETVAL = newBUFrv(newSV(0), win->w_buffer);
OUTPUT:
RETVAL
***************
*** 1097,1103 ****
PPCODE:
if (!win_valid(win))
! win = curwin;
savewin = curwin;
curwin = win;
win_setheight(height);
--- 1118,1124 ----
PPCODE:
if (!win_valid(win))
! win = curwin;
savewin = curwin;
curwin = win;
win_setheight(height);
***************
*** 1112,1118 ****
{
EXTEND(sp, 2);
if (!win_valid(win))
! win = curwin;
PUSHs(sv_2mortal(newSViv(win->w_cursor.lnum)));
PUSHs(sv_2mortal(newSViv(win->w_cursor.col)));
}
--- 1133,1139 ----
{
EXTEND(sp, 2);
if (!win_valid(win))
! win = curwin;
PUSHs(sv_2mortal(newSViv(win->w_cursor.lnum)));
PUSHs(sv_2mortal(newSViv(win->w_cursor.col)));
}
***************
*** 1121,1136 ****
int lnum, col;
if (!win_valid(win))
! win = curwin;
lnum = SvIV(ST(1));
col = SvIV(ST(2));
win->w_cursor.lnum = lnum;
win->w_cursor.col = col;
! check_cursor(); /* put cursor on an existing line */
update_screen(NOT_VALID);
}
! MODULE = VIM PACKAGE = VIBUF
void
DESTROY(vimbuf)
--- 1142,1157 ----
int lnum, col;
if (!win_valid(win))
! win = curwin;
lnum = SvIV(ST(1));
col = SvIV(ST(2));
win->w_cursor.lnum = lnum;
win->w_cursor.col = col;
! check_cursor(); /* put cursor on an existing line */
update_screen(NOT_VALID);
}
! MODULE = VIM PACKAGE = VIBUF
void
DESTROY(vimbuf)
***************
*** 1138,1144 ****
CODE:
if (buf_valid(vimbuf))
! vimbuf->b_perl_private = 0;
void
Name(vimbuf)
--- 1159,1165 ----
CODE:
if (buf_valid(vimbuf))
! vimbuf->b_perl_private = 0;
void
Name(vimbuf)
***************
*** 1146,1157 ****
PPCODE:
if (!buf_valid(vimbuf))
! vimbuf = curbuf;
/* No file name returns an empty string */
if (vimbuf->b_fname == NULL)
! XPUSHs(sv_2mortal(newSVpv("", 0)));
else
! XPUSHs(sv_2mortal(newSVpv((char *)vimbuf->b_fname, 0)));
void
Number(vimbuf)
--- 1167,1178 ----
PPCODE:
if (!buf_valid(vimbuf))
! vimbuf = curbuf;
/* No file name returns an empty string */
if (vimbuf->b_fname == NULL)
! XPUSHs(sv_2mortal(newSVpv("", 0)));
else
! XPUSHs(sv_2mortal(newSVpv((char *)vimbuf->b_fname, 0)));
void
Number(vimbuf)
***************
*** 1159,1165 ****
PPCODE:
if (!buf_valid(vimbuf))
! vimbuf = curbuf;
XPUSHs(sv_2mortal(newSViv(vimbuf->b_fnum)));
void
--- 1180,1186 ----
PPCODE:
if (!buf_valid(vimbuf))
! vimbuf = curbuf;
XPUSHs(sv_2mortal(newSViv(vimbuf->b_fnum)));
void
***************
*** 1168,1174 ****
PPCODE:
if (!buf_valid(vimbuf))
! vimbuf = curbuf;
XPUSHs(sv_2mortal(newSViv(vimbuf->b_ml.ml_line_count)));
void
--- 1189,1195 ----
PPCODE:
if (!buf_valid(vimbuf))
! vimbuf = curbuf;
XPUSHs(sv_2mortal(newSViv(vimbuf->b_ml.ml_line_count)));
void
***************
*** 1182,1196 ****
PPCODE:
if (buf_valid(vimbuf))
{
! for (i = 1; i < items; i++)
! {
! lnum = SvIV(ST(i));
! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
! {
! line = ml_get_buf(vimbuf, lnum, FALSE);
! XPUSHs(sv_2mortal(newSVpv((char *)line, 0)));
! }
! }
}
void
--- 1203,1217 ----
PPCODE:
if (buf_valid(vimbuf))
{
! for (i = 1; i < items; i++)
! {
! lnum = SvIV(ST(i));
! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
! {
! line = ml_get_buf(vimbuf, lnum, FALSE);
! XPUSHs(sv_2mortal(newSVpv((char *)line, 0)));
! }
! }
}
void
***************
*** 1204,1234 ****
PPCODE:
if (buf_valid(vimbuf))
{
! if (items < 3)
! croak("Usage: VIBUF::Set(vimbuf, lnum, @lines)");
! lnum = SvIV(ST(1));
! for(i = 2; i < items; i++, lnum++)
! {
! line = SvPV(ST(i),PL_na);
! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
! {
! aco_save_T aco;
!
! /* set curwin/curbuf for "vimbuf" and save some things */
! aucmd_prepbuf(&aco, vimbuf);
!
! if (u_savesub(lnum) == OK)
! {
! ml_replace(lnum, (char_u *)line, TRUE);
! changed_bytes(lnum, 0);
! }
!
! /* restore curwin/curbuf and a few other things */
! aucmd_restbuf(&aco);
! /* Careful: autocommands may have made "vimbuf" invalid! */
! }
! }
}
void
--- 1225,1255 ----
PPCODE:
if (buf_valid(vimbuf))
{
! if (items < 3)
! croak("Usage: VIBUF::Set(vimbuf, lnum, @lines)");
! lnum = SvIV(ST(1));
! for(i = 2; i < items; i++, lnum++)
! {
! line = SvPV(ST(i),PL_na);
! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
! {
! aco_save_T aco;
!
! /* set curwin/curbuf for "vimbuf" and save some things */
! aucmd_prepbuf(&aco, vimbuf);
!
! if (u_savesub(lnum) == OK)
! {
! ml_replace(lnum, (char_u *)line, TRUE);
! changed_bytes(lnum, 0);
! }
!
! /* restore curwin/curbuf and a few other things */
! aucmd_restbuf(&aco);
! /* Careful: autocommands may have made "vimbuf" invalid! */
! }
! }
}
void
***************
*** 1240,1288 ****
PPCODE:
if (buf_valid(vimbuf))
{
! if (items == 2)
! {
! lnum = SvIV(ST(1));
! count = 1;
! }
! else if (items == 3)
! {
! lnum = SvIV(ST(1));
! count = 1 + SvIV(ST(2)) - lnum;
! if (count == 0)
! count = 1;
! if (count < 0)
! {
! lnum -= count;
! count = -count;
! }
! }
! if (items >= 2)
! {
! for (i = 0; i < count; i++)
! {
! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
! {
! aco_save_T aco;
!
! /* set curwin/curbuf for "vimbuf" and save some things */
! aucmd_prepbuf(&aco, vimbuf);
!
! if (u_savedel(lnum, 1) == OK)
! {
! ml_delete(lnum, 0);
! check_cursor();
! deleted_lines_mark(lnum, 1L);
! }
!
! /* restore curwin/curbuf and a few other things */
! aucmd_restbuf(&aco);
! /* Careful: autocommands may have made "vimbuf" invalid! */
!
! update_curbuf(VALID);
! }
! }
! }
}
void
--- 1261,1309 ----
PPCODE:
if (buf_valid(vimbuf))
{
! if (items == 2)
! {
! lnum = SvIV(ST(1));
! count = 1;
! }
! else if (items == 3)
! {
! lnum = SvIV(ST(1));
! count = 1 + SvIV(ST(2)) - lnum;
! if (count == 0)
! count = 1;
! if (count < 0)
! {
! lnum -= count;
! count = -count;
! }
! }
! if (items >= 2)
! {
! for (i = 0; i < count; i++)
! {
! if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
! {
! aco_save_T aco;
!
! /* set curwin/curbuf for "vimbuf" and save some things */
! aucmd_prepbuf(&aco, vimbuf);
!
! if (u_savedel(lnum, 1) == OK)
! {
! ml_delete(lnum, 0);
! check_cursor();
! deleted_lines_mark(lnum, 1L);
! }
!
! /* restore curwin/curbuf and a few other things */
! aucmd_restbuf(&aco);
! /* Careful: autocommands may have made "vimbuf" invalid! */
!
! update_curbuf(VALID);
! }
! }
! }
}
void
***************
*** 1290,1327 ****
VIBUF vimbuf;
PREINIT:
! int i;
! long lnum;
! char *line;
PPCODE:
if (buf_valid(vimbuf))
{
! if (items < 3)
! croak("Usage: VIBUF::Append(vimbuf, lnum, @lines)");
! lnum = SvIV(ST(1));
! for (i = 2; i < items; i++, lnum++)
! {
! line = SvPV(ST(i),PL_na);
! if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
! {
! aco_save_T aco;
!
! /* set curwin/curbuf for "vimbuf" and save some things */
! aucmd_prepbuf(&aco, vimbuf);
!
! if (u_inssub(lnum + 1) == OK)
! {
! ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE);
! appended_lines_mark(lnum, 1L);
! }
!
! /* restore curwin/curbuf and a few other things */
! aucmd_restbuf(&aco);
! /* Careful: autocommands may have made "vimbuf" invalid! */
!
! update_curbuf(VALID);
! }
! }
}
--- 1311,1348 ----
VIBUF vimbuf;
PREINIT:
! int i;
! long lnum;
! char *line;
PPCODE:
if (buf_valid(vimbuf))
{
! if (items < 3)
! croak("Usage: VIBUF::Append(vimbuf, lnum, @lines)");
! lnum = SvIV(ST(1));
! for (i = 2; i < items; i++, lnum++)
! {
! line = SvPV(ST(i),PL_na);
! if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
! {
! aco_save_T aco;
!
! /* set curwin/curbuf for "vimbuf" and save some things */
! aucmd_prepbuf(&aco, vimbuf);
!
! if (u_inssub(lnum + 1) == OK)
! {
! ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE);
! appended_lines_mark(lnum, 1L);
! }
!
! /* restore curwin/curbuf and a few other things */
! aucmd_restbuf(&aco);
! /* Careful: autocommands may have made "vimbuf" invalid! */
!
! update_curbuf(VALID);
! }
! }
}