# HG changeset patch # User Richard M. Stallman # Date 841534819 0 # Node ID 2a4da819f1522a59ad9a8cd1c0f992bb4ebb5503 # Parent 419214ae89df00be8d3e60609e7fa0e54a899ab9 (re_search_2): Optimize regexp that starts with ^. diff -r 419214ae89df -r 2a4da819f152 src/regex.c --- a/src/regex.c Sat Aug 31 22:29:12 1996 +0000 +++ b/src/regex.c Sat Aug 31 23:40:19 1996 +0000 @@ -3284,6 +3284,7 @@ register RE_TRANSLATE_TYPE translate = bufp->translate; int total_size = size1 + size2; int endpos = startpos + range; + int anchored_start = 0; /* Check for out-of-range STARTPOS. */ if (startpos < 0 || startpos > total_size) @@ -3323,9 +3324,26 @@ if (re_compile_fastmap (bufp) == -2) return -2; + /* See whether the pattern is anchored. */ + if (bufp->buffer[0] == begline) + anchored_start = 1; + /* Loop through the string, looking for a place to start matching. */ for (;;) { + /* If the pattern is anchored, + skip quickly past places we cannot match. + We don't bother to treat startpos == 0 specially + because that case doesn't repeat. */ + if (anchored_start && startpos > 0) + { + if (! (bufp->newline_anchor + && ((startpos <= size1 ? string1[startpos - 1] + : string2[startpos - size1 - 1]) + == '\n'))) + goto advance; + } + /* If a fastmap is supplied, skip quickly over characters that cannot be the start of a match. If the pattern can match the null string, however, we don't need to skip characters; we want @@ -3461,7 +3479,7 @@ /* Free everything we malloc. */ #ifdef MATCH_MAY_ALLOCATE -#define FREE_VAR(var) if (var) then { REGEX_FREE (var); var = NULL; } else +#define FREE_VAR(var) if (var) { REGEX_FREE (var); var = NULL; } else #define FREE_VARIABLES() \ do { \ REGEX_FREE_STACK (fail_stack.stack); \