Make read_one_header_line return a flag not a length.
[git.git] / mailinfo.c
index ff2d4d4..83a2986 100644 (file)
@@ -7,7 +7,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#ifndef NO_ICONV
 #include <iconv.h>
+#endif
 #include "git-compat-util.h"
 #include "cache.h"
 
@@ -329,7 +331,7 @@ struct header_def {
        int namelen;
 };
 
-static void check_header(char *line, int len, struct header_def *header)
+static void check_header(char *line, struct header_def *header)
 {
        int i;
 
@@ -347,7 +349,7 @@ static void check_header(char *line, int len, struct header_def *header)
        }
 }
 
-static void check_subheader_line(char *line, int len)
+static void check_subheader_line(char *line)
 {
        static struct header_def header[] = {
                { "Content-Type", handle_subcontent_type },
@@ -355,9 +357,9 @@ static void check_subheader_line(char *line, int len)
                  handle_content_transfer_encoding },
                { NULL },
        };
-       check_header(line, len, header);
+       check_header(line, header);
 }
-static void check_header_line(char *line, int len)
+static void check_header_line(char *line)
 {
        static struct header_def header[] = {
                { "From", handle_from },
@@ -368,7 +370,7 @@ static void check_header_line(char *line, int len)
                  handle_content_transfer_encoding },
                { NULL },
        };
-       check_header(line, len, header);
+       check_header(line, header);
 }
 
 static int read_one_header_line(char *line, int sz, FILE *in)
@@ -403,7 +405,7 @@ static unsigned hexval(int c)
        return ~0;
 }
 
-static int decode_q_segment(char *in, char *ot, char *ep)
+static int decode_q_segment(char *in, char *ot, char *ep, int rfc2047)
 {
        int c;
        while ((c = *in++) != 0 && (in <= ep)) {
@@ -412,9 +414,11 @@ static int decode_q_segment(char *in, char *ot, char *ep)
                        if (d == '\n' || !d)
                                break; /* drop trailing newline */
                        *ot++ = ((hexval(d) << 4) | hexval(*in++));
+                       continue;
                }
-               else
-                       *ot++ = c;
+               if (rfc2047 && c == '_') /* rfc2047 4.2 (2) */
+                       c = 0x20;
+               *ot++ = c;
        }
        *ot = 0;
        return 0;
@@ -469,6 +473,7 @@ static int decode_b_segment(char *in, char *ot, char *ep)
 
 static void convert_to_utf8(char *line, char *charset)
 {
+#ifndef NO_ICONV
        char *in, *out;
        size_t insize, outsize, nrc;
        char outbuf[4096]; /* cheat */
@@ -501,6 +506,7 @@ static void convert_to_utf8(char *line, char *charset)
                return;
        *out = 0;
        strcpy(line, outbuf);
+#endif
 }
 
 static void decode_header_bq(char *it)
@@ -543,7 +549,7 @@ static void decode_header_bq(char *it)
                        sz = decode_b_segment(cp + 3, piecebuf, ep);
                        break;
                case 'q':
-                       sz = decode_q_segment(cp + 3, piecebuf, ep);
+                       sz = decode_q_segment(cp + 3, piecebuf, ep, 1);
                        break;
                }
                if (sz < 0)
@@ -565,7 +571,7 @@ static void decode_transfer_encoding(char *line)
        switch (transfer_encoding) {
        case TE_QP:
                ep = line + strlen(line);
-               decode_q_segment(line, line, ep);
+               decode_q_segment(line, line, ep, 0);
                break;
        case TE_BASE64:
                ep = line + strlen(line);
@@ -703,8 +709,8 @@ static void handle_multipart_body(void)
                return;
        /* We are on boundary line.  Start slurping the subhead. */
        while (1) {
-               int len = read_one_header_line(line, sizeof(line), stdin);
-               if (!len) {
+               int hdr = read_one_header_line(line, sizeof(line), stdin);
+               if (!hdr) {
                        if (handle_multipart_one_part() < 0)
                                return;
                        /* Reset per part headers */
@@ -712,7 +718,7 @@ static void handle_multipart_body(void)
                        charset[0] = 0;
                }
                else
-                       check_subheader_line(line, len);
+                       check_subheader_line(line);
        }
        fclose(patchfile);
        if (!patch_lines) {
@@ -781,15 +787,15 @@ int main(int argc, char **argv)
                exit(1);
        }
        while (1) {
-               int len = read_one_header_line(line, sizeof(line), stdin);
-               if (!len) {
+               int hdr = read_one_header_line(line, sizeof(line), stdin);
+               if (!hdr) {
                        if (multipart_boundary[0])
                                handle_multipart_body();
                        else
                                handle_body();
                        break;
                }
-               check_header_line(line, len);
+               check_header_line(line);
        }
        return 0;
 }