updated for version 7.0092
diff --git a/src/spell.c b/src/spell.c
index 4ff413a..c5d8122 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -2098,6 +2098,7 @@
garray_T ga;
char_u *splp;
char_u *region;
+ int filename;
int region_mask;
slang_T *lp;
int c;
@@ -2125,34 +2126,55 @@
/* 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] == '_')
- {
- 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(lp->sl_name, lang) == 0)
- break;
+ /* 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)
+ {
+ 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;
+ }
+ 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 @@
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 @@
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 @@
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 @@
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 @@
& 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);
}