a8166fc
To: vim-dev@vim.org
a8166fc
Subject: Patch 7.1.236
a8166fc
Fcc: outbox
a8166fc
From: Bram Moolenaar <Bram@moolenaar.net>
a8166fc
Mime-Version: 1.0
a8166fc
Content-Type: text/plain; charset=ISO-8859-1
a8166fc
Content-Transfer-Encoding: 8bit
a8166fc
------------
a8166fc
a8166fc
Patch 7.1.236
a8166fc
Problem:    When using 'incsearch' and 'hlsearch' a complicated pattern may
a8166fc
	    make Vim hang until CTRL-C is pressed.
a8166fc
Solution:   Add the 'redrawtime' option.
a8166fc
Files:	    runtime/doc/options.txt, src/ex_cmds.c, src/ex_docmd.c,
a8166fc
	    src/ex_getln.c, src/gui.c, src/misc1.c, src/normal.c,
a8166fc
	    src/option.c, src/quickfix.c, src/regexp.c, src/proto/regexp.pro,
a8166fc
	    src/proto/search.pro, src/search.c, src/screen.c,
a8166fc
	    src/option.h, src/spell.c, src/structs.h, src/syntax.c, src/tag.c,
a8166fc
	    src/vim.h
a8166fc
a8166fc
a8166fc
*** ../vim-7.1.235/runtime/doc/options.txt	Sun Aug 12 16:55:01 2007
a8166fc
--- runtime/doc/options.txt	Sat Jan 19 14:01:22 2008
a8166fc
***************
a8166fc
*** 3618,3623 ****
a8166fc
--- 3636,3642 ----
a8166fc
  	When you get bored looking at the highlighted matches, you can turn it
a8166fc
  	off with |:nohlsearch|.  As soon as you use a search command, the
a8166fc
  	highlighting comes back.
a8166fc
+ 	'redrawtime' specifies the maximum time spend on finding matches.
a8166fc
  	When the search pattern can match an end-of-line, Vim will try to
a8166fc
  	highlight all of the matched text.  However, this depends on where the
a8166fc
  	search starts.  This will be the first line in the window or the first
a8166fc
***************
a8166fc
*** 3851,3856 ****
a8166fc
--- 3870,3879 ----
a8166fc
  	original position when no match is found and when pressing <Esc>.  You
a8166fc
  	still need to finish the search command with <Enter> to move the
a8166fc
  	cursor to the match.
a8166fc
+ 	When compiled with the |+reltime| feature Vim only searches for about
a8166fc
+ 	half a second.  With a complicated pattern and/or a lot of text the
a8166fc
+ 	match may not be found.  This is to avoid that Vim hangs while you
a8166fc
+ 	are typing the pattern.
a8166fc
  	The highlighting can be set with the 'i' flag in 'highlight'.
a8166fc
  	See also: 'hlsearch'.
a8166fc
  	CTRL-L can be used to add one character from after the current match
a8166fc
***************
a8166fc
*** 5185,5190 ****
a8166fc
--- 5210,5227 ----
a8166fc
  	{not in Vi:}  When using the ":view" command the 'readonly' option is
a8166fc
  	set for the newly edited buffer.
a8166fc
  
a8166fc
+ 						*'redrawtime'* *'rdt'*
a8166fc
+ 'redrawtime' 'rdt'	number	(default 2000)
a8166fc
+ 			global
a8166fc
+ 			{not in Vi}
a8166fc
+ 			{only available when compiled with the |+reltime|
a8166fc
+ 			feature}
a8166fc
+ 	The time in milliseconds for redrawing the display.  This applies to
a8166fc
+ 	searching for patterns for 'hlsearch' and |:match| highlighting.
a8166fc
+ 	When redrawing takes more than this many milliseconds no further
a8166fc
+ 	matches will be highlighted.  This is used to avoid that Vim hangs
a8166fc
+ 	when using a very complicated pattern.
a8166fc
+ 
a8166fc
  						*'remap'* *'noremap'*
a8166fc
  'remap'			boolean	(default on)
a8166fc
  			global
a8166fc
*** ../vim-7.1.235/src/ex_cmds.c	Sun Jan 13 13:30:34 2008
a8166fc
--- src/ex_cmds.c	Sat Jan 19 13:04:28 2008
a8166fc
***************
a8166fc
*** 4446,4452 ****
a8166fc
  #endif
a8166fc
  		); ++lnum)
a8166fc
      {
a8166fc
! 	nmatch = vim_regexec_multi(&regmatch, curwin, curbuf, lnum, (colnr_T)0);
a8166fc
  	if (nmatch)
a8166fc
  	{
a8166fc
  	    colnr_T	copycol;
a8166fc
--- 4446,4453 ----
a8166fc
  #endif
a8166fc
  		); ++lnum)
