From 1a4c574a4d7964761cdd7e1c917cbba32124d0f7 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Sun, 12 Apr 2020 16:10:38 -0400 Subject: Avoid mutating header/body for mbox output --- mbox.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'mbox.c') diff --git a/mbox.c b/mbox.c index f8684de..3412129 100644 --- a/mbox.c +++ b/mbox.c @@ -27,28 +27,29 @@ int mboxFrom(FILE *file) { return (n < 0 ? n : 0); } -int mboxHeader(FILE *file, char *header) { - for (char *crlf; (crlf = strstr(header, "\r\n")); header = &crlf[2]) { - *crlf = '\0'; - int n = fprintf(file, "%s\n", header); - if (n < 0) return n; +int mboxHeader(FILE *file, const char *header) { + for (const char *crlf; (crlf = strstr(header, "\r\n")); header = &crlf[2]) { + if (crlf - header) { + size_t n = fwrite(header, crlf - header, 1, file); + if (!n) return -1; + } + if (fprintf(file, "\n") < 0) return -1; } return 0; } -int mboxBody(FILE *file, char *body) { - int n; - for (char *crlf; (crlf = strstr(body, "\r\n")); body = &crlf[2]) { - *crlf = '\0'; - char *from = body; +int mboxBody(FILE *file, const char *body) { + for (const char *crlf; (crlf = strstr(body, "\r\n")); body = &crlf[2]) { + const char *from = body; while (*from == '>') from++; if (!strncmp(from, "From ", 5)) { - n = fprintf(file, ">%s\n", body); - } else { - n = fprintf(file, "%s\n", body); + if (fprintf(file, ">") < 0) return -1; + } + if (crlf - body) { + size_t n = fwrite(body, crlf - body, 1, file); + if (!n) return -1; } - if (n < 0) return n; + if (fprintf(file, "\n") < 0) return -1; } - n = fprintf(file, "\n"); - return (n < 0 ? n : 0); + return (fprintf(file, "\n" ) < 0 ? -1 : 0); } -- cgit 1.4.1