Karsten Hopp d17aa0
To: vim_dev@googlegroups.com
Karsten Hopp d17aa0
Subject: Patch 7.3.1146
Karsten Hopp d17aa0
Fcc: outbox
Karsten Hopp d17aa0
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp d17aa0
Mime-Version: 1.0
Karsten Hopp d17aa0
Content-Type: text/plain; charset=UTF-8
Karsten Hopp d17aa0
Content-Transfer-Encoding: 8bit
Karsten Hopp d17aa0
------------
Karsten Hopp d17aa0
Karsten Hopp d17aa0
Patch 7.3.1146
Karsten Hopp d17aa0
Problem:    New regexp engine: look-behind match not checked when followed by
Karsten Hopp d17aa0
	    zero-width match.
Karsten Hopp d17aa0
Solution:   Do the look-behind match before adding the zero-width state.
Karsten Hopp d17aa0
Files:	    src/regexp_nfa.c
Karsten Hopp d17aa0
Karsten Hopp d17aa0
Karsten Hopp d17aa0
*** ../vim-7.3.1145/src/regexp_nfa.c	2013-06-07 22:39:35.000000000 +0200
Karsten Hopp d17aa0
--- src/regexp_nfa.c	2013-06-08 13:16:52.000000000 +0200
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 4332,4337 ****
Karsten Hopp d17aa0
--- 4332,4338 ----
Karsten Hopp d17aa0
      nfa_list_T	*nextlist;
Karsten Hopp d17aa0
      int		*listids = NULL;
Karsten Hopp d17aa0
      nfa_state_T *add_state;
Karsten Hopp d17aa0
+     int		add_here;
Karsten Hopp d17aa0
      int		add_count;
Karsten Hopp d17aa0
      int		add_off;
Karsten Hopp d17aa0
      garray_T	pimlist;
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 4495,4500 ****
Karsten Hopp d17aa0
--- 4496,4502 ----
Karsten Hopp d17aa0
  	     * The most important is NFA_MATCH.
Karsten Hopp d17aa0
  	     */
Karsten Hopp d17aa0
  	    add_state = NULL;
Karsten Hopp d17aa0
+ 	    add_here = FALSE;
Karsten Hopp d17aa0
  	    add_count = 0;
Karsten Hopp d17aa0
  	    switch (t->state->c)
Karsten Hopp d17aa0
  	    {
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 4621,4638 ****
Karsten Hopp d17aa0
  			    /* t->state->out1 is the corresponding
Karsten Hopp d17aa0
  			     * END_INVISIBLE node; Add its out to the current
Karsten Hopp d17aa0
  			     * list (zero-width match). */
Karsten Hopp d17aa0
! 			    addstate_here(thislist, t->state->out1->out,
Karsten Hopp d17aa0
! 						  &t->subs, t->pim, &listidx);
Karsten Hopp d17aa0
  			}
Karsten Hopp d17aa0
  		    }
Karsten Hopp d17aa0
  		    else
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
  			/*
Karsten Hopp d17aa0
  			 * First try matching what follows at the current
Karsten Hopp d17aa0
! 			 * position.  Only if a match is found, addstate() is
Karsten Hopp d17aa0
! 			 * called, then verify the invisible match matches.
Karsten Hopp d17aa0
! 			 * Add a nfa_pim_T to the following states, it
Karsten Hopp d17aa0
! 			 * contains info about the invisible match.
Karsten Hopp d17aa0
  			 */
Karsten Hopp d17aa0
  			if (ga_grow(&pimlist, 1) == FAIL)
Karsten Hopp d17aa0
  			    goto theend;
Karsten Hopp d17aa0
--- 4623,4640 ----
Karsten Hopp d17aa0
  			    /* t->state->out1 is the corresponding
Karsten Hopp d17aa0
  			     * END_INVISIBLE node; Add its out to the current
Karsten Hopp d17aa0
  			     * list (zero-width match). */
Karsten Hopp d17aa0
! 			    add_here = TRUE;
Karsten Hopp d17aa0
! 			    add_state = t->state->out1->out;
Karsten Hopp d17aa0
  			}
Karsten Hopp d17aa0
  		    }
Karsten Hopp d17aa0
  		    else
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
  			/*
Karsten Hopp d17aa0
  			 * First try matching what follows at the current
Karsten Hopp d17aa0
! 			 * position.  Only if a match is found, before
Karsten Hopp d17aa0
! 			 * addstate() is called, then verify the invisible
Karsten Hopp d17aa0
! 			 * match matches.  Add a nfa_pim_T to the following
Karsten Hopp d17aa0
! 			 * states, it contains info about the invisible match.
Karsten Hopp d17aa0
  			 */
Karsten Hopp d17aa0
  			if (ga_grow(&pimlist, 1) == FAIL)
