updated for version 7.0081
diff --git a/src/charset.c b/src/charset.c
index 33c12f2..7ea9bbb 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -914,382 +914,6 @@
 # endif
     return (GET_CHARTAB(buf, *p) != 0);
 }
-
-/*
- * The tables used for spelling.  These are only used for the first 256
- * characters.
- */
-typedef struct spelltab_S
-{
-    char_u  st_isw[256];	/* flags: is word char */
-    char_u  st_isu[256];	/* flags: is uppercase char */
-    char_u  st_fold[256];	/* chars: folded case */
-} spelltab_T;
-
-static spelltab_T   spelltab;
-static int	    did_set_spelltab;
-
-#define SPELL_ISWORD	1
-#define SPELL_ISUPPER	2
-
-static void clear_spell_chartab __ARGS((spelltab_T *sp));
-static int set_spell_finish __ARGS((spelltab_T	*new_st));
-
-/*
- * Init the chartab used for spelling for ASCII.
- * EBCDIC is not supported!
- */
-    static void
-clear_spell_chartab(sp)
-    spelltab_T	*sp;
-{
-    int	    i;
-
-    /* Init everything to FALSE. */
-    vim_memset(sp->st_isw, FALSE, sizeof(sp->st_isw));
-    vim_memset(sp->st_isu, FALSE, sizeof(sp->st_isu));
-    for (i = 0; i < 256; ++i)
-	sp->st_fold[i] = i;
-
-    /* We include digits.  A word shouldn't start with a digit, but handling
-     * that is done separately. */
-    for (i = '0'; i <= '9'; ++i)
-	sp->st_isw[i] = TRUE;
-    for (i = 'A'; i <= 'Z'; ++i)
-    {
-	sp->st_isw[i] = TRUE;
-	sp->st_isu[i] = TRUE;
-	sp->st_fold[i] = i + 0x20;
-    }
-    for (i = 'a'; i <= 'z'; ++i)
-	sp->st_isw[i] = TRUE;
-}
-
-/*
- * Init the chartab used for spelling.  Only depends on 'encoding'.
- * Called once while starting up and when 'encoding' changes.
- * The default is to use isalpha(), but the spell file should define the word
- * characters to make it possible that 'encoding' differs from the current
- * locale.
- */
-    void
-init_spell_chartab()
-{
-    int	    i;
-
-    did_set_spelltab = FALSE;
-    clear_spell_chartab(&spelltab);
-
-#ifdef FEAT_MBYTE
-    if (enc_dbcs)
-    {
-	/* DBCS: assume double-wide characters are word characters. */
-	for (i = 128; i <= 255; ++i)
-	    if (MB_BYTE2LEN(i) == 2)
-		spelltab.st_isw[i] = TRUE;
-    }
-    else
-#endif
-    {
-	/* Rough guess: use isalpha() and isupper() for characters above 128.
-	 * */
-	for (i = 128; i < 256; ++i)
-	{
-	    spelltab.st_isw[i] = MB_ISUPPER(i) || MB_ISLOWER(i);
-	    if (MB_ISUPPER(i))
-	    {
-		spelltab.st_isu[i] = TRUE;
-		spelltab.st_fold[i] = MB_TOLOWER(i);
-	    }
-	}
-    }
-}
-
-#if defined(FEAT_MBYTE) || defined(PROTO)
-static char *e_affform = N_("E761: Format error in affix file FOL, LOW or UPP");
-static char *e_affrange = N_("E762: Character in FOL, LOW or UPP is out of range");
-
-/*
- * Set the spell character tables from strings in the affix file.
- */
-    int
-set_spell_chartab(fol, low, upp)
-    char_u	*fol;
-    char_u	*low;
-    char_u	*upp;
-{
-    /* We build the new tables here first, so that we can compare with the
-     * previous one. */
-    spelltab_T	new_st;
-    char_u	*pf = fol, *pl = low, *pu = upp;
-    int		f, l, u;
-
-    clear_spell_chartab(&new_st);
-
-    while (*pf != NUL)
-    {
-	if (*pl == NUL || *pu == NUL)
-	{
-	    EMSG(_(e_affform));
-	    return FAIL;
-	}
-#ifdef FEAT_MBYTE
-	f = mb_ptr2char_adv(&pf);
-	l = mb_ptr2char_adv(&pl);
-	u = mb_ptr2char_adv(&pu);
-#else
-	f = *pf++;
-	l = *pl++;
-	u = *pu++;
-#endif
-	/* Every character that appears is a word character. */
-	if (f < 256)
-	    new_st.st_isw[f] = TRUE;
-	if (l < 256)
-	    new_st.st_isw[l] = TRUE;
-	if (u < 256)
-	    new_st.st_isw[u] = TRUE;
-
-	/* if "LOW" and "FOL" are not the same the "LOW" char needs
-	 * case-folding */
-	if (l < 256 && l != f)
-	{
-	    if (f >= 256)
-	    {
-		EMSG(_(e_affrange));
-		return FAIL;
-	    }
-	    new_st.st_fold[l] = f;
-	}
-
-	/* if "UPP" and "FOL" are not the same the "UPP" char needs
-	 * case-folding and it's upper case. */
-	if (u < 256 && u != f)
-	{
-	    if (f >= 256)
-	    {
-		EMSG(_(e_affrange));
-		return FAIL;
-	    }
-	    new_st.st_fold[u] = f;
-	    new_st.st_isu[u] = TRUE;
-	}
-    }
-
-    if (*pl != NUL || *pu != NUL)
-    {
-	EMSG(_(e_affform));
-	return FAIL;
-    }
-
-    return set_spell_finish(&new_st);
-}
-#endif
-
-/*
- * Set the spell character tables from strings in the .spl file.
- */
-    int
-set_spell_charflags(flags, cnt, upp)
-    char_u	*flags;
-    int		cnt;
-    char_u	*upp;
-{
-    /* We build the new tables here first, so that we can compare with the
-     * previous one. */
-    spelltab_T	new_st;
-    int		i;
-    char_u	*p = upp;
-
-    clear_spell_chartab(&new_st);
-
-    for (i = 0; i < cnt; ++i)
-    {
-	new_st.st_isw[i + 128] = (flags[i] & SPELL_ISWORD) != 0;
-	new_st.st_isu[i + 128] = (flags[i] & SPELL_ISUPPER) != 0;
-
-	if (*p == NUL)
-	    return FAIL;
-#ifdef FEAT_MBYTE
-	new_st.st_fold[i + 128] = mb_ptr2char_adv(&p);
-#else
-	new_st.st_fold[i + 128] = *p++;
-#endif
-    }
-
-    return set_spell_finish(&new_st);
-}
-
-    static int
-set_spell_finish(new_st)
-    spelltab_T	*new_st;
-{
-    int		i;
-
-    if (did_set_spelltab)
-    {
-	/* check that it's the same table */
-	for (i = 0; i < 256; ++i)
-	{
-	    if (spelltab.st_isw[i] != new_st->st_isw[i]
-		    || spelltab.st_isu[i] != new_st->st_isu[i]
-		    || spelltab.st_fold[i] != new_st->st_fold[i])
-	    {
-		EMSG(_("E763: Word characters differ between spell files"));
-		return FAIL;
-	    }
-	}
-    }
-    else
-    {
-	/* copy the new spelltab into the one being used */
-	spelltab = *new_st;
-	did_set_spelltab = TRUE;
-    }
-
-    return OK;
-}
-
-#if defined(FEAT_MBYTE) || defined(PROTO)
-/*
- * Write the current tables into the .spl file.
- * This makes sure the same characters are recognized as word characters when
- * generating an when using a spell file.
- */
-    void
-write_spell_chartab(fd)
-    FILE	*fd;
-{
-    char_u	charbuf[256 * 4];
-    int		len = 0;
-    int		flags;
-    int		i;
-
-    fputc(128, fd);				    /* <charflagslen> */
-    for (i = 128; i < 256; ++i)
-    {
-	flags = 0;
-	if (spelltab.st_isw[i])
-	    flags |= SPELL_ISWORD;
-	if (spelltab.st_isu[i])
-	    flags |= SPELL_ISUPPER;
-	fputc(flags, fd);			    /* <charflags> */
-
-	len += mb_char2bytes(spelltab.st_fold[i], charbuf + len);
-    }
-
-    put_bytes(fd, (long_u)len, 2);		    /* <fcharlen> */
-    fwrite(charbuf, (size_t)len, (size_t)1, fd);    /* <fchars> */
-}
-#endif
-
-/*
- * Return TRUE if "p" points to a word character for spelling.
- */
-    int
-spell_iswordc(p)
-    char_u *p;
-{
-# ifdef FEAT_MBYTE
-    if (has_mbyte && MB_BYTE2LEN(*p) > 1)
-	return mb_get_class(p) >= 2;
-# endif
-    return spelltab.st_isw[*p];
-}
-
-/*
- * Return TRUE if "c" is an upper-case character for spelling.
- */
-    int
-spell_isupper(c)
-    int		c;
-{
-# ifdef FEAT_MBYTE
-    if (enc_utf8)
-    {
-	/* For Unicode we can call utf_isupper(), but don't do that for ASCII,
-	 * because we don't want to use 'casemap' here. */
-	if (c >= 128)
-	    return utf_isupper(c);
-    }
-    else if (has_mbyte && c > 256)
-    {
-	/* For characters above 255 we don't have something specfied.
-	 * Fall back to locale-dependent iswupper().  If not available
-	 * simply return FALSE. */
-#  ifdef HAVE_ISWUPPER
-	return iswupper(c);
-#  else
-	return FALSE;
-#  endif
-    }
-# endif
-    return spelltab.st_isu[c];
-}
-
-/*
- * case-fold "p[len]" into "buf[buflen]".  Used for spell checking.
- * Returns FAIL when something wrong.
- */
-    int
-spell_casefold(p, len, buf, buflen)
-    char_u	*p;
-    int		len;
-    char_u	*buf;
-    int		buflen;
-{
-    int		i;
-
-    if (len >= buflen)
-    {
-	buf[0] = NUL;
-	return FAIL;		/* result will not fit */
-    }
-
-#ifdef FEAT_MBYTE
-    if (has_mbyte)
-    {
-	int	c;
-	int	outi = 0;
-
-	/* Fold one character at a time. */
-	for (i = 0; i < len; i += mb_ptr2len_check(p + i))
-	{
-	    c = mb_ptr2char(p + i);
-	    if (enc_utf8)
-		/* For Unicode case folding is always the same, no need to use
-		 * the table from the spell file. */
-		c = utf_fold(c);
-	    else if (c < 256)
-		/* Use the table from the spell file. */
-		c = spelltab.st_fold[c];
-# ifdef HAVE_TOWLOWER
-	    else
-		/* We don't know what to do, fall back to towlower(), it
-		 * depends on the current locale. */
-		c = towlower(c);
-# endif
-	    if (outi + MB_MAXBYTES > buflen)
-	    {
-		buf[outi] = NUL;
-		return FAIL;
-	    }
-	    outi += mb_char2bytes(c, buf + outi);
-	}
-	buf[outi] = NUL;
-    }
-    else
-#endif
-    {
-	/* Be quick for non-multibyte encodings. */
-	for (i = 0; i < len; ++i)
-	    buf[i] = spelltab.st_fold[p[i]];
-	buf[i] = NUL;
-    }
-
-    return OK;
-}
-
 #endif /* FEAT_SYN_HL */
 
 /*
diff --git a/src/gui_mac.c b/src/gui_mac.c
index fbf9b30..70393be 100644
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -4185,6 +4185,7 @@
 	{"brown",	RGB(0x80, 0x40, 0x40)}, /*W*/
 	{"yellow",	RGB(0xFC, 0xF3, 0x05)}, /*M*/
 	{"lightyellow",	RGB(0xFF, 0xFF, 0xA0)}, /*M*/
