Karsten Hopp 520a3c
To: vim_dev@googlegroups.com
Karsten Hopp 520a3c
Subject: Patch 7.3.893
Karsten Hopp 520a3c
Fcc: outbox
Karsten Hopp 520a3c
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp 520a3c
Mime-Version: 1.0
Karsten Hopp 520a3c
Content-Type: text/plain; charset=UTF-8
Karsten Hopp 520a3c
Content-Transfer-Encoding: 8bit
Karsten Hopp 520a3c
------------
Karsten Hopp 520a3c
Karsten Hopp 520a3c
Patch 7.3.893
Karsten Hopp 520a3c
Problem:    Crash when using b:, w: or t: after closing the buffer, window or
Karsten Hopp 520a3c
	    tabpage.
Karsten Hopp 520a3c
Solution:   Allocate the dictionary instead of having it part of the
Karsten Hopp 520a3c
	    buffer/window/tabpage struct. (Yukihiro Nakadaira)
Karsten Hopp 520a3c
Files:	    src/buffer.c, src/eval.c, src/fileio.c, src/structs.h,
Karsten Hopp 520a3c
	    src/window.c, src/proto/eval.pro
Karsten Hopp 520a3c
Karsten Hopp 520a3c
Karsten Hopp 520a3c
*** ../vim-7.3.892/src/buffer.c	2013-03-19 16:46:59.000000000 +0100
Karsten Hopp 520a3c
--- src/buffer.c	2013-04-15 12:07:07.000000000 +0200
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 648,653 ****
Karsten Hopp 520a3c
--- 648,656 ----
Karsten Hopp 520a3c
      buf_T	*buf;
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
      free_buffer_stuff(buf, TRUE);
Karsten Hopp 520a3c
+ #ifdef FEAT_EVAL
Karsten Hopp 520a3c
+     unref_var_dict(buf->b_vars);
Karsten Hopp 520a3c
+ #endif
Karsten Hopp 520a3c
  #ifdef FEAT_LUA
Karsten Hopp 520a3c
      lua_buffer_free(buf);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 689,696 ****
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     vars_clear(&buf->b_vars.dv_hashtab); /* free all internal variables */
Karsten Hopp 520a3c
!     hash_init(&buf->b_vars.dv_hashtab);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_USR_CMDS
Karsten Hopp 520a3c
      uc_clear(&buf->b_ucmds);		/* clear local user commands */
Karsten Hopp 520a3c
--- 692,699 ----
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     vars_clear(&buf->b_vars->dv_hashtab); /* free all internal variables */
Karsten Hopp 520a3c
!     hash_init(&buf->b_vars->dv_hashtab);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_USR_CMDS
Karsten Hopp 520a3c
      uc_clear(&buf->b_ucmds);		/* clear local user commands */
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 1694,1699 ****
Karsten Hopp 520a3c
--- 1697,1713 ----
Karsten Hopp 520a3c
  	    vim_free(ffname);
Karsten Hopp 520a3c
  	    return NULL;
Karsten Hopp 520a3c
  	}
Karsten Hopp 520a3c
+ #ifdef FEAT_EVAL
Karsten Hopp 520a3c
+ 	/* init b: variables */
Karsten Hopp 520a3c
+ 	buf->b_vars = dict_alloc();
Karsten Hopp 520a3c
+ 	if (buf->b_vars == NULL)
Karsten Hopp 520a3c
+ 	{
Karsten Hopp 520a3c
+ 	    vim_free(ffname);
Karsten Hopp 520a3c
+ 	    vim_free(buf);
Karsten Hopp 520a3c
+ 	    return NULL;
Karsten Hopp 520a3c
+ 	}
Karsten Hopp 520a3c
+ 	init_var_dict(buf->b_vars, &buf->b_bufvar, VAR_SCOPE);
Karsten Hopp 520a3c
+ #endif
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      if (ffname != NULL)
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 1778,1787 ****
Karsten Hopp 520a3c
      buf->b_wininfo->wi_fpos.lnum = lnum;
Karsten Hopp 520a3c
      buf->b_wininfo->wi_win = curwin;
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
- #ifdef FEAT_EVAL
Karsten Hopp 520a3c
-     /* init b: variables */
Karsten Hopp 520a3c
-     init_var_dict(&buf->b_vars, &buf->b_bufvar, VAR_SCOPE);
Karsten Hopp 520a3c
- #endif
Karsten Hopp 520a3c
  #ifdef FEAT_SYN_HL
Karsten Hopp 520a3c
      hash_init(&buf->b_s.b_keywtab);
Karsten Hopp 520a3c
      hash_init(&buf->b_s.b_keywtab_ic);