a8166fc
      {
a8166fc
! 	nmatch = vim_regexec_multi(&regmatch, curwin, curbuf, lnum,
a8166fc
! 							    (colnr_T)0, NULL);
a8166fc
  	if (nmatch)
a8166fc
  	{
a8166fc
  	    colnr_T	copycol;
a8166fc
***************
a8166fc
*** 4957,4963 ****
a8166fc
  			|| (do_ask && !re_lookbehind(regmatch.regprog))
a8166fc
  			|| nmatch_tl > 0
a8166fc
  			|| (nmatch = vim_regexec_multi(&regmatch, curwin,
a8166fc
! 				       curbuf, sub_firstlnum, matchcol)) == 0
a8166fc
  			|| regmatch.startpos[0].lnum > 0)
a8166fc
  		{
a8166fc
  		    if (new_start != NULL)
a8166fc
--- 4958,4965 ----
a8166fc
  			|| (do_ask && !re_lookbehind(regmatch.regprog))
a8166fc
  			|| nmatch_tl > 0
a8166fc
  			|| (nmatch = vim_regexec_multi(&regmatch, curwin,
a8166fc
! 							curbuf, sub_firstlnum,
a8166fc
! 							 matchcol, NULL)) == 0
a8166fc
  			|| regmatch.startpos[0].lnum > 0)
a8166fc
  		{
a8166fc
  		    if (new_start != NULL)
a8166fc
***************
a8166fc
*** 5022,5028 ****
a8166fc
  		    }
a8166fc
  		    if (nmatch == -1 && !lastone)
a8166fc
  			nmatch = vim_regexec_multi(&regmatch, curwin, curbuf,
a8166fc
! 						     sub_firstlnum, matchcol);
a8166fc
  
a8166fc
  		    /*
a8166fc
  		     * 5. break if there isn't another match in this line
a8166fc
--- 5024,5030 ----
a8166fc
  		    }
a8166fc
  		    if (nmatch == -1 && !lastone)
a8166fc
  			nmatch = vim_regexec_multi(&regmatch, curwin, curbuf,
a8166fc
! 					       sub_firstlnum, matchcol, NULL);
a8166fc
  
a8166fc
  		    /*
a8166fc
  		     * 5. break if there isn't another match in this line
a8166fc
***************
a8166fc
*** 5252,5258 ****
a8166fc
      for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum)
a8166fc
      {
a8166fc
  	/* a match on this line? */
a8166fc
! 	match = vim_regexec_multi(&regmatch, curwin, curbuf, lnum, (colnr_T)0);
a8166fc
  	if ((type == 'g' && match) || (type == 'v' && !match))
a8166fc
  	{
a8166fc
  	    ml_setmarked(lnum);
a8166fc
--- 5254,5261 ----
a8166fc
      for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum)
a8166fc
      {
a8166fc
  	/* a match on this line? */
a8166fc
! 	match = vim_regexec_multi(&regmatch, curwin, curbuf, lnum,
a8166fc
! 							    (colnr_T)0, NULL);
a8166fc
  	if ((type == 'g' && match) || (type == 'v' && !match))
a8166fc
  	{
a8166fc
  	    ml_setmarked(lnum);
a8166fc
*** ../vim-7.1.235/src/ex_docmd.c	Sun Jan 13 17:11:25 2008
a8166fc
--- src/ex_docmd.c	Fri Jan 18 21:01:16 2008
a8166fc
***************
a8166fc
*** 3931,3937 ****
a8166fc
  				curwin->w_cursor.col = 0;
a8166fc
  			    searchcmdlen = 0;
a8166fc
  			    if (!do_search(NULL, c, cmd, 1L,
a8166fc
! 				      SEARCH_HIS + SEARCH_MSG + SEARCH_START))
a8166fc
  			    {
a8166fc
  				curwin->w_cursor = pos;
a8166fc
  				cmd = NULL;
a8166fc
--- 3931,3938 ----
a8166fc
  				curwin->w_cursor.col = 0;
a8166fc
  			    searchcmdlen = 0;
a8166fc
  			    if (!do_search(NULL, c, cmd, 1L,
a8166fc
! 					SEARCH_HIS + SEARCH_MSG + SEARCH_START,
a8166fc
! 					NULL))
a8166fc
  			    {
a8166fc
  				curwin->w_cursor = pos;
a8166fc
  				cmd = NULL;
a8166fc
*** ../vim-7.1.235/src/ex_getln.c	Fri Jan 18 13:15:32 2008
a8166fc
--- src/ex_getln.c	Fri Jan 18 21:34:42 2008
a8166fc
***************
a8166fc
*** 1709,1714 ****
a8166fc
--- 1709,1717 ----
a8166fc
  	if (p_is && !cmd_silent && (firstc == '/' || firstc == '?'))
a8166fc
  	{
a8166fc
  	    pos_T	end_pos;
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+ 	    proftime_T	tm;
a8166fc
+ #endif
a8166fc
  
a8166fc
  	    /* if there is a character waiting, search and redraw later */
a8166fc
  	    if (char_avail())
a8166fc
***************
a8166fc
*** 1727,1734 ****
a8166fc
  		cursor_off();		/* so the user knows we're busy */
a8166fc
  		out_flush();
a8166fc
  		++emsg_off;    /* So it doesn't beep if bad expr */
a8166fc
  		i = do_search(NULL, firstc, ccline.cmdbuff, count,
a8166fc
! 			SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK);
a8166fc
  		--emsg_off;
a8166fc
  		/* if interrupted while searching, behave like it failed */
a8166fc
  		if (got_int)
a8166fc
--- 1730,1747 ----
a8166fc
  		cursor_off();		/* so the user knows we're busy */
a8166fc
  		out_flush();
a8166fc
  		++emsg_off;    /* So it doesn't beep if bad expr */
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+ 		/* Set the time limit to half a second. */
a8166fc
+ 		profile_setlimit(500L, &tm;;
a8166fc
+ #endif
a8166fc
  		i = do_search(NULL, firstc, ccline.cmdbuff, count,
a8166fc
! 			SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK,
a8166fc
! #ifdef FEAT_RELTIME
a8166fc
! 			&tm
a8166fc
! #else
a8166fc
! 			NULL
a8166fc
! #endif
a8166fc
! 			);
a8166fc
  		--emsg_off;
a8166fc
  		/* if interrupted while searching, behave like it failed */
a8166fc
  		if (got_int)
a8166fc
*** ../vim-7.1.235/src/gui.c	Thu Jan  3 16:14:25 2008
a8166fc
--- src/gui.c	Fri Jan 18 21:01:36 2008
a8166fc
***************
a8166fc
*** 5052,5058 ****
a8166fc
  	/* Search for the next match. */
a8166fc
  	i = msg_scroll;
a8166fc
  	do_search(NULL, down ? '/' : '?', ga.ga_data, 1L,
a8166fc
! 						    SEARCH_MSG + SEARCH_MARK);
a8166fc
  	msg_scroll = i;	    /* don't let an error message set msg_scroll */
a8166fc
      }
a8166fc
  
a8166fc
--- 5052,5058 ----
a8166fc
  	/* Search for the next match. */
a8166fc
  	i = msg_scroll;
a8166fc
  	do_search(NULL, down ? '/' : '?', ga.ga_data, 1L,
a8166fc
! 					      SEARCH_MSG + SEARCH_MARK, NULL);
a8166fc
  	msg_scroll = i;	    /* don't let an error message set msg_scroll */
a8166fc
      }
a8166fc
  
a8166fc
*** ../vim-7.1.235/src/misc1.c	Thu Jan  3 12:42:38 2008
a8166fc
--- src/misc1.c	Sat Jan 19 13:04:39 2008
a8166fc
***************
a8166fc
*** 437,443 ****
a8166fc
      {
a8166fc
  	regmatch.rmm_ic = FALSE;
a8166fc
  	regmatch.rmm_maxcol = 0;
a8166fc
! 	if (vim_regexec_multi(&regmatch, curwin, curbuf, lnum, (colnr_T)0))
a8166fc
  	{
a8166fc
  	    pos.lnum = regmatch.endpos[0].lnum + lnum;
a8166fc
  	    pos.col = regmatch.endpos[0].col;
a8166fc
--- 437,444 ----
a8166fc
      {
a8166fc
  	regmatch.rmm_ic = FALSE;
a8166fc
  	regmatch.rmm_maxcol = 0;
a8166fc
! 	if (vim_regexec_multi(&regmatch, curwin, curbuf, lnum,
a8166fc
! 							    (colnr_T)0, NULL))
a8166fc
  	{
a8166fc
  	    pos.lnum = regmatch.endpos[0].lnum + lnum;
a8166fc
  	    pos.col = regmatch.endpos[0].col;
a8166fc
*** ../vim-7.1.235/src/normal.c	Sat Jan 12 17:11:25 2008
a8166fc
--- src/normal.c	Fri Jan 18 21:01:47 2008
a8166fc
***************
a8166fc
*** 6093,6099 ****
a8166fc
      curwin->w_set_curswant = TRUE;
a8166fc
  
a8166fc
      i = do_search(cap->oap, dir, pat, cap->count1,
a8166fc
! 				 opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG);
a8166fc
      if (i == 0)
a8166fc
  	clearop(cap->oap);
a8166fc
      else
a8166fc
--- 6093,6099 ----
a8166fc
      curwin->w_set_curswant = TRUE;
a8166fc
  
a8166fc
      i = do_search(cap->oap, dir, pat, cap->count1,
a8166fc
! 			   opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, NULL);
a8166fc
      if (i == 0)
a8166fc
  	clearop(cap->oap);
a8166fc
      else
a8166fc
*** ../vim-7.1.235/src/option.c	Tue Oct  2 20:40:01 2007
a8166fc
--- src/option.c	Sat Jan 19 13:44:33 2008
a8166fc
***************
a8166fc
*** 1991,1996 ****
a8166fc
--- 1991,2003 ----
a8166fc
      {"redraw",	    NULL,   P_BOOL|P_VI_DEF,
a8166fc
  			    (char_u *)NULL, PV_NONE,
a8166fc
  			    {(char_u *)FALSE, (char_u *)0L}},
a8166fc
+     {"redrawtime",  "rdt",  P_NUM|P_VI_DEF,
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+ 			    (char_u *)&p_rdt, PV_NONE,
a8166fc
+ #else
a8166fc
+ 			    (char_u *)NULL, PV_NONE,
a8166fc
+ #endif
a8166fc
+ 			    {(char_u *)2000L, (char_u *)0L}},
a8166fc
      {"remap",	    NULL,   P_BOOL|P_VI_DEF,
a8166fc
  			    (char_u *)&p_remap, PV_NONE,
a8166fc
  			    {(char_u *)TRUE, (char_u *)0L}},
a8166fc
*** ../vim-7.1.235/src/quickfix.c	Sun Sep 30 14:00:41 2007
a8166fc
--- src/quickfix.c	Sat Jan 19 13:04:53 2008
a8166fc
***************
a8166fc
*** 1803,1809 ****
a8166fc
  	    /* Move the cursor to the first line in the buffer */
a8166fc
  	    save_cursor = curwin->w_cursor;
a8166fc
  	    curwin->w_cursor.lnum = 0;
a8166fc
! 	    if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, SEARCH_KEEP))
a8166fc
  		curwin->w_cursor = save_cursor;
a8166fc
  	}
a8166fc
  
a8166fc
--- 1803,1810 ----
a8166fc
  	    /* Move the cursor to the first line in the buffer */
a8166fc
  	    save_cursor = curwin->w_cursor;
a8166fc
  	    curwin->w_cursor.lnum = 0;
a8166fc
! 	    if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1,
a8166fc
! 							   SEARCH_KEEP, NULL))
a8166fc
  		curwin->w_cursor = save_cursor;
a8166fc
  	}
a8166fc
  
a8166fc
***************
a8166fc
*** 3159,3165 ****
a8166fc
  	    {
a8166fc
  		col = 0;
a8166fc
  		while (vim_regexec_multi(&regmatch, curwin, buf, lnum,
a8166fc
! 								     col) > 0)
a8166fc
  		{
a8166fc
  		    ;
a8166fc
  		    if (qf_add_entry(qi, &prevp,
a8166fc
--- 3160,3166 ----
a8166fc
  	    {
a8166fc
  		col = 0;
a8166fc
  		while (vim_regexec_multi(&regmatch, curwin, buf, lnum,
a8166fc
! 							       col, NULL) > 0)
a8166fc
  		{
a8166fc
  		    ;
a8166fc
  		    if (qf_add_entry(qi, &prevp,
a8166fc
*** ../vim-7.1.235/src/regexp.c	Fri Jan 18 20:36:40 2008
a8166fc
--- src/regexp.c	Sat Jan 19 15:18:12 2008
a8166fc
***************
a8166fc
*** 3040,3046 ****
a8166fc
  } save_se_T;
a8166fc
  
a8166fc
  static char_u	*reg_getline __ARGS((linenr_T lnum));
a8166fc
! static long	vim_regexec_both __ARGS((char_u *line, colnr_T col));
a8166fc
  static long	regtry __ARGS((regprog_T *prog, colnr_T col));
a8166fc
  static void	cleanup_subexpr __ARGS((void));
a8166fc
  #ifdef FEAT_SYN_HL
a8166fc
--- 3040,3046 ----
a8166fc
  } save_se_T;
a8166fc
  
a8166fc
  static char_u	*reg_getline __ARGS((linenr_T lnum));
a8166fc
! static long	vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm));
a8166fc
  static long	regtry __ARGS((regprog_T *prog, colnr_T col));
a8166fc
  static void	cleanup_subexpr __ARGS((void));
a8166fc
  #ifdef FEAT_SYN_HL
a8166fc
***************
a8166fc
*** 3284,3290 ****
a8166fc
      ireg_icombine = FALSE;
a8166fc
  #endif
a8166fc
      ireg_maxcol = 0;
a8166fc
!     return (vim_regexec_both(line, col) != 0);
a8166fc
  }
a8166fc
  
a8166fc
  #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
a8166fc
--- 3284,3290 ----
a8166fc
      ireg_icombine = FALSE;
a8166fc
  #endif
a8166fc
      ireg_maxcol = 0;
a8166fc
!     return (vim_regexec_both(line, col, NULL) != 0);
a8166fc
  }
a8166fc
  
a8166fc
  #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
a8166fc
***************
a8166fc
*** 3308,3314 ****
a8166fc
      ireg_icombine = FALSE;
a8166fc
  #endif
a8166fc
      ireg_maxcol = 0;
a8166fc
!     return (vim_regexec_both(line, col) != 0);
a8166fc
  }
a8166fc
  #endif
a8166fc
  
a8166fc
--- 3308,3314 ----
a8166fc
      ireg_icombine = FALSE;
a8166fc
  #endif
a8166fc
      ireg_maxcol = 0;
a8166fc
!     return (vim_regexec_both(line, col, NULL) != 0);
a8166fc
  }
a8166fc
  #endif
a8166fc
  
a8166fc
***************
a8166fc
*** 3321,3332 ****
a8166fc
   * match otherwise.
a8166fc
   */
a8166fc
      long
a8166fc
! vim_regexec_multi(rmp, win, buf, lnum, col)
a8166fc
      regmmatch_T	*rmp;
a8166fc
      win_T	*win;		/* window in which to search or NULL */
a8166fc
      buf_T	*buf;		/* buffer in which to search */
a8166fc
      linenr_T	lnum;		/* nr of line to start looking for match */
a8166fc
      colnr_T	col;		/* column to start looking for match */
a8166fc
  {
a8166fc
      long	r;
a8166fc
      buf_T	*save_curbuf = curbuf;
a8166fc
--- 3321,3333 ----
a8166fc
   * match otherwise.
a8166fc
   */
a8166fc
      long
a8166fc
! vim_regexec_multi(rmp, win, buf, lnum, col, tm)
a8166fc
      regmmatch_T	*rmp;
a8166fc
      win_T	*win;		/* window in which to search or NULL */
a8166fc
      buf_T	*buf;		/* buffer in which to search */
a8166fc
      linenr_T	lnum;		/* nr of line to start looking for match */
a8166fc
      colnr_T	col;		/* column to start looking for match */
a8166fc
+     proftime_T	*tm;		/* timeout limit or NULL */
a8166fc
  {
a8166fc
      long	r;
a8166fc
      buf_T	*save_curbuf = curbuf;
a8166fc
***************
a8166fc
*** 3346,3352 ****
a8166fc
  
a8166fc
      /* Need to switch to buffer "buf" to make vim_iswordc() work. */
a8166fc
      curbuf = buf;
a8166fc
!     r = vim_regexec_both(NULL, col);
a8166fc
      curbuf = save_curbuf;
a8166fc
  
a8166fc
      return r;
a8166fc
--- 3347,3353 ----
a8166fc
  
a8166fc
      /* Need to switch to buffer "buf" to make vim_iswordc() work. */
a8166fc
      curbuf = buf;
a8166fc
!     r = vim_regexec_both(NULL, col, tm);
a8166fc
      curbuf = save_curbuf;
a8166fc
  
a8166fc
      return r;
a8166fc
***************
a8166fc
*** 3356,3365 ****
a8166fc
   * Match a regexp against a string ("line" points to the string) or multiple
a8166fc
   * lines ("line" is NULL, use reg_getline()).
a8166fc
   */
a8166fc
      static long
a8166fc
! vim_regexec_both(line, col)
a8166fc
      char_u	*line;
a8166fc
      colnr_T	col;		/* column to start looking for match */
a8166fc
  {
a8166fc
      regprog_T	*prog;
a8166fc
      char_u	*s;
a8166fc
--- 3357,3368 ----
a8166fc
   * Match a regexp against a string ("line" points to the string) or multiple
a8166fc
   * lines ("line" is NULL, use reg_getline()).
a8166fc
   */
a8166fc
+ /*ARGSUSED*/
a8166fc
      static long
a8166fc
! vim_regexec_both(line, col, tm)
a8166fc
      char_u	*line;
a8166fc
      colnr_T	col;		/* column to start looking for match */
a8166fc
+     proftime_T	*tm;		/* timeout limit or NULL */
a8166fc
  {
a8166fc
      regprog_T	*prog;
a8166fc
      char_u	*s;
a8166fc
***************
a8166fc
*** 3502,3507 ****
a8166fc
--- 3505,3513 ----
a8166fc
      }
a8166fc
      else
a8166fc
      {
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+ 	int tm_count = 0;
a8166fc
+ #endif
a8166fc
  	/* Messy cases:  unanchored match. */
a8166fc
  	while (!got_int)
a8166fc
  	{
a8166fc
***************
a8166fc
*** 3550,3555 ****
a8166fc
--- 3556,3570 ----
a8166fc
  	    else
a8166fc
  #endif
a8166fc
  		++col;
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+ 	    /* Check for timeout once in a twenty times to avoid overhead. */
a8166fc
+ 	    if (tm != NULL && ++tm_count == 20)
a8166fc
+ 	    {
a8166fc
+ 		tm_count = 0;
a8166fc
+ 		if (profile_passed_limit(tm))
a8166fc
+ 		    break;
a8166fc
+ 	    }
a8166fc
+ #endif
a8166fc
  	}
a8166fc
      }
a8166fc
  
a8166fc
*** ../vim-7.1.235/src/proto/regexp.pro	Sat May  5 19:42:08 2007
a8166fc
--- src/proto/regexp.pro	Sat Jan 19 13:14:09 2008
a8166fc
***************
a8166fc
*** 1,13 ****
a8166fc
  /* regexp.c */
a8166fc
- void free_regexp_stuff __ARGS((void));
a8166fc
  int re_multiline __ARGS((regprog_T *prog));
a8166fc
  int re_lookbehind __ARGS((regprog_T *prog));
a8166fc
  char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp));
a8166fc
  regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags));
a8166fc
  int vim_regcomp_had_eol __ARGS((void));
a8166fc
  int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
a8166fc
  int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
a8166fc
! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col));
a8166fc
  reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em));
