From: Roger Leigh Date: Mon, 29 Jun 2009 21:17:00 GMT Subject: [PATCH] builtin-mailinfo.c: Trim only first pair of square brackets in subject Message-ID: <1246310220-16909-1-git-send-email-rleigh@debian.org> In-Reply-To: <7vfxdkez96.fsf@alter.siamese.dyndns.org> Use a regular expression to match text after "Re:" or any text in the first pair of square brackets such as "[PATCH n/m]". This replaces the complex hairy string munging with a simple single pattern match. Signed-off-by: Roger Leigh --- builtin-mailinfo.c | 61 +++++++++++++++++++++++++++++----------------------- 1 files changed, 34 insertions(+), 27 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index 92637ac..6d19046 100644 --- a/builtin-mailinfo.c +++ b/builtin-mailinfo.c @@ -219,35 +219,42 @@ static int is_multipart_boundary(const struct strbuf *line) static void cleanup_subject(struct strbuf *subject) { - char *pos; - size_t remove; - while (subject->len) { - switch (*subject->buf) { - case 'r': case 'R': - if (subject->len <= 3) - break; - if (!memcmp(subject->buf + 1, "e:", 2)) { - strbuf_remove(subject, 0, 3); - continue; - } - break; - case ' ': case '\t': case ':': - strbuf_remove(subject, 0, 1); - continue; - case '[': - if ((pos = strchr(subject->buf, ']'))) { - remove = pos - subject->buf; - if (remove <= (subject->len - remove) * 2) { - strbuf_remove(subject, 0, remove + 1); - continue; - } - } else - strbuf_remove(subject, 0, 1); - break; - } + int status; + regex_t regex; + regmatch_t match[4]; + + /* Strip off 'Re:' and/or the first text in square brackets, such as + '[PATCH]' at the start of the mail Subject. */ + status = regcomp(®ex, + "^([Rr]e:)?([^]]*\\[[^]]+\\])(.*)$", + REG_EXTENDED); + + if (status) { + /* Compiling the regex failed. Find out why and tell + the user. This is always a bug in the code. */ + int esize = regerror(status, ®ex, NULL, 0); + struct strbuf etext = STRBUF_INIT; + + strbuf_grow(&etext, esize); + regerror(status, ®ex, etext.buf, esize); + fprintf (stderr, + "Error compiling regular expression: %s\n", + etext.buf); + strbuf_release(&etext); + exit(1); + } + + /* Store any matches in match. */ + status = regexec(®ex, subject->buf, 4, match, 0); + + /* If there was a match for \3 in the regex, trim the subject + to this match. */ + if (!status && match[3].rm_so > 0) { + strbuf_remove(subject, 0, match[3].rm_so); strbuf_trim(subject); - return; } + + return; } static void cleanup_space(struct strbuf *sb) -- 1.6.3.3