author | Lars Hjemli <hjemli@gmail.com> | 2006-12-15 17:17:36 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2006-12-15 17:17:36 (UTC) |
commit | 2101e26fd68f816e77de62b93df4c32fd1110d0c (patch) (side-by-side diff) | |
tree | d70d28734c4fbfd0a4e4a40bcfd445eb50dc1666 /parsing.c | |
parent | 420712ac2531f65a2b94d5ec6d8e03de6942331e (diff) | |
download | cgit-2101e26fd68f816e77de62b93df4c32fd1110d0c.zip cgit-2101e26fd68f816e77de62b93df4c32fd1110d0c.tar.gz cgit-2101e26fd68f816e77de62b93df4c32fd1110d0c.tar.bz2 |
Add a common commit parser
Make a better commit parser, replacing the ugly one in ui-log.c
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | parsing.c | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -83,24 +83,77 @@ int cgit_parse_query(char *txt, configfn fn) { char *t, *value = NULL, c; if (!txt) return 0; t = txt = xstrdup(txt); while((c=*t) != '\0') { if (c=='=') { *t = '\0'; value = t+1; } else if (c=='&') { *t = '\0'; (*fn)(txt, value); txt = t+1; value = NULL; } t++; } if (t!=txt) (*fn)(txt, value); return 0; } + +char *substr(const char *head, const char *tail) +{ + char *buf; + + buf = xmalloc(tail - head + 1); + strncpy(buf, head, tail - head); + buf[tail - head] = '\0'; + return buf; +} + +struct commitinfo *cgit_parse_commit(struct commit *commit) +{ + struct commitinfo *ret; + char *p = commit->buffer, *t = commit->buffer; + + ret = xmalloc(sizeof(*ret)); + ret->commit = commit; + + if (strncmp(p, "tree ", 5)) + die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); + else + p += 46; // "tree " + hex[40] + "\n" + + while (!strncmp(p, "parent ", 7)) + p += 48; // "parent " + hex[40] + "\n" + + if (!strncmp(p, "author ", 7)) { + p += 7; + t = strchr(p, '<') - 1; + ret->author = substr(p, t); + p = strchr(p, '\n') + 1; + } + + if (!strncmp(p, "committer ", 9)) { + p += 9; + t = strchr(p, '<') - 1; + ret->committer = substr(p, t); + p = strchr(p, '\n') + 1; + } + + while (*p == '\n') + p = strchr(p, '\n') + 1; + + t = strchr(p, '\n'); + ret->subject = substr(p, t); + + while (*p == '\n') + p = strchr(p, '\n') + 1; + ret->msg = p; + + return ret; +} |