diff src/spell.c @ 355:644578c9e219

updated for version 7.0092
author vimboss
date Fri, 24 Jun 2005 23:01:23 +0000
parents a89aebda7f37
children e111db373ca4
line wrap: on
line diff
--- a/src/spell.c
+++ b/src/spell.c
@@ -2098,6 +2098,7 @@ did_set_spelllang(buf)
     garray_T	ga;
     char_u	*splp;
     char_u	*region;
+    int		filename;
     int		region_mask;
     slang_T	*lp;
     int		c;
@@ -2125,34 +2126,55 @@ did_set_spelllang(buf)
 	/* Get one language name. */
 	copy_option_part(&splp, lang, MAXWLEN, ",");
 
-	/* If there is a region name let "region" point to it and remove it
-	 * from the name. */
 	region = NULL;
 	len = STRLEN(lang);
-	if (len > 3 && lang[len - 3] == '_')
+
+	/* If the name ends in ".spl" use it as the name of the spell file.
+	 * If there is a region name let "region" point to it and remove it
+	 * from the name. */
+	if (len > 4 && fnamecmp(lang + len - 4, ".spl") == 0)
 	{
-	    region = lang + len - 2;
-	    len -= 3;
-	    lang[len] = NUL;
+	    filename = TRUE;
+
+	    /* Check if we loaded this language before. */
+	    for (lp = first_lang; lp != NULL; lp = lp->sl_next)
+		if (fullpathcmp(lang, lp->sl_fname, FALSE) == FPC_SAME)
+		    break;
 	}
-
-	/* Check if we loaded this language before. */
-	for (lp = first_lang; lp != NULL; lp = lp->sl_next)
-	    if (STRICMP(lp->sl_name, lang) == 0)
-		break;
+	else
+	{
+	    filename = FALSE;
+	    if (len > 3 && lang[len - 3] == '_')
+	    {
+		region = lang + len - 2;
+		len -= 3;
+		lang[len] = NUL;
+	    }
+
+	    /* Check if we loaded this language before. */
+	    for (lp = first_lang; lp != NULL; lp = lp->sl_next)
+		if (STRICMP(lang, lp->sl_name) == 0)
+		    break;
+	}
 
 	/* If not found try loading the language now. */
 	if (lp == NULL)
-	    spell_load_lang(lang);
+	{
+	    if (filename)
+		(void)spell_load_file(lang, lang, NULL, FALSE);
+	    else
+		spell_load_lang(lang);
+	}
 
 	/*
 	 * Loop over the languages, there can be several files for "lang".
 	 */
 	for (lp = first_lang; lp != NULL; lp = lp->sl_next)
-	    if (STRICMP(lp->sl_name, lang) == 0)
+	    if (filename ? fullpathcmp(lang, lp->sl_fname, FALSE) == FPC_SAME
+			 : STRICMP(lang, lp->sl_name) == 0)
 	    {
 		region_mask = REGION_ALL;
-		if (region != NULL)
+		if (!filename && region != NULL)
 		{
 		    /* find region in sl_regions */
 		    c = find_region(lp->sl_regions, region);
@@ -2311,6 +2333,29 @@ captype(word, end)
     return 0;
 }
 
+# if defined(FEAT_MBYTE) || defined(EXITFREE) || defined(PROTO)
+/*
+ * Free all languages.
+ */
+    void
+spell_free_all()
+{
+    slang_T	*lp;
+    buf_T	*buf;
+
+    /* Go through all buffers and handle 'spelllang'. */
+    for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+	ga_clear(&buf->b_langp);
+
+    while (first_lang != NULL)
+    {
+	lp = first_lang;
+	first_lang = lp->sl_next;
+	slang_free(lp);
+    }
+}
+# endif
+
 # if defined(FEAT_MBYTE) || defined(PROTO)
 /*
  * Clear all spelling tables and reload them.
@@ -2320,25 +2365,17 @@ captype(word, end)
 spell_reload()
 {
     buf_T	*buf;
-    slang_T	*lp;
     win_T	*wp;
 
     /* Initialize the table for SPELL_ISWORDP(). */
     init_spell_chartab();
 
     /* Unload all allocated memory. */
-    while (first_lang != NULL)
-    {
-	lp = first_lang;
-	first_lang = lp->sl_next;
-	slang_free(lp);
-    }
+    spell_free_all();
 
     /* Go through all buffers and handle 'spelllang'. */
     for (buf = firstbuf; buf != NULL; buf = buf->b_next)
     {
-	ga_clear(&buf->b_langp);
-
 	/* Only load the wordlists when 'spelllang' is set and there is a
 	 * window for this buffer in which 'spell' is set. */
 	if (*buf->b_p_spl != NUL)
@@ -5290,6 +5327,8 @@ spell_find_suggest(badptr, su, maxcount)
     vim_memset(su, 0, sizeof(suginfo_T));
     ga_init2(&su->su_ga, (int)sizeof(suggest_T), 10);
     ga_init2(&su->su_sga, (int)sizeof(suggest_T), 10);
+    if (*badptr == NUL)
+	return;
     hash_init(&su->su_banned);
 
     su->su_badptr = badptr;
@@ -7047,6 +7086,8 @@ add_banned(su, word)
 	hi = hash_lookup(&su->su_banned, s, hash);
 	if (HASHITEM_EMPTY(hi))
 	    hash_add_item(&su->su_banned, hi, s, hash);
+	else
+	    vim_free(s);
     }
 }
 
@@ -7920,10 +7961,15 @@ ex_spelldump(eap)
 						       & lp->lp_region) != 0))
 			{
 			    word[depth] = NUL;
-			    dump_word(word, round, flags, lnum++);
+
+			    /* Dump the basic word if there is no prefix or
+			     * when it's the first one. */
+			    c = (unsigned)flags >> 16;
+			    if (c == 0 || curi[depth] == 2)
+				dump_word(word, round, flags, lnum++);
 
 			    /* Apply the prefix, if there is one. */
-			    if ((unsigned)flags >> 16 != 0)
+			    if (c != 0)
 				lnum = apply_prefixes(slang, word, round,
 								 flags, lnum);
 			}