a8166fc
  void unref_extmatch __ARGS((reg_extmatch_T *em));
a8166fc
  char_u *regtilde __ARGS((char_u *source, int magic));
a8166fc
--- 1,13 ----
a8166fc
  /* regexp.c */
a8166fc
  int re_multiline __ARGS((regprog_T *prog));
a8166fc
  int re_lookbehind __ARGS((regprog_T *prog));
a8166fc
  char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp));
a8166fc
  regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags));
a8166fc
  int vim_regcomp_had_eol __ARGS((void));
a8166fc
+ void free_regexp_stuff __ARGS((void));
a8166fc
  int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
a8166fc
  int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
a8166fc
! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm));
a8166fc
  reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em));
a8166fc
  void unref_extmatch __ARGS((reg_extmatch_T *em));
a8166fc
  char_u *regtilde __ARGS((char_u *source, int magic));
a8166fc
*** ../vim-7.1.235/src/proto/search.pro	Sun Jan  6 20:05:36 2008
a8166fc
--- src/proto/search.pro	Fri Jan 18 21:03:49 2008
a8166fc
***************
a8166fc
*** 11,17 ****
a8166fc
  void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
a8166fc
  void last_pat_prog __ARGS((regmmatch_T *regmatch));
a8166fc
  int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm));
