]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mailinfo: simplify parsing of header values
authorJeff King <peff@peff.net>
Tue, 11 Feb 2020 17:19:23 +0000 (12:19 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 11 Feb 2020 18:19:33 +0000 (10:19 -0800)
Our code to parse header values first checks to see if a line starts
with a header, and then manually skips past the matched string to find
the value. We can do this all in one step by modeling after
skip_prefix(), which returns a pointer into the string after the
parsing.

This lets us remove some repeated strings, and will also enable us to
parse more flexibly in a future patch.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
mailinfo.c

index 59d5a8b8f314b259352d3d5b49266844ba3d7641..ee8d05e239fca514910439774f29d88ffabc9d72 100644 (file)
@@ -346,11 +346,16 @@ static const char *header[MAX_HDR_PARSED] = {
        "From","Subject","Date",
 };
 
-static inline int cmp_header(const struct strbuf *line, const char *hdr)
+static inline int skip_header(const struct strbuf *line, const char *hdr,
+                             const char **outval)
 {
-       int len = strlen(hdr);
-       return !strncasecmp(line->buf, hdr, len) && line->len > len &&
-                       line->buf[len] == ':' && isspace(line->buf[len + 1]);
+       const char *val;
+       if (!skip_iprefix(line->buf, hdr, &val) ||
+           *val++ != ':' ||
+           !isspace(*val++))
+               return 0;
+       *outval = val;
+       return 1;
 }
 
 static int is_format_patch_separator(const char *line, int len)
@@ -547,17 +552,18 @@ static int check_header(struct mailinfo *mi,
                        const struct strbuf *line,
                        struct strbuf *hdr_data[], int overwrite)
 {
-       int i, ret = 0, len;
+       int i, ret = 0;
        struct strbuf sb = STRBUF_INIT;
+       const char *val;
 
        /* search for the interesting parts */
        for (i = 0; header[i]; i++) {
-               int len = strlen(header[i]);
-               if ((!hdr_data[i] || overwrite) && cmp_header(line, header[i])) {
+               if ((!hdr_data[i] || overwrite) &&
+                   skip_header(line, header[i], &val)) {
                        /* Unwrap inline B and Q encoding, and optionally
                         * normalize the meta information to utf8.
                         */
-                       strbuf_addstr(&sb, line->buf + len + 2);
+                       strbuf_addstr(&sb, val);
                        decode_header(mi, &sb);
                        handle_header(&hdr_data[i], &sb);
                        ret = 1;
@@ -566,25 +572,22 @@ static int check_header(struct mailinfo *mi,
        }
 
        /* Content stuff */
-       if (cmp_header(line, "Content-Type")) {
-               len = strlen("Content-Type: ");
-               strbuf_addstr(&sb, line->buf + len);
+       if (skip_header(line, "Content-Type", &val)) {
+               strbuf_addstr(&sb, val);
                decode_header(mi, &sb);
                handle_content_type(mi, &sb);
                ret = 1;
                goto check_header_out;
        }
-       if (cmp_header(line, "Content-Transfer-Encoding")) {
-               len = strlen("Content-Transfer-Encoding: ");
-               strbuf_addstr(&sb, line->buf + len);
+       if (skip_header(line, "Content-Transfer-Encoding", &val)) {
+               strbuf_addstr(&sb, val);
                decode_header(mi, &sb);
                handle_content_transfer_encoding(mi, &sb);
                ret = 1;
                goto check_header_out;
        }
-       if (cmp_header(line, "Message-Id")) {
-               len = strlen("Message-Id: ");
-               strbuf_addstr(&sb, line->buf + len);
+       if (skip_header(line, "Message-Id", &val)) {
+               strbuf_addstr(&sb, val);
                decode_header(mi, &sb);
                if (mi->add_message_id)
                        mi->message_id = strbuf_detach(&sb, NULL);
@@ -606,8 +609,9 @@ static int is_inbody_header(const struct mailinfo *mi,
                            const struct strbuf *line)
 {
        int i;
+       const char *val;
        for (i = 0; header[i]; i++)
-               if (!mi->s_hdr_data[i] && cmp_header(line, header[i]))
+               if (!mi->s_hdr_data[i] && skip_header(line, header[i], &val))
                        return 1;
        return 0;
 }