summaryrefslogtreecommitdiff
path: root/src/spell.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-11-19 16:38:07 +0100
committerBram Moolenaar <Bram@vim.org>2014-11-19 16:38:07 +0100
commitdffa5b8ecfa2091495b77ab487c07792646d0633 (patch)
tree9f9ccaac14e2fffceec8ee02ac7e6590de1c226b /src/spell.c
parentdf46f6f07f90c0014352ff05aecb8caf61e7cfa0 (diff)
downloadvim-git-dffa5b8ecfa2091495b77ab487c07792646d0633.tar.gz
updated for version 7.4.519v7.4.519
Problem: Crash when using syntax highlighting. Solution: When regprog is freed and replaced, store the result.
Diffstat (limited to 'src/spell.c')
-rw-r--r--src/spell.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/src/spell.c b/src/spell.c
index 1e52dfb26..9d7f933a2 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -1154,11 +1154,14 @@ spell_check(wp, ptr, attrp, capcol, docount)
if (capcol != NULL && wp->w_s->b_cap_prog != NULL)
{
regmatch_T regmatch;
+ int r;
/* Check for end of sentence. */
regmatch.regprog = wp->w_s->b_cap_prog;
regmatch.rm_ic = FALSE;
- if (vim_regexec(&regmatch, ptr, 0))
+ r = vim_regexec(&regmatch, ptr, 0);
+ wp->w_s->b_cap_prog = regmatch.regprog;
+ if (r)
*capcol = (int)(regmatch.endp[0] - ptr);
}
@@ -1786,7 +1789,6 @@ can_compound(slang, word, flags)
char_u *word;
char_u *flags;
{
- regmatch_T regmatch;
#ifdef FEAT_MBYTE
char_u uflags[MAXWLEN * 2];
int i;
@@ -1808,9 +1810,7 @@ can_compound(slang, word, flags)
else
#endif
p = flags;
- regmatch.regprog = slang->sl_compprog;
- regmatch.rm_ic = FALSE;
- if (!vim_regexec(&regmatch, p, 0))
+ if (!vim_regexec_prog(&slang->sl_compprog, FALSE, p, 0))
return FALSE;
/* Count the number of syllables. This may be slow, do it last. If there
@@ -1930,8 +1930,7 @@ valid_word_prefix(totprefcnt, arridx, flags, word, slang, cond_req)
{
int prefcnt;
int pidx;
- regprog_T *rp;
- regmatch_T regmatch;
+ regprog_T **rp;
int prefid;
prefid = (unsigned)flags >> 24;
@@ -1950,12 +1949,10 @@ valid_word_prefix(totprefcnt, arridx, flags, word, slang, cond_req)
/* Check the condition, if there is one. The condition index is
* stored in the two bytes above the prefix ID byte. */
- rp = slang->sl_prefprog[((unsigned)pidx >> 8) & 0xffff];
- if (rp != NULL)
+ rp = &slang->sl_prefprog[((unsigned)pidx >> 8) & 0xffff];
+ if (*rp != NULL)
{
- regmatch.regprog = rp;
- regmatch.rm_ic = FALSE;
- if (!vim_regexec(&regmatch, word, 0))
+ if (!vim_regexec_prog(rp, FALSE, word, 0))
continue;
}
else if (cond_req)
@@ -6903,7 +6900,6 @@ store_aff_word(spin, word, afflist, affile, ht, xht, condit, flags,
hashitem_T *hi;
affheader_T *ah;
affentry_T *ae;
- regmatch_T regmatch;
char_u newword[MAXWLEN];
int retval = OK;
int i, j;
@@ -6944,15 +6940,14 @@ store_aff_word(spin, word, afflist, affile, ht, xht, condit, flags,
* When a previously added affix had CIRCUMFIX this one
* must have it too, if it had not then this one must not
* have one either. */
- regmatch.regprog = ae->ae_prog;
- regmatch.rm_ic = FALSE;
if ((xht != NULL || !affile->af_pfxpostpone
|| ae->ae_chop != NULL
|| ae->ae_flags != NULL)
&& (ae->ae_chop == NULL
|| STRLEN(ae->ae_chop) < wordlen)
&& (ae->ae_prog == NULL
- || vim_regexec(&regmatch, word, (colnr_T)0))
+ || vim_regexec_prog(&ae->ae_prog, FALSE,
+ word, (colnr_T)0))
&& (((condit & CONDIT_CFIX) == 0)
== ((condit & CONDIT_AFF) == 0
|| ae->ae_flags == NULL
@@ -10478,6 +10473,7 @@ check_need_cap(lnum, col)
break;
}
}
+ curwin->w_s->b_cap_prog = regmatch.regprog;
}
vim_free(line_copy);