Karsten Hopp d17aa0
  			    goto theend;
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 4727,4734 ****
Karsten Hopp d17aa0
  			/* empty match, output of corresponding
Karsten Hopp d17aa0
  			 * NFA_END_PATTERN/NFA_SKIP to be used at current
Karsten Hopp d17aa0
  			 * position */
Karsten Hopp d17aa0
! 			addstate_here(thislist, t->state->out1->out->out,
Karsten Hopp d17aa0
! 						  &t->subs, t->pim, &listidx);
Karsten Hopp d17aa0
  		    }
Karsten Hopp d17aa0
  		    else if (bytelen <= clen)
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
--- 4729,4736 ----
Karsten Hopp d17aa0
  			/* empty match, output of corresponding
Karsten Hopp d17aa0
  			 * NFA_END_PATTERN/NFA_SKIP to be used at current
Karsten Hopp d17aa0
  			 * position */
Karsten Hopp d17aa0
! 			add_here = TRUE;
Karsten Hopp d17aa0
! 			add_state = t->state->out1->out->out;
Karsten Hopp d17aa0
  		    }
Karsten Hopp d17aa0
  		    else if (bytelen <= clen)
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 4751,4764 ****
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_BOL:
Karsten Hopp d17aa0
  		if (reginput == regline)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_EOL:
Karsten Hopp d17aa0
  		if (curc == NUL)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_BOW:
Karsten Hopp d17aa0
--- 4753,4770 ----
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_BOL:
Karsten Hopp d17aa0
  		if (reginput == regline)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_EOL:
Karsten Hopp d17aa0
  		if (curc == NUL)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_BOW:
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 4784,4791 ****
Karsten Hopp d17aa0
  				   && vim_iswordc_buf(reginput[-1], reg_buf)))
Karsten Hopp d17aa0
  		    result = FALSE;
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_EOW:
Karsten Hopp d17aa0
--- 4790,4799 ----
Karsten Hopp d17aa0
  				   && vim_iswordc_buf(reginput[-1], reg_buf)))
Karsten Hopp d17aa0
  		    result = FALSE;
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_EOW:
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 4810,4830 ****
Karsten Hopp d17aa0
  					   && vim_iswordc_buf(curc, reg_buf)))
Karsten Hopp d17aa0
  		    result = FALSE;
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_BOF:
Karsten Hopp d17aa0
  		if (reglnum == 0 && reginput == regline
Karsten Hopp d17aa0
  					&& (!REG_MULTI || reg_firstlnum == 1))
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_EOF:
Karsten Hopp d17aa0
  		if (reglnum == reg_maxline && curc == NUL)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  #ifdef FEAT_MBYTE
Karsten Hopp d17aa0
--- 4818,4844 ----
Karsten Hopp d17aa0
  					   && vim_iswordc_buf(curc, reg_buf)))
Karsten Hopp d17aa0
  		    result = FALSE;
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_BOF:
Karsten Hopp d17aa0
  		if (reglnum == 0 && reginput == regline
Karsten Hopp d17aa0
  					&& (!REG_MULTI || reg_firstlnum == 1))
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_EOF:
Karsten Hopp d17aa0
  		if (reglnum == reg_maxline && curc == NUL)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  #ifdef FEAT_MBYTE
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5183,5190 ****
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
  			/* empty match always works, output of NFA_SKIP to be
Karsten Hopp d17aa0
  			 * used next */
Karsten Hopp d17aa0
! 			addstate_here(thislist, t->state->out->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		    }
Karsten Hopp d17aa0
  		    else if (bytelen <= clen)
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
--- 5197,5204 ----
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
  			/* empty match always works, output of NFA_SKIP to be
Karsten Hopp d17aa0
  			 * used next */
Karsten Hopp d17aa0
! 			add_here = TRUE;
Karsten Hopp d17aa0
! 			add_state = t->state->out->out;
Karsten Hopp d17aa0
  		    }
Karsten Hopp d17aa0
  		    else if (bytelen <= clen)
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5228,5235 ****
Karsten Hopp d17aa0
  			nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
Karsten Hopp d17aa0
  			    (long_u)(reglnum + reg_firstlnum)));
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_COL:
Karsten Hopp d17aa0
--- 5242,5251 ----
Karsten Hopp d17aa0
  			nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
Karsten Hopp d17aa0
  			    (long_u)(reglnum + reg_firstlnum)));
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_COL:
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5238,5245 ****
Karsten Hopp d17aa0
  		result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
Karsten Hopp d17aa0
  			(long_u)(reginput - regline) + 1);
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_VCOL:
Karsten Hopp d17aa0
--- 5254,5263 ----
Karsten Hopp d17aa0
  		result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
Karsten Hopp d17aa0
  			(long_u)(reginput - regline) + 1);
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_VCOL:
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5250,5257 ****
Karsten Hopp d17aa0
  			    reg_win == NULL ? curwin : reg_win,
Karsten Hopp d17aa0
  			    regline, (colnr_T)(reginput - regline)) + 1);
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_MARK:
Karsten Hopp d17aa0
--- 5268,5277 ----
Karsten Hopp d17aa0
  			    reg_win == NULL ? curwin : reg_win,