+	{"darkyellow",	RGB(0xBB, 0xBB, 0x00)}, /*U*/
 	{"SeaGreen",	RGB(0x2E, 0x8B, 0x57)}, /*W 0x4E8975 */
 	{"orange",	RGB(0xFC, 0x80, 0x00)}, /*W 0xF87A17 */
 	{"Purple",	RGB(0xA0, 0x20, 0xF0)}, /*W 0x8e35e5 */
diff --git a/src/mbyte.c b/src/mbyte.c
index 996eb8d..93375bc 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -2192,6 +2192,7 @@
 {
     int		i, j, l;
     int		cdiff;
+    int		incomplete = FALSE;
     int		n = nn;
 
     for (i = 0; i < n; i += l)
@@ -2202,7 +2203,10 @@
 	{
 	    l = utf_byte2len(s1[i]);
 	    if (l > n - i)
+	    {
 		l = n - i;		    /* incomplete character */
+		incomplete = TRUE;
+	    }
 	    /* Check directly first, it's faster. */
 	    for (j = 0; j < l; ++j)
 		if (s1[i + j] != s2[i + j])
@@ -2210,7 +2214,7 @@
 	    if (j < l)
 	    {
 		/* If one of the two characters is incomplete return -1. */
-		if (i + utf_byte2len(s1[i]) > n || i + utf_byte2len(s2[i]) > n)
+		if (incomplete || i + utf_byte2len(s2[i]) > n)
 		    return -1;
 		cdiff = utf_fold(utf_ptr2char(s1 + i))
 					     - utf_fold(utf_ptr2char(s2 + i));
diff --git a/src/proto/spell.pro b/src/proto/spell.pro
index 45cade6..4fcb7ba 100644
--- a/src/proto/spell.pro
+++ b/src/proto/spell.pro
@@ -5,4 +5,5 @@
 void spell_reload __ARGS((void));
 void put_bytes __ARGS((FILE *fd, long_u nr, int len));
 void ex_mkspell __ARGS((exarg_T *eap));
+void init_spell_chartab __ARGS((void));
 /* vim: set ft=c : */
diff --git a/src/regexp.c b/src/regexp.c
index 81035af..bc13b38 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -322,9 +322,9 @@
 
 /* Used for an error (down from) vim_regcomp(): give the error message, set
  * rc_did_emsg and return NULL */
-#define EMSG_RET_NULL(m) { EMSG(m); rc_did_emsg = TRUE; return NULL; }
-#define EMSG_M_RET_NULL(m, c) { EMSG2(m, c ? "" : "\\"); rc_did_emsg = TRUE; return NULL; }
-#define EMSG_RET_FAIL(m) { EMSG(m); rc_did_emsg = TRUE; return FAIL; }
+#define EMSG_RET_NULL(m) return (EMSG(m), rc_did_emsg = TRUE, NULL)
+#define EMSG_M_RET_NULL(m, c) return (EMSG2((m), (c) ? "" : "\\"), rc_did_emsg = TRUE, NULL)
+#define EMSG_RET_FAIL(m) return (EMSG(m), rc_did_emsg = TRUE, FAIL)
 #define EMSG_ONE_RET_NULL EMSG_M_RET_NULL(_("E369: invalid item in %s%%[]"), reg_magic == MAGIC_ALL)
 
 #define MAX_LIMIT	(32767L << 16L)
@@ -1246,20 +1246,20 @@
     {
 #ifdef FEAT_SYN_HL
 	if (paren == REG_ZPAREN)
-	    EMSG_RET_NULL(_("E52: Unmatched \\z("))
+	    EMSG_RET_NULL(_("E52: Unmatched \\z("));
 	else
 #endif
 	    if (paren == REG_NPAREN)
-	    EMSG_M_RET_NULL(_("E53: Unmatched %s%%("), reg_magic == MAGIC_ALL)
+	    EMSG_M_RET_NULL(_("E53: Unmatched %s%%("), reg_magic == MAGIC_ALL);
 	else
-	    EMSG_M_RET_NULL(_("E54: Unmatched %s("), reg_magic == MAGIC_ALL)
+	    EMSG_M_RET_NULL(_("E54: Unmatched %s("), reg_magic == MAGIC_ALL);
     }
     else if (paren == REG_NOPAREN && peekchr() != NUL)
     {
 	if (curchr == Magic(')'))
-	    EMSG_M_RET_NULL(_("E55: Unmatched %s)"), reg_magic == MAGIC_ALL)
+	    EMSG_M_RET_NULL(_("E55: Unmatched %s)"), reg_magic == MAGIC_ALL);
 	else
-	    EMSG_RET_NULL(_(e_trailing))	/* "Can't happen". */
+	    EMSG_RET_NULL(_(e_trailing));	/* "Can't happen". */
 	/* NOTREACHED */
     }
     /*
@@ -2985,7 +2985,6 @@
 	char_u	*ptr;
 	lpos_T	pos;
     } se_u;
-    int		se_len;
 } save_se_T;
 
 static char_u	*reg_getline __ARGS((linenr_T lnum));
diff --git a/src/syntax.c b/src/syntax.c
index c9fc191..b4dfed4 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6028,7 +6028,7 @@
 	"Folded term=standout ctermbg=Grey ctermfg=DarkBlue guibg=LightGrey guifg=DarkBlue",
 	"FoldColumn term=standout ctermbg=Grey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue",
 	"SignColumn term=standout ctermbg=Grey ctermfg=DarkBlue guibg=Grey guifg=DarkBlue",
-	"Visual term=reverse ctermbg=Grey guibg=Grey",
+	"Visual term=reverse ctermbg=LightGrey guibg=LightGrey",
 	"DiffAdd term=bold ctermbg=LightBlue guibg=LightBlue",
 	"DiffChange term=bold ctermbg=LightMagenta guibg=LightMagenta",
 	"DiffDelete term=bold ctermfg=Blue ctermbg=LightCyan gui=bold guifg=Blue guibg=LightCyan",
@@ -6053,7 +6053,7 @@
 	"Folded term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=DarkGrey guifg=Cyan",
 	"FoldColumn term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=Grey guifg=Cyan",
 	"SignColumn term=standout ctermbg=DarkGrey ctermfg=Cyan guibg=Grey guifg=Cyan",
-	"Visual term=reverse ctermbg=Grey guibg=Grey",
+	"Visual term=reverse ctermbg=DarkGrey guibg=DarkGrey",
 	"DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue",
 	"DiffChange term=bold ctermbg=DarkMagenta guibg=DarkMagenta",
 	"DiffDelete term=bold ctermfg=Blue ctermbg=DarkCyan gui=bold guifg=Blue guibg=DarkCyan",
diff --git a/src/version.h b/src/version.h
index 7d49d7f..afb4c5f 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 5)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 5, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 6)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jun 6, compiled "