diff src/spell.c @ 1619:b9740fb41986

updated for version 7.2a
author vimboss
date Tue, 24 Jun 2008 20:39:31 +0000
parents 5e75d07bfe75
children 5b43a3a9454a
line wrap: on
line diff
--- a/src/spell.c
+++ b/src/spell.c
@@ -311,10 +311,6 @@
 
 #if defined(FEAT_SPELL) || defined(PROTO)
 
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
 #ifndef UNIX		/* it's in os_unix.h for Unix */
 # include <time.h>	/* for time_t */
 #endif
@@ -2945,7 +2941,7 @@ read_cnt_string(fd, cnt_bytes, cntp)
 
 /*
  * Read a string of length "cnt" from "fd" into allocated memory.
- * Returns NULL when out of memory.
+ * Returns NULL when out of memory or unable to read that many bytes.
  */
     static char_u *
 read_string(fd, cnt)
@@ -2954,14 +2950,23 @@ read_string(fd, cnt)
 {
     char_u	*str;
     int		i;
+    int		c;
 
     /* allocate memory */
     str = alloc((unsigned)cnt + 1);
     if (str != NULL)
     {
-	/* Read the string.  Doesn't check for truncated file. */
+	/* Read the string.  Quit when running into the EOF. */
 	for (i = 0; i < cnt; ++i)
-	    str[i] = getc(fd);
+	{
+	    c = getc(fd);
+	    if (c == EOF)
+	    {
+		vim_free(str);
+		return NULL;
+	    }
+	    str[i] = c;
+	}
 	str[i] = NUL;
     }
     return str;
@@ -3291,6 +3296,7 @@ read_words_section(fd, lp, len)
 {
     int		done = 0;
     int		i;
+    int		c;
     char_u	word[MAXWLEN];
 
     while (done < len)
@@ -3298,7 +3304,10 @@ read_words_section(fd, lp, len)
 	/* Read one word at a time. */
 	for (i = 0; ; ++i)
 	{
-	    word[i] = getc(fd);
+	    c = getc(fd);
+	    if (c == EOF)
+		return SP_TRUNCERROR;
+	    word[i] = c;
 	    if (word[i] == NUL)
 		break;
 	    if (i == MAXWLEN - 1)
@@ -3545,6 +3554,11 @@ read_compound(fd, slang, len)
     while (todo-- > 0)
     {
 	c = getc(fd);					/* <compflags> */
+	if (c == EOF)
+	{
+	    vim_free(pat);
+	    return SP_TRUNCERROR;
+	}
 
 	/* Add all flags to "sl_compallflags". */
 	if (vim_strchr((char_u *)"+*[]/", c) == NULL
@@ -6024,7 +6038,7 @@ aff_process_flags(affile, entry)
 	    flag = get_affitem(affile->af_flagtype, &p);
 	    if (flag == affile->af_comppermit || flag == affile->af_compforbid)
 	    {
-		mch_memmove(prevp, p, STRLEN(p) + 1);
+		STRMOVE(prevp, p);
 		p = prevp;
 		if (flag == affile->af_comppermit)
 		    entry->ae_comppermit = TRUE;
@@ -6515,7 +6529,7 @@ spell_read_dic(spin, fname, affile)
 	for (p = w; *p != NUL; mb_ptr_adv(p))
 	{
 	    if (*p == '\\' && (p[1] == '\\' || p[1] == '/'))
-		mch_memmove(p, p + 1, STRLEN(p));
+		STRMOVE(p, p + 1);
 	    else if (*p == '/')
 	    {
 		*p = NUL;
@@ -12574,7 +12588,7 @@ suggest_trie_walk(su, lp, fword, soundfo
 		    tl = (int)STRLEN(ftp->ft_to);
 		    if (fl != tl)
 		    {
-			mch_memmove(p + tl, p + fl, STRLEN(p + fl) + 1);
+			STRMOVE(p + tl, p + fl);
 			repextra += tl - fl;
 		    }
 		    mch_memmove(p, ftp->ft_to, tl);
@@ -12604,7 +12618,7 @@ suggest_trie_walk(su, lp, fword, soundfo
 	    p = fword + sp->ts_fidx;
 	    if (fl != tl)
 	    {
-		mch_memmove(p + fl, p + tl, STRLEN(p + tl) + 1);
+		STRMOVE(p + fl, p + tl);
 		repextra -= tl - fl;
 	    }
 	    mch_memmove(p, ftp->ft_from, fl);
@@ -13035,7 +13049,7 @@ stp_sal_score(stp, su, slang, badsound)
 	if (vim_iswhite(su->su_badptr[su->su_badlen])
 					 && *skiptowhite(stp->st_word) == NUL)
 	    for (p = fword; *(p = skiptowhite(p)) != NUL; )
-		mch_memmove(p, p + 1, STRLEN(p));
+		STRMOVE(p, p + 1);
 
 	spell_soundfold(slang, fword, TRUE, badsound2);
 	pbad = badsound2;
@@ -14281,8 +14295,7 @@ spell_soundfold_sal(slang, inword, res)
 			    s++;
 			}
 			if (k > k0)
-			    mch_memmove(word + i + k0, word + i + k,
-						    STRLEN(word + i + k) + 1);
+			    STRMOVE(word + i + k0, word + i + k);
 
 			/* new "actual letter" */
 			c = word[i];
@@ -14304,8 +14317,7 @@ spell_soundfold_sal(slang, inword, res)
 			{
 			    if (c != NUL)
 				res[reslen++] = c;
-			    mch_memmove(word, word + i + 1,
-						    STRLEN(word + i + 1) + 1);
+			    STRMOVE(word, word + i + 1);
 			    i = 0;
 			    z0 = 1;
 			}