a8166fc
! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options));
a8166fc
  int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
a8166fc
  int searchc __ARGS((cmdarg_T *cap, int t_cmd));
a8166fc
  pos_T *findmatch __ARGS((oparg_T *oap, int initc));
a8166fc
--- 11,17 ----
a8166fc
  void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
a8166fc
  void last_pat_prog __ARGS((regmmatch_T *regmatch));
a8166fc
  int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm));
a8166fc
! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options, proftime_T *tm));
a8166fc
  int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
a8166fc
  int searchc __ARGS((cmdarg_T *cap, int t_cmd));
a8166fc
  pos_T *findmatch __ARGS((oparg_T *oap, int initc));
a8166fc
*** ../vim-7.1.235/src/search.c	Sun Jan  6 20:05:36 2008
a8166fc
--- src/search.c	Sat Jan 19 13:13:25 2008
a8166fc
***************
a8166fc
*** 606,612 ****
a8166fc
  		 * Look for a match somewhere in line "lnum".
a8166fc
  		 */
a8166fc
  		nmatched = vim_regexec_multi(&regmatch, win, buf,
a8166fc
! 							    lnum, (colnr_T)0);
a8166fc
  		/* Abort searching on an error (e.g., out of stack). */
a8166fc
  		if (called_emsg)
