From: Jeff King <peff@peff.net>
To: "Michał Górny" <mgorny@gentoo.org>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Michael J Gruber <git@drmicha.warpmail.net>
Subject: [PATCH 3/5] for-each-ref: refactor subject and body placeholder parsing
Date: Wed, 7 Sep 2011 13:44:07 -0400 [thread overview]
Message-ID: <20110907174407.GC11355@sigill.intra.peff.net> (raw)
In-Reply-To: <20110902175323.GA29761@sigill.intra.peff.net>
The find_subpos function was a little hard to use, as well
as to read. It would sometimes write into the subject and
body pointers, and sometimes not. The body pointer sometimes
could be compared to subject, and sometimes not. When
actually duplicating the subject, the caller was forced to
figure out again how long the subject is (which is not too
big a deal when the subject is a single line, but hard to
extend).
The refactoring makes the function more straightforward, both
to read and to use. We will always put something into the
subject and body pointers, and we return explicit lengths
for them, too.
This lays the groundwork both for more complex subject
parsing (e.g., multiline), as well as splitting the body
into subparts (like the text versus the signature).
Signed-off-by: Jeff King <peff@peff.net>
---
Sorry, the patch is a little bit hard to read. It's probably simpler to
just apply and read the resulting function.
builtin/for-each-ref.c | 54 +++++++++++++++++++++++++----------------------
1 files changed, 29 insertions(+), 25 deletions(-)
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 89e75c6..bcea027 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -458,38 +458,42 @@ static void grab_person(const char *who, struct atom_value *val, int deref, stru
}
}
-static void find_subpos(const char *buf, unsigned long sz, const char **sub, const char **body)
+static void find_subpos(const char *buf, unsigned long sz,
+ const char **sub, unsigned long *sublen,
+ const char **body, unsigned long *bodylen)
{
- while (*buf) {
- const char *eol = strchr(buf, '\n');
- if (!eol)
- return;
- if (eol[1] == '\n') {
- buf = eol + 1;
- break; /* found end of header */
- }
- buf = eol + 1;
+ const char *eol;
+ /* skip past header until we hit empty line */
+ while (*buf && *buf != '\n') {
+ eol = strchrnul(buf, '\n');
+ if (*eol)
+ eol++;
+ buf = eol;
}
+ /* skip any empty lines */
while (*buf == '\n')
buf++;
- if (!*buf)
- return;
- *sub = buf; /* first non-empty line */
- buf = strchr(buf, '\n');
- if (!buf) {
- *body = "";
- return; /* no body */
- }
+
+ /* subject is first non-empty line */
+ *sub = buf;
+ /* subject goes to end of line */
+ eol = strchrnul(buf, '\n');
+ *sublen = eol - buf;
+ buf = eol;
+
+ /* skip any empty lines */
while (*buf == '\n')
- buf++; /* skip blank between subject and body */
+ buf++;
*body = buf;
+ *bodylen = strlen(buf);
}
/* See grab_values */
static void grab_sub_body_contents(struct atom_value *val, int deref, struct object *obj, void *buf, unsigned long sz)
{
int i;
- const char *subpos = NULL, *bodypos = NULL;
+ const char *subpos = NULL, *bodypos;
+ unsigned long sublen, bodylen;
for (i = 0; i < used_atom_cnt; i++) {
const char *name = used_atom[i];
@@ -503,14 +507,14 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct obj
strcmp(name, "contents"))
continue;
if (!subpos)
- find_subpos(buf, sz, &subpos, &bodypos);
- if (!subpos)
- return;
+ find_subpos(buf, sz,
+ &subpos, &sublen,
+ &bodypos, &bodylen);
if (!strcmp(name, "subject"))
- v->s = copy_line(subpos);
+ v->s = xmemdupz(subpos, sublen);
else if (!strcmp(name, "body"))
- v->s = xstrdup(bodypos);
+ v->s = xmemdupz(bodypos, bodylen);
else if (!strcmp(name, "contents"))
v->s = xstrdup(subpos);
}
--
1.7.6.10.g62f04
next prev parent reply other threads:[~2011-09-07 17:44 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-29 19:10 More formatting with 'git tag -l' Michał Górny
2011-08-29 19:36 ` Jeff King
2011-08-29 21:20 ` Michał Górny
2011-08-29 21:37 ` Jeff King
2011-08-29 21:50 ` Michał Górny
2011-08-30 8:57 ` [PATCH] git-for-each-ref: move GPG sigs off %(body) to %(signature) Michał Górny
2011-08-30 9:43 ` Michael J Gruber
2011-08-30 15:58 ` Michał Górny
2011-08-30 16:27 ` Jeff King
2011-08-31 9:11 ` [PATCH] for-each-ref: add split message parts to %(contents:*) Michał Górny
2011-08-31 16:42 ` Jeff King
2011-08-31 16:44 ` [PATCH 1/2] t7004: factor out gpg setup Jeff King
2011-08-31 16:44 ` [PATCH 2/2] t6300: test new content:* for-each-ref placeholders Jeff King
2011-08-31 22:54 ` [PATCH] for-each-ref: add split message parts to %(contents:*) Junio C Hamano
2011-08-31 23:22 ` Jeff King
2011-09-01 7:34 ` Michał Górny
2011-09-01 16:00 ` Junio C Hamano
2011-09-01 16:22 ` Jeff King
2011-09-01 16:48 ` Michał Górny
2011-09-01 16:50 ` Michał Górny
2011-09-02 16:39 ` Jeff King
2011-09-02 17:39 ` Michał Górny
2011-09-02 17:53 ` Jeff King
2011-09-07 17:40 ` Jeff King
2011-09-15 8:18 ` Michał Górny
2011-09-07 17:42 ` [PATCH 1/5] t7004: factor out gpg setup Jeff King
2011-09-07 17:43 ` [PATCH 2/5] t6300: add more body-parsing tests Jeff King
2011-09-07 17:44 ` Jeff King [this message]
2011-09-07 17:44 ` [PATCH 4/5] for-each-ref: handle multiline subjects like --pretty Jeff King
2011-09-07 17:46 ` [PATCH 5/5] for-each-ref: add split message parts to %(contents:*) Jeff King
2011-09-01 17:16 ` [PATCH] " Junio C Hamano
2011-09-01 18:19 ` Jeff King
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=20110907174407.GC11355@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@drmicha.warpmail.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mgorny@gentoo.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;
as well as URLs for NNTP newsgroup(s).