From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>
Cc: Junio C Hamano <junkio@cox.net>, Git Mailing List <git@vger.kernel.org>
Subject: Re: [PATCH 5/5] pretty describe: add %ds, %dn, %dd placeholders
Date: Sun, 4 Nov 2007 14:11:24 +0000 (GMT) [thread overview]
Message-ID: <Pine.LNX.4.64.0711041356330.4362@racer.site> (raw)
In-Reply-To: <472DB1B0.1050904@lsrfire.ath.cx>
Hi,
On Sun, 4 Nov 2007, Ren? Scharfe wrote:
> The new placeholders %ds (description string, git-describe style), %dn
> (the name part) and %dd (the depth part) are added.
>
> To avoid imposing the significant cost of running describe_commit() on
> every format string, even if none of the new placeholders are used, a
> new function, interp_count(), is introduced. It is a stripped down
> version of interpolate(), that simply counts the placeholders in a
> format string. If the describe placeholders are not found, setting up
> the corresponding replacements is skipped.
The way I read this, those are two really quite independent patches
squashed into one.
> + unsigned long occurs[ARRAY_SIZE(table)];
You do not ever use the counts. So, longs are overkill. Even ints might
be overkill, but probably the most convenient. I would have gone with
chars. If I knew how to memset() an array of unsigned:1 entries to all
zero, I would even have gone with that, but the runtime cost of this is
probably higher than the chars.
But the even more fundamental problem is that you count the needed
interpolations _every_ single time you output a commit message.
A much better place would be get_commit_format(). Yes that means
restructuring the code a bit more, but I would say that this definitely
would help. My preference would even be introducing a new source file for
the user format handling (commit-format.[ch]).
> +
> +/*
> + * interp_count - count occurences of placeholders
> + */
> +void interp_count(unsigned long *result, const char *orig,
> + const struct interp *interps, int ninterps)
> +{
> + const char *src = orig;
You do not ever use orig again. So why not just use that variable instead
of introducing a new one?
> + const char *name;
> + unsigned long namelen;
> + int i;
> + char c;
> +
> + for (i = 0; i < ninterps; i++)
> + result[i] = 0;
memset()?
> +
> + while ((c = *src)) {
> + if (c == '%') {
> + /* Try to match an interpolation string. */
> + for (i = 0; i < ninterps; i++) {
> + name = interps[i].name;
> + namelen = strlen(name);
> + if (strncmp(src, name, namelen) == 0)
prefixcmp()?
> + break;
> + }
> +
> + /* Check for valid interpolation. */
> + if (i < ninterps) {
This is ugly. You already had a successful if() for that case earlier.
> + result[i]++;
> + src += namelen;
> + continue;
> + }
> + }
> + src++;
> + }
> +}
I'd rewrite this whole loop as
while ((c = *(orig++)))
if (c == '%')
/* Try to match an interpolation string. */
for (i = 0; i < ninterps; i++)
if (prefixcmp(orig, interps[i].name)) {
result[i] = 1;
orig += strlen(interps[i].name);
break;
}
Ciao,
Dscho
next prev parent reply other threads:[~2007-11-04 14:12 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-04 11:49 [PATCH 5/5] pretty describe: add %ds, %dn, %dd placeholders René Scharfe
2007-11-04 14:08 ` [PATCH 7/5] pretty describe: add min_prio parameter to describe_commit() René Scharfe
2007-11-04 14:11 ` Johannes Schindelin [this message]
2007-11-04 14:42 ` [PATCH 5/5] pretty describe: add %ds, %dn, %dd placeholders René Scharfe
2007-11-04 15:25 ` Johannes Schindelin
2007-11-04 17:27 ` René Scharfe
2007-11-05 1:20 ` René Scharfe
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=Pine.LNX.4.64.0711041356330.4362@racer.site \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
--cc=rene.scharfe@lsrfire.ath.cx \
/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;
as well as URLs for NNTP newsgroup(s).