a8166fc
  		    break;
a8166fc
--- 606,618 ----
a8166fc
  		 * Look for a match somewhere in line "lnum".
a8166fc
  		 */
a8166fc
  		nmatched = vim_regexec_multi(&regmatch, win, buf,
a8166fc
! 						      lnum, (colnr_T)0,
a8166fc
! #ifdef FEAT_RELTIME
a8166fc
! 						      tm
a8166fc
! #else
a8166fc
! 						      NULL
a8166fc
! #endif
a8166fc
! 						      );
a8166fc
  		/* Abort searching on an error (e.g., out of stack). */
a8166fc
  		if (called_emsg)
a8166fc
  		    break;
a8166fc
***************
a8166fc
*** 615,623 ****
a8166fc
  		    /* match may actually be in another line when using \zs */
a8166fc
  		    matchpos = regmatch.startpos[0];
a8166fc
  		    endpos = regmatch.endpos[0];
a8166fc
! # ifdef FEAT_EVAL
a8166fc
  		    submatch = first_submatch(&regmatch);
a8166fc
! # endif
a8166fc
  		    /* Line me be past end of buffer for "\n\zs". */
a8166fc
  		    if (lnum + matchpos.lnum > buf->b_ml.ml_line_count)
a8166fc
  			ptr = (char_u *)"";
a8166fc
--- 621,629 ----
a8166fc
  		    /* match may actually be in another line when using \zs */
a8166fc
  		    matchpos = regmatch.startpos[0];
