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);
!             }
!         }
      }
  

Raspunde prin e-mail lui