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=9429358695faabee31d0413cee0d2376c7c73048 The branch, branch-1.6 has been updated via 9429358695faabee31d0413cee0d2376c7c73048 (commit) via 08745f701225284d682c9a68b27cec282e0cd04b (commit) via 0cec2254cb5d48cad751bb588cd93c40c006dc27 (commit) via 5fd045d1e9904f4397b9add24512c72a9d9d6447 (commit) from 16e712b9dbcfcc49a54dd7c010ca1cab075fd79a (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 9429358695faabee31d0413cee0d2376c7c73048 Author: Eric Blake <[email protected]> Date: Wed Feb 18 13:36:15 2009 -0700 Prefer buffer over byte operations. * src/format.c (expand_format): Use memchr for speed. * src/builtin.c (substitute): Likewise. (expand_user_macro): Rearrange for readability. * src/input.c (consume_buffer): Allow C++ compilation. Signed-off-by: Eric Blake <[email protected]> (cherry picked from commit 45a154e6d70517bf1b837715aae2fe366c9c1116) commit 08745f701225284d682c9a68b27cec282e0cd04b Author: Eric Blake <[email protected]> Date: Wed Feb 18 11:38:54 2009 -0700 Speed up esyscmd with buffer reads. * src/builtin.c (m4_esyscmd): Read blocks directly into obstack, rather than repeatedly reading bytes. Detect read errors. Signed-off-by: Eric Blake <[email protected]> (cherry picked from commit 1974da270a84d8c0cf2b3e3e08ce5292fdb211f3) commit 0cec2254cb5d48cad751bb588cd93c40c006dc27 Author: Eric Blake <[email protected]> Date: Wed Feb 18 12:03:03 2009 -0700 Avoid risk of stack overflow. * src/output.c (insert_file): Avoid stack allocation of large buffer. (freeze_diversions): Avoid spurious semicolon. Signed-off-by: Eric Blake <[email protected]> (cherry picked from commit 01f216c3c98d41db7878b18c93d23e8dc38d8643) commit 5fd045d1e9904f4397b9add24512c72a9d9d6447 Author: Eric Blake <[email protected]> Date: Wed Feb 18 13:36:50 2009 -0700 Update copyright years. * src/format.c: Add 2009 to copyright. * src/m4.h: Likewise. * THANKS: Likewise. Add name from branch. Signed-off-by: Eric Blake <[email protected]> ----------------------------------------------------------------------- Summary of changes: ChangeLog | 22 +++++++++++++++++++++ THANKS | 4 ++- src/builtin.c | 58 ++++++++++++++++++++++++++++++++++++++++---------------- src/format.c | 17 +++++++++------ src/input.c | 2 +- src/m4.h | 4 +- src/output.c | 12 ++++------ 7 files changed, 84 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 85f2c5b..376ef68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2009-02-18 Eric Blake <[email protected]> + + Prefer buffer over byte operations. + * src/format.c (expand_format): Use memchr for speed. + * src/builtin.c (substitute): Likewise. + (expand_user_macro): Rearrange for readability. + * src/input.c (consume_buffer): Allow C++ compilation. + + Speed up esyscmd with buffer reads. + * src/builtin.c (m4_esyscmd): Read blocks directly into obstack, + rather than repeatedly reading bytes. Detect read errors. + + Avoid risk of stack overflow. + * src/output.c (insert_file): Avoid stack allocation of large + buffer. + (freeze_diversions): Avoid spurious semicolon. + + Update copyright years. + * src/format.c: Add 2009 to copyright. + * src/m4.h: Likewise. + * THANKS: Likewise. Add name from branch. + 2009-02-17 Eric Blake <[email protected]> Reorder token recognition to match other implementations. diff --git a/THANKS b/THANKS index c52f07b..2b42fca 100644 --- a/THANKS +++ b/THANKS @@ -111,6 +111,7 @@ Steve Williamson [email protected] Steven Augart [email protected] Thomas Klausner [email protected] Thorsten Ohl [email protected] +Tom G. Christensen [email protected] Tom McConnell [email protected] Tom Quinn [email protected] Tom Tromey [email protected] @@ -126,7 +127,8 @@ Local Variables: coding: utf-8 End: -Copyright (C) 2000, 2006, 2007 Free Software Foundation, Inc. +Copyright (C) 2000, 2006, 2007, 2008, 2009 Free Software Foundation, +Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or diff --git a/src/builtin.c b/src/builtin.c index 22d156d..0a62f99 100644 --- a/src/builtin.c +++ b/src/builtin.c @@ -1177,7 +1177,6 @@ m4_esyscmd (struct obstack *obs, int argc, macro_arguments *argv) const char *cmd = ARG (1); size_t len = ARG_LEN (1); FILE *pin; - int ch; if (strlen (cmd) != len) m4_warn (0, me, _("argument %s truncated"), @@ -1200,8 +1199,27 @@ m4_esyscmd (struct obstack *obs, int argc, macro_arguments *argv) } else { - while ((ch = getc (pin)) != EOF) - obstack_1grow (obs, (char) ch); + while (1) + { + size_t avail = obstack_room (obs); + if (!avail) + { + int ch = getc (pin); + if (ch == EOF) + break; + obstack_1grow (obs, ch); + } + else + { + size_t len = fread (obstack_next_free (obs), 1, avail, pin); + if (len <= 0) + break; + obstack_blank_fast (obs, len); + } + } + if (ferror (pin)) + m4_warn (errno, me, _("cannot read pipe to command %s"), + quotearg_style (locale_quoting_style, cmd)); sysval = pclose (pin); } } @@ -2172,23 +2190,24 @@ substitute (struct obstack *obs, const call_info *me, const char *victim, const char *repl, size_t repl_len, struct re_registers *regs) { int ch; - - while (repl_len--) + while (1) { - ch = *repl++; - if (ch != '\\') + const char *backslash = (char *) memchr (repl, '\\', repl_len); + if (!backslash) { - obstack_1grow (obs, ch); - continue; + obstack_grow (obs, repl, repl_len); + return; } + obstack_grow (obs, repl, backslash - repl); + repl_len -= backslash - repl + 1; if (!repl_len) { m4_warn (0, me, _("trailing \\ ignored in replacement")); return; } - - ch = *repl++; + repl = backslash + 1; repl_len--; + ch = *repl++; switch (ch) { case '0': @@ -2470,15 +2489,22 @@ expand_user_macro (struct obstack *obs, symbol *sym, const char *text = SYMBOL_TEXT (sym); size_t len = SYMBOL_TEXT_LEN (sym); int i; - const char *dollar = memchr (text, '$', len); - - while (dollar) + while (1) { + const char *dollar = (char *) memchr (text, '$', len); + if (!dollar) + { + obstack_grow (obs, text, len); + return; + } obstack_grow (obs, text, dollar - text); len -= dollar - text; text = dollar; if (len == 1) - break; + { + obstack_1grow (obs, '$'); + return; + } len--; switch (*++text) { @@ -2514,7 +2540,5 @@ expand_user_macro (struct obstack *obs, symbol *sym, obstack_1grow (obs, '$'); break; } - dollar = memchr (text, '$', len); } - obstack_grow (obs, text, len); } diff --git a/src/format.c b/src/format.c index 09cffa3..dde3a19 100644 --- a/src/format.c +++ b/src/format.c @@ -1,7 +1,7 @@ /* GNU m4 -- A simple macro processor - Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2006, 2007, 2008 - Free Software Foundation, Inc. + Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2006, 2007, 2008, + 2009 Free Software Foundation, Inc. This file is part of GNU M4. @@ -181,14 +181,17 @@ expand_format (struct obstack *obs, int argc, macro_arguments *argv) f_len = ARG_LEN (1); assert (!f[f_len]); /* Requiring a terminating NUL makes parsing simpler. */ memset (ok, 0, sizeof ok); - while (f_len--) + while (1) { - c = *fmt++; - if (c != '%') + const char *percent = (char *) memchr (fmt, '%', f_len); + if (!percent) { - obstack_1grow (obs, c); - continue; + obstack_grow (obs, fmt, f_len); + break; } + obstack_grow (obs, fmt, percent - fmt); + f_len -= percent - fmt + 1; + fmt = percent + 1; if (*fmt == '%') { diff --git a/src/input.c b/src/input.c index 709ef3e..129a5f2 100644 --- a/src/input.c +++ b/src/input.c @@ -930,7 +930,7 @@ consume_buffer (size_t len) buf = freadptr (isp->u.u_f.fp, &buf_len); assert (buf && len <= buf_len); buf_len = 0; - while ((p = memchr (buf + buf_len, '\n', len - buf_len))) + while ((p = (char *) memchr (buf + buf_len, '\n', len - buf_len))) { if (p == buf + len - 1) start_of_input_line = true; diff --git a/src/m4.h b/src/m4.h index b5521ca..5407d10 100644 --- a/src/m4.h +++ b/src/m4.h @@ -1,7 +1,7 @@ /* GNU m4 -- A simple macro processor - Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2004, 2005, 2006, 2007, - 2008 Free Software Foundation, Inc. + Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2004, 2005, 2006, + 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU M4. diff --git a/src/output.c b/src/output.c index 1add1a9..99a9f0a 100644 --- a/src/output.c +++ b/src/output.c @@ -1,7 +1,7 @@ /* GNU m4 -- A simple macro processor Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2004, 2005, 2006, - 2007, 2008 Free Software Foundation, Inc. + 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU M4. @@ -835,19 +835,17 @@ make_diversion (int divnum) void insert_file (FILE *file) { - char buffer[COPY_BUFFER_SIZE]; + static char buffer[COPY_BUFFER_SIZE]; size_t length; /* Optimize out inserting into a sink. */ - if (!output_diversion) return; /* Insert output by big chunks. */ - - for (;;) + while (1) { - length = fread (buffer, 1, COPY_BUFFER_SIZE, file); + length = fread (buffer, 1, sizeof buffer, file); if (ferror (file)) m4_error (EXIT_FAILURE, errno, NULL, _("error reading inserted file")); if (length == 0) @@ -1005,7 +1003,7 @@ freeze_diversions (FILE *file) iter = gl_oset_iterator (diversion_table); while (gl_oset_iterator_next (&iter, &elt)) { - m4_diversion *diversion = (m4_diversion *) elt;; + m4_diversion *diversion = (m4_diversion *) elt; if (diversion->size || diversion->used) { if (diversion->size) hooks/post-receive -- GNU M4 source repository
