On Thursday, July 28, 2011 7:27:12 AM UTC-4, H Xu wrote:
>
> I'm using MSVC 9.0, using the following command to compile vim 7.3.266:
>
> nmake -f Make_mvc.mak GUI=yes PYTHON=C:\Python26 DEBUG=no
> OPTIMIZE=MAXSPEED PYTHON_VER=26 DYNAMIC_PYTHON=yes FEATURES=HUGE
> PERL=C:\perl PERL_VER=514 DYNAMIC_PERL=yes
>
> The link stage fails, with the following messages:
>
f_perl.obj : error LNK2001: unresolved external symbol
> __imp__Perl_sv_2bool_flags
> if_perl.obj : error LNK2001: unresolved external symbol
> __imp__Perl_xs_apiversion_bootcheck
>
But after I removed DYNAMIC_PERL=1 in the nmake arguments, the build
> will be successful.
>
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. BTW, on linux the
original if_perl.xs will let you link, but leads to an error at runtime when
using perl from vim.
Charlie Cooper
--
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);
! }
! }
}