Karsten Hopp 520a3c
--- 1792,1797 ----
Karsten Hopp 520a3c
*** ../vim-7.3.892/src/eval.c	2013-03-19 14:25:50.000000000 +0100
Karsten Hopp 520a3c
--- src/eval.c	2013-04-15 12:26:33.000000000 +0200
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 2131,2137 ****
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
      char_u	numbuf[NUMBUFLEN];
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
!     list_hashtable_vars(&curbuf->b_vars.dv_hashtab, (char_u *)"b:",
Karsten Hopp 520a3c
  								 TRUE, first);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      sprintf((char *)numbuf, "%ld", (long)curbuf->b_changedtick);
Karsten Hopp 520a3c
--- 2131,2137 ----
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
      char_u	numbuf[NUMBUFLEN];
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
!     list_hashtable_vars(&curbuf->b_vars->dv_hashtab, (char_u *)"b:",
Karsten Hopp 520a3c
  								 TRUE, first);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      sprintf((char *)numbuf, "%ld", (long)curbuf->b_changedtick);
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 2146,2152 ****
Karsten Hopp 520a3c
  list_win_vars(first)
Karsten Hopp 520a3c
      int *first;
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
!     list_hashtable_vars(&curwin->w_vars.dv_hashtab,
Karsten Hopp 520a3c
  						 (char_u *)"w:", TRUE, first);
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
--- 2146,2152 ----
Karsten Hopp 520a3c
  list_win_vars(first)
Karsten Hopp 520a3c
      int *first;
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
!     list_hashtable_vars(&curwin->w_vars->dv_hashtab,
Karsten Hopp 520a3c
  						 (char_u *)"w:", TRUE, first);
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 2158,2164 ****
Karsten Hopp 520a3c
  list_tab_vars(first)
Karsten Hopp 520a3c
      int *first;
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
!     list_hashtable_vars(&curtab->tp_vars.dv_hashtab,
Karsten Hopp 520a3c
  						 (char_u *)"t:", TRUE, first);
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
--- 2158,2164 ----
Karsten Hopp 520a3c
  list_tab_vars(first)
Karsten Hopp 520a3c
      int *first;
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
!     list_hashtable_vars(&curtab->tp_vars->dv_hashtab,
Karsten Hopp 520a3c
  						 (char_u *)"t:", TRUE, first);
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 3948,3954 ****
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* b: variables */
Karsten Hopp 520a3c
!     ht = &curbuf->b_vars.dv_hashtab;
Karsten Hopp 520a3c
      if (bdone < ht->ht_used)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	if (bdone++ == 0)
Karsten Hopp 520a3c
--- 3948,3954 ----
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* b: variables */
Karsten Hopp 520a3c
!     ht = &curbuf->b_vars->dv_hashtab;
Karsten Hopp 520a3c
      if (bdone < ht->ht_used)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	if (bdone++ == 0)
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 3966,3972 ****
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* w: variables */
Karsten Hopp 520a3c
!     ht = &curwin->w_vars.dv_hashtab;
Karsten Hopp 520a3c
      if (wdone < ht->ht_used)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	if (wdone++ == 0)
Karsten Hopp 520a3c
--- 3966,3972 ----
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* w: variables */
Karsten Hopp 520a3c
!     ht = &curwin->w_vars->dv_hashtab;
Karsten Hopp 520a3c
      if (wdone < ht->ht_used)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	if (wdone++ == 0)
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 3980,3986 ****
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
      /* t: variables */
Karsten Hopp 520a3c
!     ht = &curtab->tp_vars.dv_hashtab;
Karsten Hopp 520a3c
      if (tdone < ht->ht_used)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	if (tdone++ == 0)
Karsten Hopp 520a3c
--- 3980,3986 ----
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
      /* t: variables */
Karsten Hopp 520a3c
!     ht = &curtab->tp_vars->dv_hashtab;
Karsten Hopp 520a3c
      if (tdone < ht->ht_used)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	if (tdone++ == 0)
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 6787,6802 ****
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* buffer-local variables */
Karsten Hopp 520a3c
      for (buf = firstbuf; buf != NULL; buf = buf->b_next)
Karsten Hopp 520a3c
! 	set_ref_in_ht(&buf->b_vars.dv_hashtab, copyID);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* window-local variables */
Karsten Hopp 520a3c
      FOR_ALL_TAB_WINDOWS(tp, wp)
Karsten Hopp 520a3c
! 	set_ref_in_ht(&wp->w_vars.dv_hashtab, copyID);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
      /* tabpage-local variables */
Karsten Hopp 520a3c
      for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
Karsten Hopp 520a3c
! 	set_ref_in_ht(&tp->tp_vars.dv_hashtab, copyID);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* global variables */
Karsten Hopp 520a3c
--- 6787,6802 ----
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* buffer-local variables */
Karsten Hopp 520a3c
      for (buf = firstbuf; buf != NULL; buf = buf->b_next)
