From: Junio C Hamano <junkio@cox.net>
To: Christian Couder <chriscool@tuxfamily.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] Refactoring tracing code in "git.c" and "exec_cmd.c".
Date: Sat, 26 Aug 2006 22:42:50 -0700 [thread overview]
Message-ID: <7vmz9qybs5.fsf@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: <20060824074547.a8fa0005.chriscool@tuxfamily.org> (Christian Couder's message of "Thu, 24 Aug 2006 07:45:47 +0200")
Christian Couder <chriscool@tuxfamily.org> writes:
> Some new helper functions in "quote.c" are used for this.
> The goal is also to get near the point where we can use
> one write(2) call to trace in any open file descriptor.
> This is why we put the trace string into one buffer.
>
> Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
I really liked the fact (not necessarily the way, though) this
shortens the callers.
> diff --git a/quote.c b/quote.c
> index e220dcc..84d0b7b 100644
> --- a/quote.c
> +++ b/quote.c
> @@ -74,6 +74,84 @@ char *sq_quote(const char *src)
> return buf;
> }
>
> +char *sq_quote_argv(const char** argv, int count)
> +{
> + char *buf, *to;
> + int i;
> + size_t len;
> +
> + /* Count argv if needed. */
> + if (count < 0) {
> + char **p = (char **)argv;
> + count = 0;
> + while (*p++) count++;
> + }
Wouldn't this be easier to read?
if (count < 0)
for (count = 0; argv[count]; count++)
; /* just counting */
> + /* Get destination buffer length. */
> + len = count ? count : 1;
This confused me quite a bit. Wouldn't it be simpler to special
case the count==0 case and return xcalloc(1,1) here (this would
allow you to lose "if (!count)" later as well)?
> + /* Copy into destination buffer. */
> + for (i = 0; i < count; ++i) {
> + if (i) *to++ = ' ';
(style)
if (i)
*to++ = ' ';
> + to += sq_quote_buf(to, len, argv[i]);
> + }
> +
> + if (!count)
> + *buf = 0;
> +
> + return buf;
> +}
> +/* Return a newly allocated copy of "format" where the
> + * first occurence of "old" has been replaced by "new". */
> +static char *str_subst(const char *format, const char *old, const char *new)
> +{
I do not think there is anything wrong with this function
per-se, but...
> +void sq_quote_argv_printf(FILE* out, const char **argv, int count,
> + const char *format, ...)
> +{
> + /* Replace the string "ARGV" in format with the quoted arg values. */
> + char *argv_str = sq_quote_argv(argv, count);
> + char *new_format = str_subst(format, "ARGV", argv_str);
> +
> + /* Print into "out" using the new format. */
> + va_list rest;
> + va_start(rest, format);
> + vfprintf(out, new_format, rest);
> + va_end(rest);
this feels wrong. What happens when the original argv had
a per-cent in it?
next prev parent reply other threads:[~2006-08-27 5:42 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-24 5:45 [PATCH] Refactoring tracing code in "git.c" and "exec_cmd.c" Christian Couder
2006-08-27 5:42 ` Junio C Hamano [this message]
2006-08-27 19:38 ` Christian Couder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vmz9qybs5.fsf@assigned-by-dhcp.cox.net \
--to=junkio@cox.net \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox