This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GNU M4 source repository".
http://git.sv.gnu.org/gitweb/?p=m4.git;a=commitdiff;h=aa46ced67010190918295b965f5e2879dcd9a30c The branch, branch-1_4 has been updated via aa46ced67010190918295b965f5e2879dcd9a30c (commit) from e3b90fb678b610e3d2ee86d1f00e6f20b1eeef29 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit aa46ced67010190918295b965f5e2879dcd9a30c Author: Eric Blake <[EMAIL PROTECTED]> Date: Sat Sep 29 17:48:29 2007 -0600 Optimize for Autoconf usage pattern. * src/builtin.c (m4_regexp, m4_patsubst): Handle empty regex faster. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> ----------------------------------------------------------------------- Summary of changes: ChangeLog | 6 ++++++ src/builtin.c | 36 +++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0cea5b5..f29b557 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-09-29 Eric Blake <[EMAIL PROTECTED]> + + Optimize for Autoconf usage pattern. + * src/builtin.c (m4_regexp, m4_patsubst): Handle empty regex + faster. + 2007-09-24 Eric Blake <[EMAIL PROTECTED]> Create .gitignore alongside .cvsignore. diff --git a/src/builtin.c b/src/builtin.c index dee2276..65f4585 100644 --- a/src/builtin.c +++ b/src/builtin.c @@ -1968,8 +1968,19 @@ m4_regexp (struct obstack *obs, int argc, token_data **argv) return; } - victim = TOKEN_DATA_TEXT (argv[1]); - regexp = TOKEN_DATA_TEXT (argv[2]); + victim = ARG (1); + regexp = ARG (2); + repl = ARG (3); + + if (!*regexp) + { + /* The empty regex matches everything! */ + if (argc == 3) + shipout_int (obs, 0); + else + obstack_grow (obs, repl, strlen (repl)); + return; + } init_pattern_buffer (&buf, ®s); msg = re_compile_pattern (regexp, strlen (regexp), &buf); @@ -1993,10 +2004,7 @@ m4_regexp (struct obstack *obs, int argc, token_data **argv) else if (argc == 3) shipout_int (obs, startpos); else if (startpos >= 0) - { - repl = TOKEN_DATA_TEXT (argv[3]); - substitute (obs, victim, repl, ®s); - } + substitute (obs, victim, repl, ®s); free_pattern_buffer (&buf, ®s); } @@ -2013,6 +2021,7 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv) { const char *victim; /* first argument */ const char *regexp; /* regular expression */ + const char *repl; struct re_pattern_buffer buf; /* compiled regular expression */ struct re_registers regs; /* for subexpression matches */ @@ -2029,7 +2038,17 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv) return; } - regexp = TOKEN_DATA_TEXT (argv[2]); + victim = ARG (1); + regexp = ARG (2); + repl = ARG (3); + + /* The empty regex matches everywhere, but if there is no + replacement, we need not waste time with it. */ + if (!*regexp && !*repl) + { + obstack_grow (obs, victim, strlen (victim)); + return; + } init_pattern_buffer (&buf, ®s); msg = re_compile_pattern (regexp, strlen (regexp), &buf); @@ -2042,7 +2061,6 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv) return; } - victim = TOKEN_DATA_TEXT (argv[1]); length = strlen (victim); offset = 0; @@ -2073,7 +2091,7 @@ m4_patsubst (struct obstack *obs, int argc, token_data **argv) /* Handle the part of the string that was covered by the match. */ - substitute (obs, victim, ARG (3), ®s); + substitute (obs, victim, repl, ®s); /* Update the offset to the end of the match. If the regexp matched a null string, advance offset one more, to avoid hooks/post-receive -- GNU M4 source repository