a8166fc
  		    endpos = regmatch.endpos[0];
a8166fc
! #ifdef FEAT_EVAL
a8166fc
  		    submatch = first_submatch(&regmatch);
a8166fc
! #endif
a8166fc
  		    /* Line me be past end of buffer for "\n\zs". */
a8166fc
  		    if (lnum + matchpos.lnum > buf->b_ml.ml_line_count)
a8166fc
  			ptr = (char_u *)"";
a8166fc
***************
a8166fc
*** 693,699 ****
a8166fc
  			    if (ptr[matchcol] == NUL
a8166fc
  				    || (nmatched = vim_regexec_multi(&regmatch,
a8166fc
  					      win, buf, lnum + matchpos.lnum,
a8166fc
! 					      matchcol)) == 0)
a8166fc
  			    {
a8166fc
  				match_ok = FALSE;
a8166fc
  				break;
a8166fc
--- 699,711 ----
a8166fc
  			    if (ptr[matchcol] == NUL
a8166fc
  				    || (nmatched = vim_regexec_multi(&regmatch,
a8166fc
  					      win, buf, lnum + matchpos.lnum,
a8166fc
! 					      matchcol,
a8166fc
! #ifdef FEAT_RELTIME
a8166fc
! 					      tm
a8166fc
! #else
a8166fc
! 					      NULL
a8166fc
! #endif
a8166fc
! 					      )) == 0)
a8166fc
  			    {
a8166fc
  				match_ok = FALSE;
a8166fc
  				break;
a8166fc
***************
a8166fc
*** 799,805 ****
a8166fc
  			    if (ptr[matchcol] == NUL
a8166fc
  				    || (nmatched = vim_regexec_multi(&regmatch,
a8166fc
  					      win, buf, lnum + matchpos.lnum,
a8166fc
! 							      matchcol)) == 0)
a8166fc
  				break;
a8166fc
  
a8166fc
  			    /* Need to get the line pointer again, a
a8166fc
--- 811,823 ----
a8166fc
  			    if (ptr[matchcol] == NUL
a8166fc
  				    || (nmatched = vim_regexec_multi(&regmatch,
a8166fc
  					      win, buf, lnum + matchpos.lnum,
a8166fc
! 					      matchcol,
a8166fc
! #ifdef FEAT_RELTIME
a8166fc
! 					      tm
a8166fc
! #else
a8166fc
! 					      NULL
a8166fc
! #endif
a8166fc
! 					    )) == 0)
a8166fc
  				break;
a8166fc
  
a8166fc
  			    /* Need to get the line pointer again, a
a8166fc
***************
a8166fc
*** 977,988 ****
a8166fc
   * return 0 for failure, 1 for found, 2 for found and line offset added
a8166fc
   */
a8166fc
      int
a8166fc
! do_search(oap, dirc, pat, count, options)
a8166fc
      oparg_T	    *oap;	/* can be NULL */
a8166fc
      int		    dirc;	/* '/' or '?' */
a8166fc
      char_u	   *pat;
a8166fc
      long	    count;
a8166fc
      int		    options;
a8166fc
  {
a8166fc
      pos_T	    pos;	/* position of the last match */
a8166fc
      char_u	    *searchstr;
a8166fc
--- 995,1007 ----
a8166fc
   * return 0 for failure, 1 for found, 2 for found and line offset added
a8166fc
   */
a8166fc
      int
a8166fc
! do_search(oap, dirc, pat, count, options, tm)
a8166fc
      oparg_T	    *oap;	/* can be NULL */
a8166fc
      int		    dirc;	/* '/' or '?' */
a8166fc
      char_u	   *pat;
a8166fc
      long	    count;
a8166fc
      int		    options;
a8166fc
+     proftime_T	    *tm;	/* timeout limit or NULL */
a8166fc
  {
a8166fc
      pos_T	    pos;	/* position of the last match */
a8166fc
      char_u	    *searchstr;
a8166fc
***************
a8166fc
*** 1256,1262 ****
a8166fc
  		       (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
a8166fc
  			+ SEARCH_MSG + SEARCH_START
a8166fc
  			+ ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
a8166fc
! 		RE_LAST, (linenr_T)0, NULL);
a8166fc
  
a8166fc
  	if (dircp != NULL)
a8166fc
  	    *dircp = dirc;	/* restore second '/' or '?' for normal_cmd() */
a8166fc
--- 1275,1281 ----
a8166fc
  		       (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
a8166fc
  			+ SEARCH_MSG + SEARCH_START
a8166fc
  			+ ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
a8166fc
! 		RE_LAST, (linenr_T)0, tm);
a8166fc
  
a8166fc
  	if (dircp != NULL)
a8166fc
  	    *dircp = dirc;	/* restore second '/' or '?' for normal_cmd() */
a8166fc
*** ../vim-7.1.235/src/screen.c	Sat Jan 12 16:45:25 2008
a8166fc
--- src/screen.c	Sat Jan 19 13:52:29 2008
a8166fc
***************
a8166fc
*** 848,858 ****
a8166fc
--- 848,863 ----
a8166fc
  	cur->hl.buf = buf;
a8166fc
  	cur->hl.lnum = 0;
a8166fc
  	cur->hl.first_lnum = 0;
a8166fc
+ # ifdef FEAT_RELTIME
a8166fc
+ 	/* Set the time limit to 'redrawtime'. */
a8166fc
+ 	profile_setlimit(p_rdt, &(cur->hl.tm));
a8166fc
+ # endif
a8166fc
  	cur = cur->next;
a8166fc
      }
a8166fc
      search_hl.buf = buf;
a8166fc
      search_hl.lnum = 0;
a8166fc
      search_hl.first_lnum = 0;
a8166fc
+     /* time limit is set at the toplevel, for all windows */
a8166fc
  #endif
a8166fc
  
a8166fc
  #ifdef FEAT_LINEBREAK
a8166fc
***************
a8166fc
*** 6462,6467 ****
a8166fc
--- 6467,6476 ----
a8166fc
      {
a8166fc
  	last_pat_prog(&search_hl.rm);
a8166fc
  	search_hl.attr = hl_attr(HLF_L);
a8166fc
+ # ifdef FEAT_RELTIME
a8166fc
+ 	/* Set the time limit to 'redrawtime'. */
a8166fc
+ 	profile_setlimit(p_rdt, &search_hl.tm);
a8166fc
+ # endif
a8166fc
      }
a8166fc
  }
a8166fc
  
a8166fc
***************
a8166fc
*** 6587,6592 ****
a8166fc
--- 6596,6609 ----
a8166fc
      called_emsg = FALSE;
a8166fc
      for (;;)
a8166fc
      {
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+ 	/* Stop searching after passing the time limit. */
a8166fc
+ 	if (profile_passed_limit(&(shl->tm)))
a8166fc
+ 	{
a8166fc
+ 	    shl->lnum = 0;		/* no match found in time */
a8166fc
+ 	    break;
a8166fc
+ 	}
a8166fc
+ #endif
a8166fc
  	/* Three situations:
a8166fc
  	 * 1. No useful previous match: search from start of line.
a8166fc
  	 * 2. Not Vi compatible or empty match: continue at next character.
a8166fc
***************
a8166fc
*** 6620,6626 ****
a8166fc
  	    matchcol = shl->rm.endpos[0].col;
a8166fc
  
a8166fc
  	shl->lnum = lnum;
a8166fc
! 	nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol);
a8166fc
  	if (called_emsg)
a8166fc
  	{
a8166fc
  	    /* Error while handling regexp: stop using this regexp. */
a8166fc
--- 6637,6649 ----
a8166fc
  	    matchcol = shl->rm.endpos[0].col;
a8166fc
  
a8166fc
  	shl->lnum = lnum;
a8166fc
! 	nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol,
a8166fc
! #ifdef FEAT_RELTIME
a8166fc
! 		&(shl->tm)
a8166fc
! #else
a8166fc
! 		NULL
a8166fc
! #endif
a8166fc
! 		);
a8166fc
  	if (called_emsg)
a8166fc
  	{
a8166fc
  	    /* Error while handling regexp: stop using this regexp. */
a8166fc
*** ../vim-7.1.235/src/option.h	Thu May 10 20:34:47 2007
a8166fc
--- src/option.h	Sat Jan 19 13:45:51 2008
a8166fc
***************
a8166fc
*** 633,638 ****
a8166fc
--- 633,641 ----
a8166fc
  #ifdef FEAT_SEARCHPATH
a8166fc
  EXTERN char_u	*p_cdpath;	/* 'cdpath' */
a8166fc
  #endif
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+ EXTERN long	p_rdt;		/* 'redrawtime' */
a8166fc
+ #endif
a8166fc
  EXTERN int	p_remap;	/* 'remap' */
a8166fc
  EXTERN long	p_report;	/* 'report' */
a8166fc
  #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
a8166fc
*** ../vim-7.1.235/src/spell.c	Sat Jan 12 16:45:25 2008
a8166fc
--- src/spell.c	Fri Jan 18 21:02:47 2008
a8166fc
***************
a8166fc
*** 10343,10349 ****
a8166fc
      curwin->w_cursor.lnum = 0;
a8166fc
      while (!got_int)
a8166fc
      {
a8166fc
! 	if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP) == 0
a8166fc
  						   || u_save_cursor() == FAIL)
a8166fc
  	    break;
a8166fc
  
a8166fc
--- 10343,10349 ----
a8166fc
      curwin->w_cursor.lnum = 0;
a8166fc
      while (!got_int)
a8166fc
      {
a8166fc
! 	if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP, NULL) == 0
a8166fc
  						   || u_save_cursor() == FAIL)
a8166fc
  	    break;
a8166fc
  
a8166fc
*** ../vim-7.1.235/src/structs.h	Mon Oct  1 22:53:27 2007
a8166fc
--- src/structs.h	Fri Jan 18 21:18:53 2008
a8166fc
***************
a8166fc
*** 1717,1722 ****
a8166fc
--- 1717,1725 ----
a8166fc
      linenr_T	first_lnum;	/* first lnum to search for multi-line pat */
a8166fc
      colnr_T	startcol; /* in win_line() points to char where HL starts */
a8166fc
      colnr_T	endcol;	 /* in win_line() points to char where HL ends */
a8166fc
+ #ifdef FEAT_RELTIME
a8166fc
+     proftime_T	tm;	/* for a time limit */
a8166fc
+ #endif
a8166fc
  } match_T;
