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

Raspunde prin e-mail lui