]> granicus.if.org Git - cgit/commitdiff
Use split_ident_line() in parse_user()
authorLukas Fleischer <cgit@cryptocrack.de>
Wed, 24 Dec 2014 07:50:11 +0000 (08:50 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Wed, 24 Dec 2014 08:38:28 +0000 (01:38 -0700)
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 <cgit@cryptocrack.de>
parsing.c

index 3dbd12293186baad1a5cb07c67890b8b033d4083..53c29bb23e678a058e1df03d3cb045c2d36478bd 100644 (file)
--- 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(">") + 1);
+               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