+ while (!strncmp(p, "parent ", 7))
+ p += 48; // "parent " + hex[40] + "\n"
+
+ if (p && !strncmp(p, "author ", 7)) {
+ p = parse_user(p + 7, &ret->author, &ret->author_email,
+ &ret->author_date);
+ }
+
+ if (p && !strncmp(p, "committer ", 9)) {
+ p = parse_user(p + 9, &ret->committer, &ret->committer_email,
+ &ret->committer_date);
+ }
+
+ if (p && !strncmp(p, "encoding ", 9)) {
+ p += 9;
+ t = strchr(p, '\n');
+ if (t) {
+ ret->msg_encoding = substr(p, t + 1);
+ p = t + 1;
+ }
+ }
+
+ /* if no special encoding is found, assume UTF-8 */
+ if (!ret->msg_encoding)
+ ret->msg_encoding = xstrdup("UTF-8");
+
+ // skip unknown header fields
+ while (p && *p && (*p != '\n')) {
+ p = strchr(p, '\n');
+ if (p)
+ p++;
+ }
+
+ // skip empty lines between headers and message
+ while (p && *p == '\n')
+ p++;
+
+ if (!p)
+ return ret;
+
+ t = strchr(p, '\n');
+ if (t) {
+ ret->subject = substr(p, t);
+ p = t + 1;
+
+ while (p && *p == '\n') {
+ p = strchr(p, '\n');
+ if (p)
+ p++;
+ }
+ if (p)
+ ret->msg = xstrdup(p);
+ } else
+ ret->subject = xstrdup(p);
+
+ reencode(&ret->author, ret->msg_encoding, PAGE_ENCODING);
+ reencode(&ret->author_email, ret->msg_encoding, PAGE_ENCODING);
+ reencode(&ret->committer, ret->msg_encoding, PAGE_ENCODING);
+ reencode(&ret->committer_email, ret->msg_encoding, PAGE_ENCODING);
+ reencode(&ret->subject, ret->msg_encoding, PAGE_ENCODING);
+ reencode(&ret->msg, ret->msg_encoding, PAGE_ENCODING);