Patch       (after 7.0.44)
Problem:    xsubpp simply removes the newly added directives form
            if_perl.xs when converting it into if_perl.c
Solution:   See 
http://perldoc.perl.org/perlxs.html#Inserting-POD%2c-Comments-and-C-Preprocessor-Directives


*** ..\vim-7.0.044\src\if_perl.xs       2006-08-08 20:02:34.440876800 +0200
--- src\if_perl.xs      2006-08-08 21:07:26.287076800 +0200
***************
*** 1048,1053 ****
--- 1048,1054 ----
        }
      }

+ #ifdef FEAT_AUTOCMD
  void
  Set(vimbuf, ...)
      VIBUF vimbuf;
***************
*** 1068,1102 ****
            line = SvPV(ST(i),PL_na);
            if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
            {
-     #ifdef FEAT_AUTOCMD
                aco_save_T      aco;

                /* set curwin/curbuf for "vimbuf" and save some things */
                aucmd_prepbuf(&aco, vimbuf);
!     #else
                buf_T   *save_curbuf = curbuf;

                curbuf = vimbuf;
                curwin->w_buffer = vimbuf;
-     #endif
                if (u_savesub(lnum) == OK)
                {
                    ml_replace(lnum, (char_u *)line, TRUE);
                    changed_bytes(lnum, 0);
                }

-     #ifdef FEAT_AUTOCMD
-               /* restore curwin/curbuf and a few other things */
-               aucmd_restbuf(&aco);
-               /* Careful: autocommands may have made "vimbuf" invalid! */
-     #else
                curwin->w_buffer = save_curbuf;
                curbuf = save_curbuf;
-     #endif
            }
        }
      }

  void
  Delete(vimbuf, ...)
      VIBUF vimbuf;
--- 1069,1131 ----
            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! */
!           }
!       }
!     }
!
! #else
! void
! Set(vimbuf, ...)
!     VIBUF vimbuf;
!
!     PREINIT:
!     int i;
!     long lnum;
!     char *line;
!     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)
!           {
                buf_T   *save_curbuf = curbuf;

                curbuf = vimbuf;
                curwin->w_buffer = vimbuf;
                if (u_savesub(lnum) == OK)
                {
                    ml_replace(lnum, (char_u *)line, TRUE);
                    changed_bytes(lnum, 0);
                }

                curwin->w_buffer = save_curbuf;
                curbuf = save_curbuf;
            }
        }
      }

+ #endif
+
+ #ifdef FEAT_AUTOCMD
  void
  Delete(vimbuf, ...)
      VIBUF vimbuf;
***************
*** 1130,1144 ****
                if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
                {
                    buf_T       *save_curbuf = curbuf;
-     #ifdef FEAT_AUTOCMD
                    aco_save_T  aco;

                    /* set curwin/curbuf for "vimbuf" and save some things */
                    aucmd_prepbuf(&aco, vimbuf);
-     #else
-                   curbuf = vimbuf;
-                   curwin->w_buffer = vimbuf;
-     #endif
                    if (u_savedel(lnum, 1) == OK)
                    {
                        ml_delete(lnum, 0);
--- 1159,1168 ----
***************
*** 1146,1165 ****
                        if (save_curbuf == curbuf)
                            check_cursor();
                    }
-     #ifdef FEAT_AUTOCMD
                    /* restore curwin/curbuf and a few other things */
                    aucmd_restbuf(&aco);
                    /* Careful: autocommands may have made "vimbuf" invalid! */
!     #else
                    curwin->w_buffer = save_curbuf;
                    curbuf = save_curbuf;
-     #endif
                    update_curbuf(VALID);
                }
            }
        }
      }

  void
  Append(vimbuf, ...)
      VIBUF vimbuf;
--- 1170,1238 ----
                        if (save_curbuf == curbuf)
                            check_cursor();
                    }
                    /* restore curwin/curbuf and a few other things */
                    aucmd_restbuf(&aco);
                    /* Careful: autocommands may have made "vimbuf" invalid! */
!                   update_curbuf(VALID);
!               }
!           }
!       }
!     }
!
! #else
! void
! Delete(vimbuf, ...)
!     VIBUF vimbuf;
!
!     PREINIT:
!     long i, lnum = 0, count = 0;
!     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)
!               {
!                   buf_T       *save_curbuf = curbuf;
!                   curbuf = vimbuf;
!                   curwin->w_buffer = vimbuf;
!                   if (u_savedel(lnum, 1) == OK)
!                   {
!                       ml_delete(lnum, 0);
!                       deleted_lines_mark(lnum, 1L);
!                       if (save_curbuf == curbuf)
!                           check_cursor();
!                   }
                    curwin->w_buffer = save_curbuf;
                    curbuf = save_curbuf;
                    update_curbuf(VALID);
                }
            }
        }
      }

+ #endif
+
+ #ifdef FEAT_AUTOCMD
  void
  Append(vimbuf, ...)
      VIBUF vimbuf;
***************
*** 1180,1212 ****
            line = SvPV(ST(i),PL_na);
            if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
            {
-     #ifdef FEAT_AUTOCMD
                aco_save_T      aco;

                /* set curwin/curbuf for "vimbuf" and save some things */
                aucmd_prepbuf(&aco, vimbuf);
!     #else
                buf_T   *save_curbuf = curbuf;

                curbuf = vimbuf;
                curwin->w_buffer = vimbuf;
-     #endif
                if (u_inssub(lnum + 1) == OK)
                {
                    ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE);
                    appended_lines_mark(lnum, 1L);
                }

-     #ifdef FEAT_AUTOCMD
-               /* restore curwin/curbuf and a few other things */
-               aucmd_restbuf(&aco);
-               /* Careful: autocommands may have made "vimbuf" invalid! */
-     #else
                curwin->w_buffer = save_curbuf;
                curbuf = save_curbuf;
-     #endif
                update_curbuf(VALID);
            }
        }
      }

--- 1253,1312 ----
            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);
!           }
!       }
!     }
!
! #else
! void
! Append(vimbuf, ...)
!     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)
!           {
                buf_T   *save_curbuf = curbuf;

                curbuf = vimbuf;
                curwin->w_buffer = vimbuf;
                if (u_inssub(lnum + 1) == OK)
                {
                    ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE);
                    appended_lines_mark(lnum, 1L);
                }

                curwin->w_buffer = save_curbuf;
                curbuf = save_curbuf;
                update_curbuf(VALID);
            }
        }
      }

+ #endif

Reply via email to