a8166fc
  
a8166fc
  /*
a8166fc
*** ../vim-7.1.235/src/syntax.c	Sun Jan 13 17:39:29 2008
a8166fc
--- src/syntax.c	Sat Jan 19 13:13:49 2008
a8166fc
***************
a8166fc
*** 3097,3103 ****
a8166fc
      colnr_T	col;
a8166fc
  {
a8166fc
      rmp->rmm_maxcol = syn_buf->b_p_smc;
a8166fc
!     if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col) > 0)
a8166fc
      {
a8166fc
  	rmp->startpos[0].lnum += lnum;
a8166fc
  	rmp->endpos[0].lnum += lnum;
a8166fc
--- 3097,3103 ----
a8166fc
      colnr_T	col;
a8166fc
  {
a8166fc
      rmp->rmm_maxcol = syn_buf->b_p_smc;
a8166fc
!     if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col, NULL) > 0)
a8166fc
      {
a8166fc
  	rmp->startpos[0].lnum += lnum;
a8166fc
  	rmp->endpos[0].lnum += lnum;
a8166fc
*** ../vim-7.1.235/src/tag.c	Thu May 10 19:44:07 2007
a8166fc
--- src/tag.c	Fri Jan 18 21:03:41 2008
a8166fc
***************
a8166fc
*** 3191,3197 ****
a8166fc
  #endif
a8166fc
  	    save_lnum = curwin->w_cursor.lnum;
a8166fc
  	    curwin->w_cursor.lnum = 0;	/* start search before first line */