Karsten Hopp 520a3c
! 	set_ref_in_item(&buf->b_bufvar.di_tv, copyID);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* window-local variables */
Karsten Hopp 520a3c
      FOR_ALL_TAB_WINDOWS(tp, wp)
Karsten Hopp 520a3c
! 	set_ref_in_item(&wp->w_winvar.di_tv, copyID);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
      /* tabpage-local variables */
Karsten Hopp 520a3c
      for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
Karsten Hopp 520a3c
! 	set_ref_in_item(&tp->tp_winvar.di_tv, copyID);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      /* global variables */
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 11156,11162 ****
Karsten Hopp 520a3c
  		 * find_var_in_ht(). */
Karsten Hopp 520a3c
  		varname = (char_u *)"b:" + 2;
Karsten Hopp 520a3c
  	    /* look up the variable */
Karsten Hopp 520a3c
! 	    v = find_var_in_ht(&curbuf->b_vars.dv_hashtab, varname, FALSE);
Karsten Hopp 520a3c
  	    if (v != NULL)
Karsten Hopp 520a3c
  		copy_tv(&v->di_tv, rettv);
Karsten Hopp 520a3c
  	}
Karsten Hopp 520a3c
--- 11156,11162 ----
Karsten Hopp 520a3c
  		 * find_var_in_ht(). */
Karsten Hopp 520a3c
  		varname = (char_u *)"b:" + 2;
Karsten Hopp 520a3c
  	    /* look up the variable */
Karsten Hopp 520a3c
! 	    v = find_var_in_ht(&curbuf->b_vars->dv_hashtab, varname, FALSE);
Karsten Hopp 520a3c
  	    if (v != NULL)
Karsten Hopp 520a3c
  		copy_tv(&v->di_tv, rettv);
Karsten Hopp 520a3c
  	}
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 11779,11785 ****
Karsten Hopp 520a3c
      if (tp != NULL && varname != NULL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	/* look up the variable */
Karsten Hopp 520a3c
! 	v = find_var_in_ht(&tp->tp_vars.dv_hashtab, varname, FALSE);
Karsten Hopp 520a3c
  	if (v != NULL)
Karsten Hopp 520a3c
  	    copy_tv(&v->di_tv, rettv);
Karsten Hopp 520a3c
  	else if (argvars[2].v_type != VAR_UNKNOWN)
Karsten Hopp 520a3c
--- 11779,11785 ----
Karsten Hopp 520a3c
      if (tp != NULL && varname != NULL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	/* look up the variable */
Karsten Hopp 520a3c
! 	v = find_var_in_ht(&tp->tp_vars->dv_hashtab, varname, FALSE);
Karsten Hopp 520a3c
  	if (v != NULL)
Karsten Hopp 520a3c
  	    copy_tv(&v->di_tv, rettv);
Karsten Hopp 520a3c
  	else if (argvars[2].v_type != VAR_UNKNOWN)
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 11935,11941 ****
Karsten Hopp 520a3c
  		 * find_var_in_ht(). */
Karsten Hopp 520a3c
  		varname = (char_u *)"w:" + 2;
Karsten Hopp 520a3c
  	    /* look up the variable */
Karsten Hopp 520a3c
! 	    v = find_var_in_ht(&win->w_vars.dv_hashtab, varname, FALSE);
Karsten Hopp 520a3c
  	    if (v != NULL)
Karsten Hopp 520a3c
  		copy_tv(&v->di_tv, rettv);
Karsten Hopp 520a3c
  	}
Karsten Hopp 520a3c
--- 11935,11941 ----
Karsten Hopp 520a3c
  		 * find_var_in_ht(). */
Karsten Hopp 520a3c
  		varname = (char_u *)"w:" + 2;
Karsten Hopp 520a3c
  	    /* look up the variable */
Karsten Hopp 520a3c
! 	    v = find_var_in_ht(&win->w_vars->dv_hashtab, varname, FALSE);
Karsten Hopp 520a3c
  	    if (v != NULL)
Karsten Hopp 520a3c
  		copy_tv(&v->di_tv, rettv);
Karsten Hopp 520a3c
  	}
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 14333,14339 ****
Karsten Hopp 520a3c
      rettv->v_type = VAR_STRING;
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
! #ifdef FEAT_MZSCHEME
Karsten Hopp 520a3c
  /*
Karsten Hopp 520a3c
   * "mzeval()" function
Karsten Hopp 520a3c
   */
Karsten Hopp 520a3c
--- 14333,14339 ----
Karsten Hopp 520a3c
      rettv->v_type = VAR_STRING;
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
! #if defined(FEAT_MZSCHEME) || defined(PROTO)
Karsten Hopp 520a3c
  /*
Karsten Hopp 520a3c
   * "mzeval()" function
Karsten Hopp 520a3c
   */
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 20134,20145 ****
Karsten Hopp 520a3c
  			       || vim_strchr(name + 2, AUTOLOAD_CHAR) != NULL)
