From: Junio C Hamano <gitster@pobox.com>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] split_ident: parse timestamp from end of line
Date: Tue, 15 Oct 2013 10:52:55 -0700 [thread overview]
Message-ID: <xmqqob6qe808.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <20131014232949.GA10415@sigill.intra.peff.net> (Jeff King's message of "Mon, 14 Oct 2013 19:29:49 -0400")
Jeff King <peff@peff.net> writes:
>> Yeah, unrolling the loop is probably better. You may even be able
>> to do so in a single pass with an extra "last > seen" pointer
>> variable without too much additional code complexity, I would think.
>
> I'm not sure what you mean here.
> If you mean doing a single pass to find the final ">", that is easy,
> because we know the length of the line already and can jump past and
> start from the back.
I meant a single forward pass, like this.
ident.c | 29 +++++++++++------------------
1 file changed, 11 insertions(+), 18 deletions(-)
diff --git a/ident.c b/ident.c
index 7d1c79c..ff29779 100644
--- a/ident.c
+++ b/ident.c
@@ -200,7 +200,7 @@ static void strbuf_addstr_without_crud(struct strbuf *sb, const char *src)
*/
int split_ident_line(struct ident_split *split, const char *line, int len)
{
- const char *cp;
+ const char *cp, *last_ket;
size_t span;
int status = -1;
@@ -225,29 +225,22 @@ int split_ident_line(struct ident_split *split, const char *line, int len)
split->name_end = split->name_begin;
}
- for (cp = split->mail_begin; cp < line + len; cp++)
- if (*cp == '>') {
+ for (cp = split->mail_begin, last_ket = NULL; cp < line + len; cp++) {
+ if (*cp != '>')
+ continue;
+ if (!last_ket)
split->mail_end = cp;
- break;
- }
+ last_ket = cp;
+ }
if (!split->mail_end)
return status;
/*
- * Look from the end-of-line to find the trailing ">" of the mail
- * address, even though we should already know it as split->mail_end.
- * This can help in cases of broken idents with an extra ">" somewhere
- * in the email address. Note that we are assuming the timestamp will
- * never have a ">" in it.
- *
- * Note that we will always find some ">" before going off the front of
- * the string, because will always hit the split->mail_end closing
- * bracket.
+ * Typically, last_ket is the same as split_mail_end, but with
+ * a broken identity line, there may be multiple closing ket '>';
+ * read the timestamp after the last one.
*/
- for (cp = line + len - 1; *cp != '>'; cp--)
- ;
-
- for (cp = cp + 1; cp < line + len && isspace(*cp); cp++)
+ for (cp = last_ket + 1; cp < line + len && isspace(*cp); cp++)
;
if (line + len <= cp)
goto person_only;
next prev parent reply other threads:[~2013-10-15 17:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-14 20:27 [PATCH] split_ident: parse timestamp from end of line Jeff King
2013-10-14 22:25 ` Junio C Hamano
2013-10-14 22:31 ` Jeff King
2013-10-14 22:45 ` Jeff King
2013-10-14 22:45 ` Junio C Hamano
2013-10-14 23:29 ` Jeff King
2013-10-15 17:52 ` Junio C Hamano [this message]
2013-10-15 18:03 ` Jeff King
2013-10-15 18:48 ` Junio C Hamano
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=xmqqob6qe808.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.