From mboxrd@z Thu Jan 1 00:00:00 1970 From: cgit at cryptocrack.de (Lukas Fleischer) Date: Wed, 17 Dec 2014 13:19:21 +0100 Subject: [PATCH] Use split_ident_line() in parse_user() Message-ID: <1418818761-17947-1-git-send-email-cgit@cryptocrack.de> Use Git's built-in ident line splitting algorithm instead of reimplementing it. This does not only simplify the code but also makes sure that cgit is consistent with Git when it comes to author parsing. Signed-off-by: Lukas Fleischer --- I would also like to get rid of the angle brackets and only add them when displaying the information as HTML. That would also result in email filters getting email addresses without angle brackets which I consider to be a good thing but it breaks backwards compatibility. Any opinions on this are welcome. parsing.c | 45 +++++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/parsing.c b/parsing.c index 3dbd122..7d34d11 100644 --- a/parsing.c +++ b/parsing.c @@ -71,36 +71,25 @@ static char *substr(const char *head, const char *tail) static const char *parse_user(const char *t, char **name, char **email, unsigned long *date) { - const char *p = t; - int mode = 1; + const char *line_end = strchrnul(t, '\n'); + struct ident_split ident; + unsigned email_len; - while (p && *p) { - if (mode == 1 && *p == '<') { - *name = substr(t, p - 1); - t = p; - mode++; - } else if (mode == 1 && *p == '\n') { - *name = substr(t, p); - p++; - break; - } else if (mode == 2 && *p == '>') { - *email = substr(t, p + 1); - t = p; - mode++; - } else if (mode == 2 && *p == '\n') { - *email = substr(t, p); - p++; - break; - } else if (mode == 3 && isdigit(*p)) { - *date = atol(p); - mode++; - } else if (*p == '\n') { - p++; - break; - } - p++; + if (!split_ident_line(&ident, t, line_end - t)) { + *name = substr(ident.name_begin, ident.name_end); + + email_len = ident.mail_end - ident.mail_begin; + *email = xmalloc(strlen("<") + email_len + strlen(">\0")); + sprintf(*email, "<%.*s>", email_len, ident.mail_begin); + + if (ident.date_begin) + *date = strtoul(ident.date_begin, NULL, 10); } - return p; + + if (*line_end) + return line_end + 1; + else + return line_end; } #ifdef NO_ICONV -- 2.1.3