Karsten Hopp 520a3c
  	return NULL;
Karsten Hopp 520a3c
      if (*name == 'b')				/* buffer variable */
Karsten Hopp 520a3c
! 	return &curbuf->b_vars.dv_hashtab;
Karsten Hopp 520a3c
      if (*name == 'w')				/* window variable */
Karsten Hopp 520a3c
! 	return &curwin->w_vars.dv_hashtab;
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
      if (*name == 't')				/* tab page variable */
Karsten Hopp 520a3c
! 	return &curtab->tp_vars.dv_hashtab;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
      if (*name == 'v')				/* v: variable */
Karsten Hopp 520a3c
  	return &vimvarht;
Karsten Hopp 520a3c
--- 20134,20145 ----
Karsten Hopp 520a3c
  			       || vim_strchr(name + 2, AUTOLOAD_CHAR) != NULL)
Karsten Hopp 520a3c
  	return NULL;
Karsten Hopp 520a3c
      if (*name == 'b')				/* buffer variable */
Karsten Hopp 520a3c
! 	return &curbuf->b_vars->dv_hashtab;
Karsten Hopp 520a3c
      if (*name == 'w')				/* window variable */
Karsten Hopp 520a3c
! 	return &curwin->w_vars->dv_hashtab;
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
      if (*name == 't')				/* tab page variable */
Karsten Hopp 520a3c
! 	return &curtab->tp_vars->dv_hashtab;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
      if (*name == 'v')				/* v: variable */
Karsten Hopp 520a3c
  	return &vimvarht;
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 20229,20234 ****
Karsten Hopp 520a3c
--- 20229,20247 ----
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  /*
Karsten Hopp 520a3c
+  * Unreference a dictionary initialized by init_var_dict().
Karsten Hopp 520a3c
+  */
Karsten Hopp 520a3c
+     void
Karsten Hopp 520a3c
+ unref_var_dict(dict)
Karsten Hopp 520a3c
+     dict_T	*dict;
Karsten Hopp 520a3c
+ {
Karsten Hopp 520a3c
+     /* Now the dict needs to be freed if no one else is using it, go back to
Karsten Hopp 520a3c
+      * normal reference counting. */
Karsten Hopp 520a3c
+     dict->dv_refcount -= DO_NOT_FREE_CNT - 1;
Karsten Hopp 520a3c
+     dict_unref(dict);
Karsten Hopp 520a3c
+ }
Karsten Hopp 520a3c
+ 
Karsten Hopp 520a3c
+ /*
Karsten Hopp 520a3c
   * Clean up a list of internal variables.
Karsten Hopp 520a3c
   * Frees all allocated variables and the value they contain.
Karsten Hopp 520a3c
   * Clears hashtab "ht", does not free it.
Karsten Hopp 520a3c
*** ../vim-7.3.892/src/fileio.c	2013-03-19 16:46:59.000000000 +0100
Karsten Hopp 520a3c
--- src/fileio.c	2013-04-15 11:52:34.000000000 +0200
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 8955,8962 ****
Karsten Hopp 520a3c
  	    /* Hmm, original window disappeared.  Just use the first one. */
Karsten Hopp 520a3c
  	    curwin = firstwin;
Karsten Hopp 520a3c
  # ifdef FEAT_EVAL
Karsten Hopp 520a3c
! 	vars_clear(&aucmd_win->w_vars.dv_hashtab);  /* free all w: variables */
Karsten Hopp 520a3c
! 	hash_init(&aucmd_win->w_vars.dv_hashtab);   /* re-use the hashtab */
Karsten Hopp 520a3c
  # endif
Karsten Hopp 520a3c
  #else
Karsten Hopp 520a3c
  	curwin = aco->save_curwin;
Karsten Hopp 520a3c
--- 8955,8962 ----
Karsten Hopp 520a3c
  	    /* Hmm, original window disappeared.  Just use the first one. */
Karsten Hopp 520a3c
  	    curwin = firstwin;
Karsten Hopp 520a3c
  # ifdef FEAT_EVAL
Karsten Hopp 520a3c
! 	vars_clear(&aucmd_win->w_vars->dv_hashtab);  /* free all w: variables */
Karsten Hopp 520a3c
! 	hash_init(&aucmd_win->w_vars->dv_hashtab);   /* re-use the hashtab */
Karsten Hopp 520a3c
  # endif
Karsten Hopp 520a3c
  #else
Karsten Hopp 520a3c
  	curwin = aco->save_curwin;