a8166fc
! 	    if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, search_options))
a8166fc
  		retval = OK;
a8166fc
  	    else
a8166fc
  	    {
a8166fc
--- 3191,3198 ----
a8166fc
  #endif
a8166fc
  	    save_lnum = curwin->w_cursor.lnum;
a8166fc
  	    curwin->w_cursor.lnum = 0;	/* start search before first line */
a8166fc
! 	    if (do_search(NULL, pbuf[0], pbuf + 1, (long)1,
a8166fc
! 							search_options, NULL))
a8166fc
  		retval = OK;
a8166fc
  	    else
a8166fc
  	    {
a8166fc
***************
a8166fc
*** 3203,3209 ****
a8166fc
  		 */
a8166fc
  		p_ic = TRUE;
a8166fc
  		if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1,
a8166fc
! 							      search_options))
a8166fc
  		{
a8166fc
  		    /*
a8166fc
  		     * Failed to find pattern, take a guess: "^func  ("
a8166fc
--- 3204,3210 ----
a8166fc
  		 */
a8166fc
  		p_ic = TRUE;
a8166fc
  		if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1,
a8166fc
! 							search_options, NULL))
a8166fc
  		{
a8166fc
  		    /*
a8166fc
  		     * Failed to find pattern, take a guess: "^func  ("
a8166fc
***************
a8166fc
*** 3213,3225 ****
a8166fc
  		    cc = *tagp.tagname_end;
a8166fc
  		    *tagp.tagname_end = NUL;
a8166fc
  		    sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname);
a8166fc
! 		    if (!do_search(NULL, '/', pbuf, (long)1, search_options))
a8166fc
  		    {
a8166fc
  			/* Guess again: "^char * \
a8166fc
  			sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(",
a8166fc
  								tagp.tagname);
a8166fc
  			if (!do_search(NULL, '/', pbuf, (long)1,
a8166fc
! 							      search_options))
a8166fc
  			    found = 0;
a8166fc
  		    }
a8166fc
  		    *tagp.tagname_end = cc;
a8166fc
--- 3214,3227 ----
a8166fc
  		    cc = *tagp.tagname_end;
a8166fc
  		    *tagp.tagname_end = NUL;
a8166fc
  		    sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname);
a8166fc
! 		    if (!do_search(NULL, '/', pbuf, (long)1,
a8166fc
! 							search_options, NULL))
a8166fc
  		    {
a8166fc
  			/* Guess again: "^char * \
a8166fc
  			sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(",
a8166fc
  								tagp.tagname);
a8166fc
  			if (!do_search(NULL, '/', pbuf, (long)1,
a8166fc
! 							search_options, NULL))
a8166fc
  			    found = 0;
a8166fc
  		    }
a8166fc
  		    *tagp.tagname_end = cc;
a8166fc
*** ../vim-7.1.235/src/vim.h	Sat Jan  5 13:34:01 2008
a8166fc
--- src/vim.h	Fri Jan 18 21:29:22 2008
a8166fc
***************
a8166fc
*** 1550,1555 ****
a8166fc
--- 1550,1565 ----
a8166fc
  # define MB_MAXBYTES	21
a8166fc
  #endif
a8166fc
  
a8166fc
+ #if (defined(FEAT_PROFILE) || defined(FEAT_RELTIME)) && !defined(PROTO)
a8166fc
+ # ifdef WIN3264
a8166fc
+ typedef LARGE_INTEGER proftime_T;
a8166fc
+ # else
a8166fc
+ typedef struct timeval proftime_T;
a8166fc
+ # endif
a8166fc
+ #else
a8166fc
+ typedef int proftime_T;	    /* dummy for function prototypes */
a8166fc
+ #endif
a8166fc
+ 
a8166fc
  /* Include option.h before structs.h, because the number of window-local and
a8166fc
   * buffer-local options is used there. */
a8166fc
  #include "option.h"	    /* options and default values */
a8166fc
***************
a8166fc
*** 1760,1775 ****
a8166fc
  # include <io.h>	    /* for access() */
a8166fc
  
a8166fc
  # define stat(a,b) (access(a,0) ? -1 : stat(a,b))
a8166fc
- #endif
a8166fc
- 
a8166fc
- #if (defined(FEAT_PROFILE) || defined(FEAT_RELTIME)) && !defined(PROTO)
a8166fc
- # ifdef WIN3264
a8166fc
- typedef LARGE_INTEGER proftime_T;
a8166fc
- # else
a8166fc
- typedef struct timeval proftime_T;
a8166fc
- # endif
a8166fc
- #else
a8166fc
- typedef int proftime_T;	    /* dummy for function prototypes */
a8166fc
  #endif
a8166fc
  
a8166fc
  #include "ex_cmds.h"	    /* Ex command defines */
a8166fc
--- 1770,1775 ----
a8166fc
*** ../vim-7.1.235/src/version.c	Fri Jan 18 20:36:40 2008
a8166fc
--- src/version.c	Sat Jan 19 15:19:48 2008
a8166fc
***************
a8166fc
*** 668,669 ****
a8166fc
--- 668,671 ----
a8166fc
  {   /* Add new patch number below this line */
a8166fc
+ /**/
a8166fc
+     236,
a8166fc
  /**/
a8166fc
a8166fc
-- 
a8166fc
Every time I lose weight, it finds me again!
a8166fc
a8166fc
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
a8166fc
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
a8166fc
\\\        download, build and distribute -- http://www.A-A-P.org        ///
a8166fc
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///