Karsten Hopp d17aa0
  			    regline, (colnr_T)(reginput - regline)) + 1);
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_MARK:
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5273,5280 ****
Karsten Hopp d17aa0
  				    ? t->state->c == NFA_MARK_GT
Karsten Hopp d17aa0
  				    : t->state->c == NFA_MARK_LT)));
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  	      }
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
--- 5293,5302 ----
Karsten Hopp d17aa0
  				    ? t->state->c == NFA_MARK_GT
Karsten Hopp d17aa0
  				    : t->state->c == NFA_MARK_LT)));
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  	      }
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5284,5299 ****
Karsten Hopp d17aa0
  			&& ((colnr_T)(reginput - regline)
Karsten Hopp d17aa0
  						   == reg_win->w_cursor.col));
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_VISUAL:
Karsten Hopp d17aa0
  #ifdef FEAT_VISUAL
Karsten Hopp d17aa0
  		result = reg_match_visual();
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, t->state->out, &t->subs,
Karsten Hopp d17aa0
! 							    t->pim, &listidx);
Karsten Hopp d17aa0
  #endif
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
--- 5306,5325 ----
Karsten Hopp d17aa0
  			&& ((colnr_T)(reginput - regline)
Karsten Hopp d17aa0
  						   == reg_win->w_cursor.col));
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	    case NFA_VISUAL:
Karsten Hopp d17aa0
  #ifdef FEAT_VISUAL
Karsten Hopp d17aa0
  		result = reg_match_visual();
Karsten Hopp d17aa0
  		if (result)
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    add_here = TRUE;
Karsten Hopp d17aa0
! 		    add_state = t->state->out;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  #endif
Karsten Hopp d17aa0
  		break;
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5327,5333 ****
Karsten Hopp d17aa0
  		if (t->pim != NULL)
Karsten Hopp d17aa0
  		{
Karsten Hopp d17aa0
  		    /* postponed invisible match */
Karsten Hopp d17aa0
- 		    /* TODO: also do t->pim->pim recursively? */
Karsten Hopp d17aa0
  		    if (t->pim->result == NFA_PIM_TODO)
Karsten Hopp d17aa0
  		    {
Karsten Hopp d17aa0
  #ifdef ENABLE_LOG
Karsten Hopp d17aa0
--- 5353,5358 ----
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 5383,5391 ****
Karsten Hopp d17aa0
  			continue;
Karsten Hopp d17aa0
  		}
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
! 		addstate(nextlist, add_state, &t->subs, add_off);
Karsten Hopp d17aa0
! 		if (add_count > 0)
Karsten Hopp d17aa0
! 		    nextlist->t[nextlist->n - 1].count = add_count;
Karsten Hopp d17aa0
  	    }
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	} /* for (thislist = thislist; thislist->state; thislist++) */
Karsten Hopp d17aa0
--- 5408,5421 ----
Karsten Hopp d17aa0
  			continue;
Karsten Hopp d17aa0
  		}
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
! 		if (add_here)
Karsten Hopp d17aa0
! 		    addstate_here(thislist, add_state, &t->subs, NULL, &listidx);
Karsten Hopp d17aa0
! 		else
Karsten Hopp d17aa0
! 		{
Karsten Hopp d17aa0
! 		    addstate(nextlist, add_state, &t->subs, add_off);
Karsten Hopp d17aa0
! 		    if (add_count > 0)
Karsten Hopp d17aa0
! 			nextlist->t[nextlist->n - 1].count = add_count;
Karsten Hopp d17aa0
! 		}
Karsten Hopp d17aa0
  	    }
Karsten Hopp d17aa0
  
Karsten Hopp d17aa0
  	} /* for (thislist = thislist; thislist->state; thislist++) */
Karsten Hopp d17aa0
*** ../vim-7.3.1145/src/version.c	2013-06-07 22:39:35.000000000 +0200
Karsten Hopp d17aa0
--- src/version.c	2013-06-08 13:30:41.000000000 +0200
Karsten Hopp d17aa0
***************
Karsten Hopp d17aa0
*** 730,731 ****
Karsten Hopp d17aa0
--- 730,733 ----
Karsten Hopp d17aa0
  {   /* Add new patch number below this line */
Karsten Hopp d17aa0
+ /**/
Karsten Hopp d17aa0
+     1146,
Karsten Hopp d17aa0
  /**/
Karsten Hopp d17aa0
Karsten Hopp d17aa0
-- 
Karsten Hopp d17aa0
hundred-and-one symptoms of being an internet addict:
Karsten Hopp d17aa0
111. You and your friends get together regularly on IRC, even though
Karsten Hopp d17aa0
     all of you live in the same city.
Karsten Hopp d17aa0
Karsten Hopp d17aa0
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp d17aa0
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp d17aa0
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp d17aa0
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///