Karsten Hopp 520a3c
*** ../vim-7.3.892/src/structs.h	2012-07-16 17:31:48.000000000 +0200
Karsten Hopp 520a3c
--- src/structs.h	2013-04-15 11:52:34.000000000 +0200
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 1611,1617 ****
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
      dictitem_T	b_bufvar;	/* variable for "b:" Dictionary */
Karsten Hopp 520a3c
!     dict_T	b_vars;		/* internal variables, local to buffer */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
Karsten Hopp 520a3c
--- 1611,1617 ----
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
      dictitem_T	b_bufvar;	/* variable for "b:" Dictionary */
Karsten Hopp 520a3c
!     dict_T	*b_vars;	/* internal variables, local to buffer */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 1757,1763 ****
Karsten Hopp 520a3c
      frame_T	    *(tp_snapshot[SNAP_COUNT]);  /* window layout snapshots */
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
      dictitem_T	    tp_winvar;	    /* variable for "t:" Dictionary */
Karsten Hopp 520a3c
!     dict_T	    tp_vars;	    /* internal variables, local to tab page */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  };
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
--- 1757,1763 ----
Karsten Hopp 520a3c
      frame_T	    *(tp_snapshot[SNAP_COUNT]);  /* window layout snapshots */
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
      dictitem_T	    tp_winvar;	    /* variable for "t:" Dictionary */
Karsten Hopp 520a3c
!     dict_T	    *tp_vars;	    /* internal variables, local to tab page */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  };
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 2080,2086 ****
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
      dictitem_T	w_winvar;	/* variable for "w:" Dictionary */
Karsten Hopp 520a3c
!     dict_T	w_vars;		/* internal variables, local to window */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #if defined(FEAT_RIGHTLEFT) && defined(FEAT_FKMAP)
Karsten Hopp 520a3c
--- 2080,2086 ----
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
      dictitem_T	w_winvar;	/* variable for "w:" Dictionary */
Karsten Hopp 520a3c
!     dict_T	*w_vars;	/* internal variables, local to window */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #if defined(FEAT_RIGHTLEFT) && defined(FEAT_FKMAP)
Karsten Hopp 520a3c
*** ../vim-7.3.892/src/window.c	2013-02-06 13:37:58.000000000 +0100
Karsten Hopp 520a3c
--- src/window.c	2013-04-15 12:20:09.000000000 +0200
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 3457,3481 ****
Karsten Hopp 520a3c
  alloc_tabpage()
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
      tabpage_T	*tp;
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      tp = (tabpage_T *)alloc_clear((unsigned)sizeof(tabpage_T));
Karsten Hopp 520a3c
!     if (tp != NULL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
! # ifdef FEAT_GUI
Karsten Hopp 520a3c
! 	int	i;
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
! 	for (i = 0; i < 3; i++)
Karsten Hopp 520a3c
! 	    tp->tp_prev_which_scrollbars[i] = -1;
Karsten Hopp 520a3c
  # endif
Karsten Hopp 520a3c
  # ifdef FEAT_DIFF
Karsten Hopp 520a3c
! 	tp->tp_diff_invalid = TRUE;
Karsten Hopp 520a3c
  # endif
Karsten Hopp 520a3c
! #ifdef FEAT_EVAL
Karsten Hopp 520a3c
! 	/* init t: variables */
Karsten Hopp 520a3c
! 	init_var_dict(&tp->tp_vars, &tp->tp_winvar, VAR_SCOPE);
Karsten Hopp 520a3c
! #endif
Karsten Hopp 520a3c
! 	tp->tp_ch_used = p_ch;
Karsten Hopp 520a3c
!     }
Karsten Hopp 520a3c
      return tp;
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
--- 3457,3491 ----
Karsten Hopp 520a3c
  alloc_tabpage()
