diff --git a/7.4.519 b/7.4.519 new file mode 100644 index 0000000..5b7e02b --- /dev/null +++ b/7.4.519 @@ -0,0 +1,866 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.519 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.4.519 (after 7.4.497) +Problem: Crash when using syntax highlighting. +Solution: When regprog is freed and replaced, store the result. +Files: src/buffer.c, src/regexp.c, src/syntax.c, src/spell.c, + src/ex_cmds2.c, src/fileio.c, src/proto/fileio.pro, + src/proto/regexp.pro, src/os_unix.c + + +*** ../vim-7.4.518/src/buffer.c 2014-09-23 15:45:04.870801055 +0200 +--- src/buffer.c 2014-11-19 15:50:34.129292586 +0100 +*************** +*** 28,36 **** + #include "vim.h" + + #if defined(FEAT_CMDL_COMPL) || defined(FEAT_LISTCMDS) || defined(FEAT_EVAL) || defined(FEAT_PERL) +! static char_u *buflist_match __ARGS((regprog_T *prog, buf_T *buf, int ignore_case)); + # define HAVE_BUFLIST_MATCH +! static char_u *fname_match __ARGS((regprog_T *prog, char_u *name, int ignore_case)); + #endif + static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options)); + static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer)); +--- 28,36 ---- + #include "vim.h" + + #if defined(FEAT_CMDL_COMPL) || defined(FEAT_LISTCMDS) || defined(FEAT_EVAL) || defined(FEAT_PERL) +! static char_u *buflist_match __ARGS((regmatch_T *rmp, buf_T *buf, int ignore_case)); + # define HAVE_BUFLIST_MATCH +! static char_u *fname_match __ARGS((regmatch_T *rmp, char_u *name, int ignore_case)); + #endif + static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options)); + static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer)); +*************** +*** 2220,2226 **** + int curtab_only; /* find buffers in current tab only */ + { + buf_T *buf; +- regprog_T *prog; + int match = -1; + int find_listed; + char_u *pat; +--- 2220,2225 ---- +*************** +*** 2265,2278 **** + { + for (attempt = 0; attempt <= 3; ++attempt) + { + /* may add '^' and '$' */ + if (toggledollar) + *patend = (attempt < 2) ? NUL : '$'; /* add/remove '$' */ + p = pat; + if (*p == '^' && !(attempt & 1)) /* add/remove '^' */ + ++p; +! prog = vim_regcomp(p, p_magic ? RE_MAGIC : 0); +! if (prog == NULL) + { + vim_free(pat); + return -1; +--- 2264,2279 ---- + { + for (attempt = 0; attempt <= 3; ++attempt) + { ++ regmatch_T regmatch; ++ + /* may add '^' and '$' */ + if (toggledollar) + *patend = (attempt < 2) ? NUL : '$'; /* add/remove '$' */ + p = pat; + if (*p == '^' && !(attempt & 1)) /* add/remove '^' */ + ++p; +! regmatch.regprog = vim_regcomp(p, p_magic ? RE_MAGIC : 0); +! if (regmatch.regprog == NULL) + { + vim_free(pat); + return -1; +*************** +*** 2283,2289 **** + #ifdef FEAT_DIFF + && (!diffmode || diff_mode_buf(buf)) + #endif +! && buflist_match(prog, buf, FALSE) != NULL) + { + if (curtab_only) + { +--- 2284,2290 ---- + #ifdef FEAT_DIFF + && (!diffmode || diff_mode_buf(buf)) + #endif +! && buflist_match(®match, buf, FALSE) != NULL) + { + if (curtab_only) + { +*************** +*** 2310,2316 **** + match = buf->b_fnum; /* remember first match */ + } + +! vim_regfree(prog); + if (match >= 0) /* found one match */ + break; + } +--- 2311,2317 ---- + match = buf->b_fnum; /* remember first match */ + } + +! vim_regfree(regmatch.regprog); + if (match >= 0) /* found one match */ + break; + } +*************** +*** 2352,2358 **** + int round; + char_u *p; + int attempt; +- regprog_T *prog; + char_u *patc; + + *num_file = 0; /* return values in case of FAIL */ +--- 2353,2358 ---- +*************** +*** 2376,2385 **** + */ + for (attempt = 0; attempt <= 1; ++attempt) + { + if (attempt > 0 && patc == pat) + break; /* there was no anchor, no need to try again */ +! prog = vim_regcomp(patc + attempt * 11, RE_MAGIC); +! if (prog == NULL) + { + if (patc != pat) + vim_free(patc); +--- 2376,2387 ---- + */ + for (attempt = 0; attempt <= 1; ++attempt) + { ++ regmatch_T regmatch; ++ + if (attempt > 0 && patc == pat) + break; /* there was no anchor, no need to try again */ +! regmatch.regprog = vim_regcomp(patc + attempt * 11, RE_MAGIC); +! if (regmatch.regprog == NULL) + { + if (patc != pat) + vim_free(patc); +*************** +*** 2397,2403 **** + { + if (!buf->b_p_bl) /* skip unlisted buffers */ + continue; +! p = buflist_match(prog, buf, p_wic); + if (p != NULL) + { + if (round == 1) +--- 2399,2405 ---- + { + if (!buf->b_p_bl) /* skip unlisted buffers */ + continue; +! p = buflist_match(®match, buf, p_wic); + if (p != NULL) + { + if (round == 1) +*************** +*** 2419,2432 **** + *file = (char_u **)alloc((unsigned)(count * sizeof(char_u *))); + if (*file == NULL) + { +! vim_regfree(prog); + if (patc != pat) + vim_free(patc); + return FAIL; + } + } + } +! vim_regfree(prog); + if (count) /* match(es) found, break here */ + break; + } +--- 2421,2434 ---- + *file = (char_u **)alloc((unsigned)(count * sizeof(char_u *))); + if (*file == NULL) + { +! vim_regfree(regmatch.regprog); + if (patc != pat) + vim_free(patc); + return FAIL; + } + } + } +! vim_regfree(regmatch.regprog); + if (count) /* match(es) found, break here */ + break; + } +*************** +*** 2445,2461 **** + * Check for a match on the file name for buffer "buf" with regprog "prog". + */ + static char_u * +! buflist_match(prog, buf, ignore_case) +! regprog_T *prog; + buf_T *buf; + int ignore_case; /* when TRUE ignore case, when FALSE use 'fic' */ + { + char_u *match; + + /* First try the short file name, then the long file name. */ +! match = fname_match(prog, buf->b_sfname, ignore_case); + if (match == NULL) +! match = fname_match(prog, buf->b_ffname, ignore_case); + + return match; + } +--- 2447,2463 ---- + * Check for a match on the file name for buffer "buf" with regprog "prog". + */ + static char_u * +! buflist_match(rmp, buf, ignore_case) +! regmatch_T *rmp; + buf_T *buf; + int ignore_case; /* when TRUE ignore case, when FALSE use 'fic' */ + { + char_u *match; + + /* First try the short file name, then the long file name. */ +! match = fname_match(rmp, buf->b_sfname, ignore_case); + if (match == NULL) +! match = fname_match(rmp, buf->b_ffname, ignore_case); + + return match; + } +*************** +*** 2465,2491 **** + * Return "name" when there is a match, NULL when not. + */ + static char_u * +! fname_match(prog, name, ignore_case) +! regprog_T *prog; + char_u *name; + int ignore_case; /* when TRUE ignore case, when FALSE use 'fic' */ + { + char_u *match = NULL; + char_u *p; +- regmatch_T regmatch; + + if (name != NULL) + { +- regmatch.regprog = prog; + /* Ignore case when 'fileignorecase' or the argument is set. */ +! regmatch.rm_ic = p_fic || ignore_case; +! if (vim_regexec(®match, name, (colnr_T)0)) + match = name; + else + { + /* Replace $(HOME) with '~' and try matching again. */ + p = home_replace_save(NULL, name); +! if (p != NULL && vim_regexec(®match, p, (colnr_T)0)) + match = name; + vim_free(p); + } +--- 2467,2491 ---- + * Return "name" when there is a match, NULL when not. + */ + static char_u * +! fname_match(rmp, name, ignore_case) +! regmatch_T *rmp; + char_u *name; + int ignore_case; /* when TRUE ignore case, when FALSE use 'fic' */ + { + char_u *match = NULL; + char_u *p; + + if (name != NULL) + { + /* Ignore case when 'fileignorecase' or the argument is set. */ +! rmp->rm_ic = p_fic || ignore_case; +! if (vim_regexec(rmp, name, (colnr_T)0)) + match = name; + else + { + /* Replace $(HOME) with '~' and try matching again. */ + p = home_replace_save(NULL, name); +! if (p != NULL && vim_regexec(rmp, p, (colnr_T)0)) + match = name; + vim_free(p); + } +*** ../vim-7.4.518/src/regexp.c 2014-11-05 14:26:30.760758363 +0100 +--- src/regexp.c 2014-11-19 16:10:43.203390451 +0100 +*************** +*** 8163,8168 **** +--- 8163,8169 ---- + /* + * Match a regexp against a string. + * "rmp->regprog" is a compiled regexp as returned by vim_regcomp(). ++ * Note: "rmp->regprog" may be freed and changed. + * Uses curbuf for line count and 'iskeyword'. + * When "nl" is TRUE consider a "\n" in "line" to be a line break. + * +*************** +*** 8203,8208 **** +--- 8204,8232 ---- + return result; + } + ++ /* ++ * Note: "*prog" may be freed and changed. ++ */ ++ int ++ vim_regexec_prog(prog, ignore_case, line, col) ++ regprog_T **prog; ++ int ignore_case; ++ char_u *line; ++ colnr_T col; ++ { ++ int r; ++ regmatch_T regmatch; ++ ++ regmatch.regprog = *prog; ++ regmatch.rm_ic = ignore_case; ++ r = vim_regexec_both(®match, line, col, FALSE); ++ *prog = regmatch.regprog; ++ return r; ++ } ++ ++ /* ++ * Note: "rmp->regprog" may be freed and changed. ++ */ + int + vim_regexec(rmp, line, col) + regmatch_T *rmp; +*************** +*** 8216,8221 **** +--- 8240,8246 ---- + || defined(FIND_REPLACE_DIALOG) || defined(PROTO) + /* + * Like vim_regexec(), but consider a "\n" in "line" to be a line break. ++ * Note: "rmp->regprog" may be freed and changed. + */ + int + vim_regexec_nl(rmp, line, col) +*************** +*** 8230,8235 **** +--- 8255,8261 ---- + /* + * Match a regexp against multiple lines. + * "rmp->regprog" is a compiled regexp as returned by vim_regcomp(). ++ * Note: "rmp->regprog" may be freed and changed. + * Uses curbuf for line count and 'iskeyword'. + * + * Return zero if there is no match. Return number of lines contained in the +*** ../vim-7.4.518/src/syntax.c 2014-06-12 12:20:50.191541385 +0200 +--- src/syntax.c 2014-11-19 15:39:08.493182536 +0100 +*************** +*** 992,1004 **** + linenr_T lnum; + { + regmmatch_T regmatch; + + if (syn_block->b_syn_linecont_prog != NULL) + { + regmatch.rmm_ic = syn_block->b_syn_linecont_ic; + regmatch.regprog = syn_block->b_syn_linecont_prog; +! return syn_regexec(®match, lnum, (colnr_T)0, + IF_SYN_TIME(&syn_block->b_syn_linecont_time)); + } + return FALSE; + } +--- 992,1007 ---- + linenr_T lnum; + { + regmmatch_T regmatch; ++ int r; + + if (syn_block->b_syn_linecont_prog != NULL) + { + regmatch.rmm_ic = syn_block->b_syn_linecont_ic; + regmatch.regprog = syn_block->b_syn_linecont_prog; +! r = syn_regexec(®match, lnum, (colnr_T)0, + IF_SYN_TIME(&syn_block->b_syn_linecont_time)); ++ syn_block->b_syn_linecont_prog = regmatch.regprog; ++ return r; + } + return FALSE; + } +*************** +*** 2075,2080 **** +--- 2078,2085 ---- + cur_si->si_cont_list, &spp->sp_syn, + spp->sp_flags & HL_CONTAINED)))) + { ++ int r; ++ + /* If we already tried matching in this line, and + * there isn't a match before next_match_col, skip + * this item. */ +*************** +*** 2089,2098 **** + + regmatch.rmm_ic = spp->sp_ic; + regmatch.regprog = spp->sp_prog; +! if (!syn_regexec(®match, + current_lnum, + (colnr_T)lc_col, +! IF_SYN_TIME(&spp->sp_time))) + { + /* no match in this line, try another one */ + spp->sp_startcol = MAXCOL; +--- 2094,2105 ---- + + regmatch.rmm_ic = spp->sp_ic; + regmatch.regprog = spp->sp_prog; +! r = syn_regexec(®match, + current_lnum, + (colnr_T)lc_col, +! IF_SYN_TIME(&spp->sp_time)); +! spp->sp_prog = regmatch.regprog; +! if (!r) + { + /* no match in this line, try another one */ + spp->sp_startcol = MAXCOL; +*************** +*** 2963,2968 **** +--- 2970,2976 ---- + for (idx = start_idx; idx < syn_block->b_syn_patterns.ga_len; ++idx) + { + int lc_col = matchcol; ++ int r; + + spp = &(SYN_ITEMS(syn_block)[idx]); + if (spp->sp_type != SPTYPE_END) /* past last END pattern */ +*************** +*** 2973,2980 **** + + regmatch.rmm_ic = spp->sp_ic; + regmatch.regprog = spp->sp_prog; +! if (syn_regexec(®match, startpos->lnum, lc_col, +! IF_SYN_TIME(&spp->sp_time))) + { + if (best_idx == -1 || regmatch.startpos[0].col + < best_regmatch.startpos[0].col) +--- 2981,2990 ---- + + regmatch.rmm_ic = spp->sp_ic; + regmatch.regprog = spp->sp_prog; +! r = syn_regexec(®match, startpos->lnum, lc_col, +! IF_SYN_TIME(&spp->sp_time)); +! spp->sp_prog = regmatch.regprog; +! if (r) + { + if (best_idx == -1 || regmatch.startpos[0].col + < best_regmatch.startpos[0].col) +*************** +*** 3000,3013 **** + if (spp_skip != NULL) + { + int lc_col = matchcol - spp_skip->sp_offsets[SPO_LC_OFF]; + + if (lc_col < 0) + lc_col = 0; + regmatch.rmm_ic = spp_skip->sp_ic; + regmatch.regprog = spp_skip->sp_prog; +! if (syn_regexec(®match, startpos->lnum, lc_col, +! IF_SYN_TIME(&spp_skip->sp_time)) +! && regmatch.startpos[0].col + <= best_regmatch.startpos[0].col) + { + /* Add offset to skip pattern match */ +--- 3010,3025 ---- + if (spp_skip != NULL) + { + int lc_col = matchcol - spp_skip->sp_offsets[SPO_LC_OFF]; ++ int r; + + if (lc_col < 0) + lc_col = 0; + regmatch.rmm_ic = spp_skip->sp_ic; + regmatch.regprog = spp_skip->sp_prog; +! r = syn_regexec(®match, startpos->lnum, lc_col, +! IF_SYN_TIME(&spp_skip->sp_time)); +! spp_skip->sp_prog = regmatch.regprog; +! if (r && regmatch.startpos[0].col + <= best_regmatch.startpos[0].col) + { + /* Add offset to skip pattern match */ +*** ../vim-7.4.518/src/spell.c 2014-09-19 16:04:08.050417797 +0200 +--- src/spell.c 2014-11-19 16:28:49.798964748 +0100 +*************** +*** 1154,1164 **** + if (capcol != NULL && wp->w_s->b_cap_prog != NULL) + { + regmatch_T regmatch; + + /* Check for end of sentence. */ + regmatch.regprog = wp->w_s->b_cap_prog; + regmatch.rm_ic = FALSE; +! if (vim_regexec(®match, ptr, 0)) + *capcol = (int)(regmatch.endp[0] - ptr); + } + +--- 1154,1167 ---- + 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; +! r = vim_regexec(®match, ptr, 0); +! wp->w_s->b_cap_prog = regmatch.regprog; +! if (r) + *capcol = (int)(regmatch.endp[0] - ptr); + } + +*************** +*** 1786,1792 **** + char_u *word; + char_u *flags; + { +- regmatch_T regmatch; + #ifdef FEAT_MBYTE + char_u uflags[MAXWLEN * 2]; + int i; +--- 1789,1794 ---- +*************** +*** 1808,1816 **** + else + #endif + p = flags; +! regmatch.regprog = slang->sl_compprog; +! regmatch.rm_ic = FALSE; +! if (!vim_regexec(®match, p, 0)) + return FALSE; + + /* Count the number of syllables. This may be slow, do it last. If there +--- 1810,1816 ---- + else + #endif + p = flags; +! 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,1937 **** + { + int prefcnt; + int pidx; +! regprog_T *rp; +! regmatch_T regmatch; + int prefid; + + prefid = (unsigned)flags >> 24; +--- 1930,1936 ---- + { + int prefcnt; + int pidx; +! regprog_T **rp; + int prefid; + + prefid = (unsigned)flags >> 24; +*************** +*** 1950,1961 **** + + /* 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) + { +! regmatch.regprog = rp; +! regmatch.rm_ic = FALSE; +! if (!vim_regexec(®match, word, 0)) + continue; + } + else if (cond_req) +--- 1949,1958 ---- + + /* 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) + { +! if (!vim_regexec_prog(rp, FALSE, word, 0)) + continue; + } + else if (cond_req) +*************** +*** 6903,6909 **** + hashitem_T *hi; + affheader_T *ah; + affentry_T *ae; +- regmatch_T regmatch; + char_u newword[MAXWLEN]; + int retval = OK; + int i, j; +--- 6900,6905 ---- +*************** +*** 6944,6958 **** + * 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(®match, word, (colnr_T)0)) + && (((condit & CONDIT_CFIX) == 0) + == ((condit & CONDIT_AFF) == 0 + || ae->ae_flags == NULL +--- 6940,6953 ---- + * 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. */ + 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_prog(&ae->ae_prog, FALSE, +! word, (colnr_T)0)) + && (((condit & CONDIT_CFIX) == 0) + == ((condit & CONDIT_AFF) == 0 + || ae->ae_flags == NULL +*************** +*** 10478,10483 **** +--- 10473,10479 ---- + break; + } + } ++ curwin->w_s->b_cap_prog = regmatch.regprog; + } + + vim_free(line_copy); +*** ../vim-7.4.518/src/ex_cmds2.c 2014-08-06 18:17:03.471147780 +0200 +--- src/ex_cmds2.c 2014-11-19 16:24:22.162013396 +0100 +*************** +*** 739,745 **** + struct debuggy *bp; + int i; + linenr_T lnum = 0; +- regmatch_T regmatch; + char_u *name = fname; + int prev_got_int; + +--- 739,744 ---- +*************** +*** 771,778 **** + #endif + (bp->dbg_lnum > after && (lnum == 0 || bp->dbg_lnum < lnum))))) + { +- regmatch.regprog = bp->dbg_prog; +- regmatch.rm_ic = FALSE; + /* + * Save the value of got_int and reset it. We don't want a + * previous interruption cancel matching, only hitting CTRL-C +--- 770,775 ---- +*************** +*** 780,786 **** + */ + prev_got_int = got_int; + got_int = FALSE; +! if (vim_regexec(®match, name, (colnr_T)0)) + { + lnum = bp->dbg_lnum; + if (fp != NULL) +--- 777,783 ---- + */ + prev_got_int = got_int; + got_int = FALSE; +! if (vim_regexec_prog(&bp->dbg_prog, FALSE, name, (colnr_T)0)) + { + lnum = bp->dbg_lnum; + if (fp != NULL) +*** ../vim-7.4.518/src/fileio.c 2014-11-12 15:15:34.983882077 +0100 +--- src/fileio.c 2014-11-19 15:57:01.496837984 +0100 +*************** +*** 7772,7777 **** +--- 7772,7780 ---- + static int do_autocmd_event __ARGS((event_T event, char_u *pat, int nested, char_u *cmd, int forceit, int group)); + static int apply_autocmds_group __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, int group, buf_T *buf, exarg_T *eap)); + static void auto_next_pat __ARGS((AutoPatCmd *apc, int stop_at_last)); ++ #if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN) ++ static int match_file_pat __ARGS((char_u *pattern, regprog_T **prog, char_u *fname, char_u *sfname, char_u *tail, int allow_dirs)); ++ #endif + + + static event_T last_event; +*************** +*** 9640,9646 **** + { + /* execution-condition */ + if (ap->buflocal_nr == 0 +! ? (match_file_pat(NULL, ap->reg_prog, apc->fname, + apc->sfname, apc->tail, ap->allow_dirs)) + : ap->buflocal_nr == apc->arg_bufnr) + { +--- 9643,9649 ---- + { + /* execution-condition */ + if (ap->buflocal_nr == 0 +! ? (match_file_pat(NULL, &ap->reg_prog, apc->fname, + apc->sfname, apc->tail, ap->allow_dirs)) + : ap->buflocal_nr == apc->arg_bufnr) + { +*************** +*** 9774,9780 **** + for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next) + if (ap->pat != NULL && ap->cmds != NULL + && (ap->buflocal_nr == 0 +! ? match_file_pat(NULL, ap->reg_prog, + fname, sfname, tail, ap->allow_dirs) + : buf != NULL && ap->buflocal_nr == buf->b_fnum + )) +--- 9777,9783 ---- + for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next) + if (ap->pat != NULL && ap->cmds != NULL + && (ap->buflocal_nr == 0 +! ? match_file_pat(NULL, &ap->reg_prog, + fname, sfname, tail, ap->allow_dirs) + : buf != NULL && ap->buflocal_nr == buf->b_fnum + )) +*************** +*** 10035,10044 **** + * Used for autocommands and 'wildignore'. + * Returns TRUE if there is a match, FALSE otherwise. + */ +! int + match_file_pat(pattern, prog, fname, sfname, tail, allow_dirs) + char_u *pattern; /* pattern to match with */ +! regprog_T *prog; /* pre-compiled regprog or NULL */ + char_u *fname; /* full path of file name */ + char_u *sfname; /* short file name or NULL */ + char_u *tail; /* tail of path */ +--- 10038,10047 ---- + * Used for autocommands and 'wildignore'. + * Returns TRUE if there is a match, FALSE otherwise. + */ +! static int + match_file_pat(pattern, prog, fname, sfname, tail, allow_dirs) + char_u *pattern; /* pattern to match with */ +! regprog_T **prog; /* pre-compiled regprog or NULL */ + char_u *fname; /* full path of file name */ + char_u *sfname; /* short file name or NULL */ + char_u *tail; /* tail of path */ +*************** +*** 10093,10099 **** + #endif + { + if (prog != NULL) +! regmatch.regprog = prog; + else + regmatch.regprog = vim_regcomp(pattern, RE_MAGIC); + } +--- 10096,10102 ---- + #endif + { + if (prog != NULL) +! regmatch.regprog = *prog; + else + regmatch.regprog = vim_regcomp(pattern, RE_MAGIC); + } +*************** +*** 10119,10125 **** + || (!allow_dirs && vim_regexec(®match, tail, (colnr_T)0))))) + result = TRUE; + +! if (prog == NULL) + vim_regfree(regmatch.regprog); + return result; + } +--- 10122,10130 ---- + || (!allow_dirs && vim_regexec(®match, tail, (colnr_T)0))))) + result = TRUE; + +! if (prog != NULL) +! *prog = regmatch.regprog; +! else + vim_regfree(regmatch.regprog); + return result; + } +*** ../vim-7.4.518/src/proto/fileio.pro 2014-08-22 23:05:50.106606614 +0200 +--- src/proto/fileio.pro 2014-11-19 15:55:55.013602515 +0100 +*************** +*** 59,65 **** + char_u *get_event_name __ARGS((expand_T *xp, int idx)); + int autocmd_supported __ARGS((char_u *name)); + int au_exists __ARGS((char_u *arg)); +- int match_file_pat __ARGS((char_u *pattern, regprog_T *prog, char_u *fname, char_u *sfname, char_u *tail, int allow_dirs)); + int match_file_list __ARGS((char_u *list, char_u *sfname, char_u *ffname)); + char_u *file_pat_to_reg_pat __ARGS((char_u *pat, char_u *pat_end, char *allow_dirs, int no_bslash)); + long read_eintr __ARGS((int fd, void *buf, size_t bufsize)); +--- 59,64 ---- +*** ../vim-7.4.518/src/proto/regexp.pro 2014-04-02 19:00:53.043644100 +0200 +--- src/proto/regexp.pro 2014-11-19 16:11:34.522800480 +0100 +*************** +*** 13,18 **** +--- 13,19 ---- + list_T *reg_submatch_list __ARGS((int no)); + regprog_T *vim_regcomp __ARGS((char_u *expr_arg, int re_flags)); + void vim_regfree __ARGS((regprog_T *prog)); ++ int vim_regexec_prog __ARGS((regprog_T **prog, int ignore_case, char_u *line, colnr_T col)); + int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); + int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); + long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm)); +*** ../vim-7.4.518/src/os_unix.c 2014-10-11 14:47:22.829275547 +0200 +--- src/os_unix.c 2014-11-19 16:26:48.504346537 +0100 +*************** +*** 1610,1617 **** + static int + x_connect_to_server() + { +- regmatch_T regmatch; +- + #if defined(FEAT_CLIENTSERVER) + if (x_force_connect) + return TRUE; +--- 1610,1615 ---- +*************** +*** 1622,1630 **** + /* Check for a match with "exclude:" from 'clipboard'. */ + if (clip_exclude_prog != NULL) + { +! regmatch.rm_ic = FALSE; /* Don't ignore case */ +! regmatch.regprog = clip_exclude_prog; +! if (vim_regexec(®match, T_NAME, (colnr_T)0)) + return FALSE; + } + return TRUE; +--- 1620,1626 ---- + /* Check for a match with "exclude:" from 'clipboard'. */ + if (clip_exclude_prog != NULL) + { +! if (vim_regexec_prog(&clip_exclude_prog, FALSE, T_NAME, (colnr_T)0)) + return FALSE; + } + return TRUE; +*** ../vim-7.4.518/src/version.c 2014-11-19 13:40:04.903715962 +0100 +--- src/version.c 2014-11-19 15:22:36.464620036 +0100 +*************** +*** 743,744 **** +--- 743,746 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 519, + /**/ + +-- +BRIDGEKEEPER: What is your favorite editor? +GAWAIN: Emacs ... No, Viiiiiiiiiiimmmmmmm! + "Monty Python and the Holy editor wars" PYTHON (MONTY) SOFTWARE LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///