| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.613 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.613 |
| Problem: The NFA engine does not implement the 'redrawtime' time limit. |
| Solution: Implement the time limit. |
| Files: src/regexp_nfa.c |
| |
| |
| |
| |
| |
| *** 311,318 **** |
| static void nfa_save_listids __ARGS((nfa_regprog_T *prog, int *list)); |
| static void nfa_restore_listids __ARGS((nfa_regprog_T *prog, int *list)); |
| static int nfa_re_num_cmp __ARGS((long_u val, int op, long_u pos)); |
| ! static long nfa_regtry __ARGS((nfa_regprog_T *prog, colnr_T col)); |
| ! static long nfa_regexec_both __ARGS((char_u *line, colnr_T col)); |
| static regprog_T *nfa_regcomp __ARGS((char_u *expr, int re_flags)); |
| static void nfa_regfree __ARGS((regprog_T *prog)); |
| static int nfa_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col, int line_lbr)); |
| --- 311,318 ---- |
| static void nfa_save_listids __ARGS((nfa_regprog_T *prog, int *list)); |
| static void nfa_restore_listids __ARGS((nfa_regprog_T *prog, int *list)); |
| static int nfa_re_num_cmp __ARGS((long_u val, int op, long_u pos)); |
| ! static long nfa_regtry __ARGS((nfa_regprog_T *prog, colnr_T col, proftime_T *tm)); |
| ! static long nfa_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm)); |
| static regprog_T *nfa_regcomp __ARGS((char_u *expr, int re_flags)); |
| static void nfa_regfree __ARGS((regprog_T *prog)); |
| static int nfa_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col, int line_lbr)); |
| |
| *** 3850,3855 **** |
| --- 3850,3859 ---- |
| |
| /* Used during execution: whether a match has been found. */ |
| static int nfa_match; |
| + #ifdef FEAT_RELTIME |
| + static proftime_T *nfa_time_limit; |
| + static int nfa_time_count; |
| + #endif |
| |
| static void copy_pim __ARGS((nfa_pim_T *to, nfa_pim_T *from)); |
| static void clear_sub __ARGS((regsub_T *sub)); |
| |
| *** 5449,5454 **** |
| --- 5453,5462 ---- |
| fast_breakcheck(); |
| if (got_int) |
| return FALSE; |
| + #ifdef FEAT_RELTIME |
| + if (nfa_time_limit != NULL && profile_passed_limit(nfa_time_limit)) |
| + return FALSE; |
| + #endif |
| |
| nfa_match = FALSE; |
| |
| |
| *** 6789,6797 **** |
| break; |
| |
| /* Allow interrupting with CTRL-C. */ |
| ! fast_breakcheck(); |
| if (got_int) |
| break; |
| } |
| |
| #ifdef ENABLE_LOG |
| --- 6797,6814 ---- |
| break; |
| |
| /* Allow interrupting with CTRL-C. */ |
| ! line_breakcheck(); |
| if (got_int) |
| break; |
| + #ifdef FEAT_RELTIME |
| + /* Check for timeout once in a twenty times to avoid overhead. */ |
| + if (nfa_time_limit != NULL && ++nfa_time_count == 20) |
| + { |
| + nfa_time_count = 0; |
| + if (profile_passed_limit(nfa_time_limit)) |
| + break; |
| + } |
| + #endif |
| } |
| |
| #ifdef ENABLE_LOG |
| |
| *** 6818,6826 **** |
| * Returns <= 0 for failure, number of lines contained in the match otherwise. |
| */ |
| static long |
| ! nfa_regtry(prog, col) |
| nfa_regprog_T *prog; |
| colnr_T col; |
| { |
| int i; |
| regsubs_T subs, m; |
| --- 6835,6844 ---- |
| * Returns <= 0 for failure, number of lines contained in the match otherwise. |
| */ |
| static long |
| ! nfa_regtry(prog, col, tm) |
| nfa_regprog_T *prog; |
| colnr_T col; |
| + proftime_T *tm; /* timeout limit or NULL */ |
| { |
| int i; |
| regsubs_T subs, m; |
| |
| *** 6831,6836 **** |
| --- 6849,6858 ---- |
| #endif |
| |
| reginput = regline + col; |
| + #ifdef FEAT_RELTIME |
| + nfa_time_limit = tm; |
| + nfa_time_count = 0; |
| + #endif |
| |
| #ifdef ENABLE_LOG |
| f = fopen(NFA_REGEXP_RUN_LOG, "a"); |
| |
| *** 6951,6959 **** |
| * Returns <= 0 for failure, number of lines contained in the match otherwise. |
| */ |
| static long |
| ! nfa_regexec_both(line, startcol) |
| char_u *line; |
| colnr_T startcol; /* column to start looking for match */ |
| { |
| nfa_regprog_T *prog; |
| long retval = 0L; |
| --- 6973,6982 ---- |
| * Returns <= 0 for failure, number of lines contained in the match otherwise. |
| */ |
| static long |
| ! nfa_regexec_both(line, startcol, tm) |
| char_u *line; |
| colnr_T startcol; /* column to start looking for match */ |
| + proftime_T *tm; /* timeout limit or NULL */ |
| { |
| nfa_regprog_T *prog; |
| long retval = 0L; |
| |
| *** 7047,7053 **** |
| prog->state[i].lastlist[1] = 0; |
| } |
| |
| ! retval = nfa_regtry(prog, col); |
| |
| nfa_regengine.expr = NULL; |
| |
| --- 7070,7076 ---- |
| prog->state[i].lastlist[1] = 0; |
| } |
| |
| ! retval = nfa_regtry(prog, col, tm); |
| |
| nfa_regengine.expr = NULL; |
| |
| |
| *** 7209,7215 **** |
| ireg_icombine = FALSE; |
| #endif |
| ireg_maxcol = 0; |
| ! return nfa_regexec_both(line, col); |
| } |
| |
| |
| --- 7232,7238 ---- |
| ireg_icombine = FALSE; |
| #endif |
| ireg_maxcol = 0; |
| ! return nfa_regexec_both(line, col, NULL); |
| } |
| |
| |
| |
| *** 7245,7251 **** |
| buf_T *buf; /* buffer in which to search */ |
| linenr_T lnum; /* nr of line to start looking for match */ |
| colnr_T col; /* column to start looking for match */ |
| ! proftime_T *tm UNUSED; /* timeout limit or NULL */ |
| { |
| reg_match = NULL; |
| reg_mmatch = rmp; |
| --- 7268,7274 ---- |
| buf_T *buf; /* buffer in which to search */ |
| linenr_T lnum; /* nr of line to start looking for match */ |
| colnr_T col; /* column to start looking for match */ |
| ! proftime_T *tm; /* timeout limit or NULL */ |
| { |
| reg_match = NULL; |
| reg_mmatch = rmp; |
| |
| *** 7260,7266 **** |
| #endif |
| ireg_maxcol = rmp->rmm_maxcol; |
| |
| ! return nfa_regexec_both(NULL, col); |
| } |
| |
| #ifdef DEBUG |
| --- 7283,7289 ---- |
| #endif |
| ireg_maxcol = rmp->rmm_maxcol; |
| |
| ! return nfa_regexec_both(NULL, col, tm); |
| } |
| |
| #ifdef DEBUG |
| |
| |
| |
| *** 743,744 **** |
| --- 743,746 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 613, |
| /**/ |
| |
| -- |
| In Joseph Heller's novel "Catch-22", the main character tries to get out of a |
| war by proving he is crazy. But the mere fact he wants to get out of the war |
| only shows he isn't crazy -- creating the original "Catch-22". |
| |
| /// 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 /// |