Karsten Hopp 520a3c
  {
Karsten Hopp 520a3c
      tabpage_T	*tp;
Karsten Hopp 520a3c
+ # ifdef FEAT_GUI
Karsten Hopp 520a3c
+     int		i;
Karsten Hopp 520a3c
+ # endif
Karsten Hopp 520a3c
+ 
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      tp = (tabpage_T *)alloc_clear((unsigned)sizeof(tabpage_T));
Karsten Hopp 520a3c
!     if (tp == NULL)
Karsten Hopp 520a3c
! 	return NULL;
Karsten Hopp 520a3c
! 
Karsten Hopp 520a3c
! # ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     /* init t: variables */
Karsten Hopp 520a3c
!     tp->tp_vars = dict_alloc();
Karsten Hopp 520a3c
!     if (tp->tp_vars == NULL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
! 	vim_free(tp);
Karsten Hopp 520a3c
! 	return NULL;
Karsten Hopp 520a3c
!     }
Karsten Hopp 520a3c
!     init_var_dict(tp->tp_vars, &tp->tp_winvar, VAR_SCOPE);
Karsten Hopp 520a3c
! # endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
! # ifdef FEAT_GUI
Karsten Hopp 520a3c
!     for (i = 0; i < 3; i++)
Karsten Hopp 520a3c
! 	tp->tp_prev_which_scrollbars[i] = -1;
Karsten Hopp 520a3c
  # endif
Karsten Hopp 520a3c
  # ifdef FEAT_DIFF
Karsten Hopp 520a3c
!     tp->tp_diff_invalid = TRUE;
Karsten Hopp 520a3c
  # endif
Karsten Hopp 520a3c
!     tp->tp_ch_used = p_ch;
Karsten Hopp 520a3c
! 
Karsten Hopp 520a3c
      return tp;
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 3491,3497 ****
Karsten Hopp 520a3c
      for (idx = 0; idx < SNAP_COUNT; ++idx)
Karsten Hopp 520a3c
  	clear_snapshot(tp, idx);
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     vars_clear(&tp->tp_vars.dv_hashtab);	/* free all t: variables */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
      vim_free(tp);
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
--- 3501,3509 ----
Karsten Hopp 520a3c
      for (idx = 0; idx < SNAP_COUNT; ++idx)
Karsten Hopp 520a3c
  	clear_snapshot(tp, idx);
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     vars_clear(&tp->tp_vars->dv_hashtab);	/* free all t: variables */
Karsten Hopp 520a3c
!     hash_init(&tp->tp_vars->dv_hashtab);
Karsten Hopp 520a3c
!     unref_var_dict(tp->tp_vars);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
      vim_free(tp);
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 4363,4433 ****
Karsten Hopp 520a3c
       * allocate window structure and linesizes arrays
Karsten Hopp 520a3c
       */
Karsten Hopp 520a3c
      new_wp = (win_T *)alloc_clear((unsigned)sizeof(win_T));
Karsten Hopp 520a3c
!     if (new_wp != NULL && win_alloc_lines(new_wp) == FAIL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	vim_free(new_wp);
Karsten Hopp 520a3c
! 	new_wp = NULL;
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
!     if (new_wp != NULL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  #ifdef FEAT_AUTOCMD
Karsten Hopp 520a3c
! 	/* Don't execute autocommands while the window is not properly
Karsten Hopp 520a3c
! 	 * initialized yet.  gui_create_scrollbar() may trigger a FocusGained
Karsten Hopp 520a3c
! 	 * event. */
Karsten Hopp 520a3c
! 	block_autocmds();
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
! 	/*
Karsten Hopp 520a3c
! 	 * link the window in the window list
Karsten Hopp 520a3c
! 	 */
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
! 	if (!hidden)
Karsten Hopp 520a3c
! 	    win_append(after, new_wp);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_VERTSPLIT
Karsten Hopp 520a3c
! 	new_wp->w_wincol = 0;
Karsten Hopp 520a3c
! 	new_wp->w_width = Columns;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
! 	/* position the display and the cursor at the top of the file. */
Karsten Hopp 520a3c
! 	new_wp->w_topline = 1;
Karsten Hopp 520a3c
  #ifdef FEAT_DIFF
Karsten Hopp 520a3c
! 	new_wp->w_topfill = 0;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
! 	new_wp->w_botline = 2;
Karsten Hopp 520a3c
! 	new_wp->w_cursor.lnum = 1;
Karsten Hopp 520a3c
  #ifdef FEAT_SCROLLBIND
Karsten Hopp 520a3c
! 	new_wp->w_scbind_pos = 1;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
! 	/* We won't calculate w_fraction until resizing the window */
Karsten Hopp 520a3c
! 	new_wp->w_fraction = 0;
Karsten Hopp 520a3c
! 	new_wp->w_prev_fraction_row = -1;
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_GUI
Karsten Hopp 520a3c
! 	if (gui.in_use)
Karsten Hopp 520a3c
! 	{
Karsten Hopp 520a3c
! 	    gui_create_scrollbar(&new_wp->w_scrollbars[SBAR_LEFT],
Karsten Hopp 520a3c
! 		    SBAR_LEFT, new_wp);
Karsten Hopp 520a3c
! 	    gui_create_scrollbar(&new_wp->w_scrollbars[SBAR_RIGHT],
Karsten Hopp 520a3c
! 		    SBAR_RIGHT, new_wp);
Karsten Hopp 520a3c
! 	}
Karsten Hopp 520a3c
! #endif
Karsten Hopp 520a3c
! #ifdef FEAT_EVAL
Karsten Hopp 520a3c
! 	/* init w: variables */
Karsten Hopp 520a3c
! 	init_var_dict(&new_wp->w_vars, &new_wp->w_winvar, VAR_SCOPE);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_FOLDING
Karsten Hopp 520a3c
! 	foldInitWin(new_wp);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_AUTOCMD
Karsten Hopp 520a3c
! 	unblock_autocmds();
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_SEARCH_EXTRA
Karsten Hopp 520a3c
! 	new_wp->w_match_head = NULL;
Karsten Hopp 520a3c
! 	new_wp->w_next_match_id = 4;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
-     }
Karsten Hopp 520a3c
      return new_wp;
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
--- 4375,4453 ----
Karsten Hopp 520a3c
       * allocate window structure and linesizes arrays
Karsten Hopp 520a3c
       */
Karsten Hopp 520a3c
      new_wp = (win_T *)alloc_clear((unsigned)sizeof(win_T));
Karsten Hopp 520a3c
!     if (new_wp == NULL)
Karsten Hopp 520a3c
! 	return NULL;
Karsten Hopp 520a3c
! 
Karsten Hopp 520a3c
!     if (win_alloc_lines(new_wp) == FAIL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
  	vim_free(new_wp);
Karsten Hopp 520a3c
! 	return NULL;
Karsten Hopp 520a3c
      }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
! #ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     /* init w: variables */
Karsten Hopp 520a3c
!     new_wp->w_vars = dict_alloc();
Karsten Hopp 520a3c
!     if (new_wp->w_vars == NULL)
Karsten Hopp 520a3c
      {
Karsten Hopp 520a3c
+ 	win_free_lsize(new_wp);
Karsten Hopp 520a3c
+ 	vim_free(new_wp);
Karsten Hopp 520a3c
+ 	return NULL;
Karsten Hopp 520a3c
+     }
Karsten Hopp 520a3c
+     init_var_dict(new_wp->w_vars, &new_wp->w_winvar, VAR_SCOPE);
Karsten Hopp 520a3c
+ #endif
Karsten Hopp 520a3c
+ 
Karsten Hopp 520a3c
  #ifdef FEAT_AUTOCMD
Karsten Hopp 520a3c
!     /* Don't execute autocommands while the window is not properly
Karsten Hopp 520a3c
!      * initialized yet.  gui_create_scrollbar() may trigger a FocusGained
Karsten Hopp 520a3c
!      * event. */
Karsten Hopp 520a3c
!     block_autocmds();
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
!     /*
Karsten Hopp 520a3c
!      * link the window in the window list
Karsten Hopp 520a3c
!      */
Karsten Hopp 520a3c
  #ifdef FEAT_WINDOWS
Karsten Hopp 520a3c
!     if (!hidden)
Karsten Hopp 520a3c
! 	win_append(after, new_wp);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_VERTSPLIT
Karsten Hopp 520a3c
!     new_wp->w_wincol = 0;
Karsten Hopp 520a3c
!     new_wp->w_width = Columns;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
!     /* position the display and the cursor at the top of the file. */
Karsten Hopp 520a3c
!     new_wp->w_topline = 1;
Karsten Hopp 520a3c
  #ifdef FEAT_DIFF
Karsten Hopp 520a3c
!     new_wp->w_topfill = 0;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
!     new_wp->w_botline = 2;
Karsten Hopp 520a3c
!     new_wp->w_cursor.lnum = 1;
Karsten Hopp 520a3c
  #ifdef FEAT_SCROLLBIND
Karsten Hopp 520a3c
!     new_wp->w_scbind_pos = 1;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
!     /* We won't calculate w_fraction until resizing the window */
Karsten Hopp 520a3c
!     new_wp->w_fraction = 0;
Karsten Hopp 520a3c
!     new_wp->w_prev_fraction_row = -1;
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_GUI
Karsten Hopp 520a3c
!     if (gui.in_use)
Karsten Hopp 520a3c
!     {
Karsten Hopp 520a3c
! 	gui_create_scrollbar(&new_wp->w_scrollbars[SBAR_LEFT],
Karsten Hopp 520a3c
! 		SBAR_LEFT, new_wp);
Karsten Hopp 520a3c
! 	gui_create_scrollbar(&new_wp->w_scrollbars[SBAR_RIGHT],
Karsten Hopp 520a3c
! 		SBAR_RIGHT, new_wp);
Karsten Hopp 520a3c
!     }
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_FOLDING
Karsten Hopp 520a3c
!     foldInitWin(new_wp);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_AUTOCMD
Karsten Hopp 520a3c
!     unblock_autocmds();
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  #ifdef FEAT_SEARCH_EXTRA
Karsten Hopp 520a3c
!     new_wp->w_match_head = NULL;
Karsten Hopp 520a3c
!     new_wp->w_next_match_id = 4;
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
      return new_wp;
Karsten Hopp 520a3c
  }
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 4488,4494 ****
Karsten Hopp 520a3c
      clear_winopt(&wp->w_allbuf_opt);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     vars_clear(&wp->w_vars.dv_hashtab);	    /* free all w: variables */
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      if (prevwin == wp)
Karsten Hopp 520a3c
--- 4508,4516 ----
Karsten Hopp 520a3c
      clear_winopt(&wp->w_allbuf_opt);
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
  #ifdef FEAT_EVAL
Karsten Hopp 520a3c
!     vars_clear(&wp->w_vars->dv_hashtab);	/* free all w: variables */
Karsten Hopp 520a3c
!     hash_init(&wp->w_vars->dv_hashtab);
Karsten Hopp 520a3c
!     unref_var_dict(wp->w_vars);
Karsten Hopp 520a3c
  #endif
Karsten Hopp 520a3c
  
Karsten Hopp 520a3c
      if (prevwin == wp)
Karsten Hopp 520a3c
*** ../vim-7.3.892/src/proto/eval.pro	2013-01-30 14:55:35.000000000 +0100
Karsten Hopp 520a3c
--- src/proto/eval.pro	2013-04-15 12:26:39.000000000 +0200
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 24,31 ****
Karsten Hopp 520a3c
  int get_spellword __ARGS((list_T *list, char_u **pp));
Karsten Hopp 520a3c
  typval_T *eval_expr __ARGS((char_u *arg, char_u **nextcmd));
Karsten Hopp 520a3c
  int call_vim_function __ARGS((char_u *func, int argc, char_u **argv, int safe, int str_arg_only, typval_T *rettv));
Karsten Hopp 520a3c
- void *call_func_retstr __ARGS((char_u *func, int argc, char_u **argv, int safe));
Karsten Hopp 520a3c
  long call_func_retnr __ARGS((char_u *func, int argc, char_u **argv, int safe));
Karsten Hopp 520a3c
  void *call_func_retlist __ARGS((char_u *func, int argc, char_u **argv, int safe));
Karsten Hopp 520a3c
  void *save_funccal __ARGS((void));
Karsten Hopp 520a3c
  void restore_funccal __ARGS((void *vfc));
Karsten Hopp 520a3c
--- 24,31 ----
Karsten Hopp 520a3c
  int get_spellword __ARGS((list_T *list, char_u **pp));
Karsten Hopp 520a3c
  typval_T *eval_expr __ARGS((char_u *arg, char_u **nextcmd));
Karsten Hopp 520a3c
  int call_vim_function __ARGS((char_u *func, int argc, char_u **argv, int safe, int str_arg_only, typval_T *rettv));
Karsten Hopp 520a3c
  long call_func_retnr __ARGS((char_u *func, int argc, char_u **argv, int safe));
Karsten Hopp 520a3c
+ void *call_func_retstr __ARGS((char_u *func, int argc, char_u **argv, int safe));
Karsten Hopp 520a3c
  void *call_func_retlist __ARGS((char_u *func, int argc, char_u **argv, int safe));
Karsten Hopp 520a3c
  void *save_funccal __ARGS((void));
Karsten Hopp 520a3c
  void restore_funccal __ARGS((void *vfc));
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 95,100 ****
Karsten Hopp 520a3c
--- 95,101 ----
Karsten Hopp 520a3c
  char_u *get_var_value __ARGS((char_u *name));
Karsten Hopp 520a3c
  void new_script_vars __ARGS((scid_T id));
Karsten Hopp 520a3c
  void init_var_dict __ARGS((dict_T *dict, dictitem_T *dict_var, int scope));
Karsten Hopp 520a3c
+ void unref_var_dict __ARGS((dict_T *dict));
Karsten Hopp 520a3c
  void vars_clear __ARGS((hashtab_T *ht));
Karsten Hopp 520a3c
  void copy_tv __ARGS((typval_T *from, typval_T *to));
Karsten Hopp 520a3c
  void ex_echo __ARGS((exarg_T *eap));
Karsten Hopp 520a3c
*** ../vim-7.3.892/src/version.c	2013-04-14 23:19:32.000000000 +0200
Karsten Hopp 520a3c
--- src/version.c	2013-04-15 12:19:17.000000000 +0200
Karsten Hopp 520a3c
***************
Karsten Hopp 520a3c
*** 730,731 ****
Karsten Hopp 520a3c
--- 730,733 ----
Karsten Hopp 520a3c
  {   /* Add new patch number below this line */
Karsten Hopp 520a3c
+ /**/
Karsten Hopp 520a3c
+     893,
Karsten Hopp 520a3c
  /**/
Karsten Hopp 520a3c
Karsten Hopp 520a3c
-- 
Karsten Hopp 520a3c
Apathy Error: Don't bother striking any key.
Karsten Hopp 520a3c
Karsten Hopp 520a3c
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp 520a3c
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp 520a3c
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp 520a3c
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///