To: vim_dev@googlegroups.com Subject: Patch 7.3.1147 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.1147 Problem: New regexp engine: regstart is only used to find the first match. Solution: Use regstart whenever adding the start state. Files: src/regexp_nfa.c *** ../vim-7.3.1146/src/regexp_nfa.c 2013-06-08 13:33:32.000000000 +0200 --- src/regexp_nfa.c 2013-06-08 14:37:36.000000000 +0200 *************** *** 4153,4158 **** --- 4153,4159 ---- } static int failure_chance __ARGS((nfa_state_T *state, int depth)); + static int skip_to_start __ARGS((int c, colnr_T *colp)); /* * Estimate the chance of a match with "state" failing. *************** *** 4305,4310 **** --- 4306,4336 ---- } /* + * Skip until the char "c" we know a match must start with. + */ + static int + skip_to_start(c, colp) + int c; + colnr_T *colp; + { + char_u *s; + + /* Used often, do some work to avoid call overhead. */ + if (!ireg_ic + #ifdef FEAT_MBYTE + && !has_mbyte + #endif + ) + s = vim_strbyte(regline + *colp, c); + else + s = cstrchr(regline + *colp, c); + if (s == NULL) + return FAIL; + *colp = (int)(s - regline); + return OK; + } + + /* * Main matching routine. * * Run NFA to determine whether it matches reginput. *************** *** 5449,5460 **** * the first MOPEN. */ if (toplevel) { ! if (REG_MULTI) ! m->norm.list.multi[0].start.col = (colnr_T)(reginput - regline) + clen; ! else ! m->norm.list.line[0].start = reginput + clen; ! addstate(nextlist, start->out, m, clen); } else addstate(nextlist, start, m, clen); --- 5475,5524 ---- * the first MOPEN. */ if (toplevel) { ! int add = TRUE; ! int c; ! ! if (prog->regstart != NUL && clen != 0) ! { ! if (nextlist->n == 0) ! { ! colnr_T col = (colnr_T)(reginput - regline) + clen; ! ! /* Nextlist is empty, we can skip ahead to the ! * character that must appear at the start. */ ! if (skip_to_start(prog->regstart, &col) == FAIL) ! break; ! #ifdef ENABLE_LOG ! fprintf(log_fd, " Skipping ahead %d bytes to regstart\n", ! col - ((colnr_T)(reginput - regline) + clen)); ! #endif ! reginput = regline + col - clen; ! } ! else ! { ! /* Checking if the required start character matches is ! * cheaper than adding a state that won't match. */ ! c = PTR2CHAR(reginput + clen); ! if (c != prog->regstart && (!ireg_ic || MB_TOLOWER(c) ! != MB_TOLOWER(prog->regstart))) ! { ! #ifdef ENABLE_LOG ! fprintf(log_fd, " Skipping start state, regstart does not match\n"); ! #endif ! add = FALSE; ! } ! } ! } ! ! if (add) ! { ! if (REG_MULTI) ! m->norm.list.multi[0].start.col = (colnr_T)(reginput - regline) + clen; ! else ! m->norm.list.line[0].start = reginput + clen; ! addstate(nextlist, start->out, m, clen); ! } } else addstate(nextlist, start, m, clen); *************** *** 5701,5723 **** return 0L; if (prog->regstart != NUL) ! { ! char_u *s; ! ! /* Skip until the char we know it must start with. ! * Used often, do some work to avoid call overhead. */ ! if (!ireg_ic ! #ifdef FEAT_MBYTE ! && !has_mbyte ! #endif ! ) ! s = vim_strbyte(regline + col, prog->regstart); ! else ! s = cstrchr(regline + col, prog->regstart); ! if (s == NULL) return 0L; - col = (int)(s - regline); - } /* If the start column is past the maximum column: no need to try. */ if (ireg_maxcol > 0 && col >= ireg_maxcol) --- 5765,5774 ---- return 0L; if (prog->regstart != NUL) ! /* Skip ahead until a character we know the match must start with. ! * When there is none there is no match. */ ! if (skip_to_start(prog->regstart, &col) == FAIL) return 0L; /* If the start column is past the maximum column: no need to try. */ if (ireg_maxcol > 0 && col >= ireg_maxcol) *** ../vim-7.3.1146/src/version.c 2013-06-08 13:33:32.000000000 +0200 --- src/version.c 2013-06-08 14:35:54.000000000 +0200 *************** *** 730,731 **** --- 730,733 ---- { /* Add new patch number below this line */ + /**/ + 1147, /**/ -- Nobody will ever need more than 640 kB RAM. -- Bill Gates, 1983 Windows 98 requires 16 MB RAM. -- Bill Gates, 1999 Logical conclusion: Nobody will ever need Windows 98. /// 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 ///