]> diplodocus.org Git - nmh/blobdiff - sbr/encode_rfc2047.c
read_switch_multiword.c: Move interface to own file.
[nmh] / sbr / encode_rfc2047.c
index 2c8a3f0d9ffcf1ed2baa4528a10a7b8ca570a61d..e463bf6840ad94c2d3330be9c1d36c9732edee11 100644 (file)
@@ -1,15 +1,19 @@
-/*
- * Routines to encode message headers using RFC 2047-encoding.
+/* encode_rfc2047.c -- encode message headers using RFC 2047 encoding.
  *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
  */
 
-#include <h/mh.h>
-#include <h/mhparse.h>
-#include <h/addrsbr.h>
-#include <h/utils.h>
+#include "h/mh.h"
+#include "encode_rfc2047.h"
+#include "check_charset.h"
+#include "error.h"
+#include "h/mhparse.h"
+#include "h/addrsbr.h"
+#include "h/utils.h"
+#include "base64.h"
+#include "unquote.h"
 
 /*
  * List of headers that contain addresses and as a result require special
@@ -107,7 +111,7 @@ encode_rfc2047(const char *name, char **value, int encoding,
        charset = write_charset_8bit();
 
     if (strcasecmp(charset, "US-ASCII") == 0) {
-       advise(NULL, "Cannot use US-ASCII with 8 bit characters in header");
+       inform("Cannot use US-ASCII with 8 bit characters in header");
        return 1;
     }
 
@@ -146,7 +150,7 @@ encode_rfc2047(const char *name, char **value, int encoding,
                                   eightbitcount + qpspecialcount, 0);
 
     default:
-       advise(NULL, "Internal error: unknown RFC-2047 encoding type");
+       inform("Internal error: unknown RFC-2047 encoding type");
        return 1;
     }
 }
@@ -159,7 +163,7 @@ static int
 field_encode_quoted(const char *name, char **value, const char *charset,
                    int ascii, int encoded, int phraserules)
 {
-    int prefixlen = name ? strlen(name) + 2: 0, outlen = 0, column, newline = 1;
+    int prefixlen = name ? strlen(name) + 2: 0, outlen = 0, column;
     int charsetlen = strlen(charset), utf8;
     char *output = NULL, *p, *q = NULL;
 
@@ -174,6 +178,7 @@ field_encode_quoted(const char *name, char **value, const char *charset,
 
     utf8 = strcasecmp(charset, "UTF-8") == 0;
 
+    bool newline = true;
     while (*p != '\0') {
        /*
         * Start a new line, if it's time
@@ -224,7 +229,7 @@ field_encode_quoted(const char *name, char **value, const char *charset,
            tokenlen = snprintf(q, outlen - (q - output), "=?%s?Q?", charset);
            q += tokenlen;
            column = prefixlen + tokenlen;
-           newline = 0;
+           newline = false;
        }
 
        /*
@@ -265,7 +270,7 @@ field_encode_quoted(const char *name, char **value, const char *charset,
            continue;
 
        if (column >= ENCODELINELIMIT - 2) {
-           newline = 1;
+           newline = true;
        } else if (utf8) {
            /*
             * Okay, this is a bit weird, but to explain a bit more ...
@@ -281,7 +286,7 @@ field_encode_quoted(const char *name, char **value, const char *charset,
             * allow for the encoded output.
             */
            if (column + (utf8len(p) * 3) > ENCODELINELIMIT - 2) {
-               newline = 1;
+               newline = true;
            }
        }
     }
@@ -289,7 +294,7 @@ field_encode_quoted(const char *name, char **value, const char *charset,
     if (q == NULL) {
        /* This should never happen, but just in case.  Found by
           clang static analyzer. */
-       admonish (NULL, "null output encoding for %s", *value);
+       inform("null output encoding for %s, continuing...", *value);
        return 1;
     }
     *q++ = '?';
@@ -381,7 +386,7 @@ field_encode_base64(const char *name, char **value, const char *charset)
        numencode = strbase64(ENCODELINELIMIT - (q - linestart) - 2);
 
        if (numencode <= 0) {
-           advise(NULL, "Internal error: tried to encode %d characters "
+           inform("Internal error: tried to encode %d characters "
                   "in base64", numencode);
            return 1;
        }
@@ -405,7 +410,7 @@ field_encode_base64(const char *name, char **value, const char *charset)
                numencode--;
 
            if (numencode == 0) {
-               advise(NULL, "Internal error: could not find start of "
+               inform("Internal error: could not find start of "
                       "UTF-8 character when base64 encoding header");
                return 1;
            }
@@ -413,7 +418,7 @@ field_encode_base64(const char *name, char **value, const char *charset)
 
        if (writeBase64raw((unsigned char *) p, numencode,
                           (unsigned char *) q) != OK) {
-           advise(NULL, "Internal error: base64 encoding of header failed");
+           inform("Internal error: base64 encoding of header failed");
            return 1;
        }
 
@@ -460,7 +465,7 @@ field_encode_base64(const char *name, char **value, const char *charset)
 
     if (writeBase64raw((unsigned char *) p, strlen(p),
                       (unsigned char *) q) != OK) {
-       advise(NULL, "Internal error: base64 encoding of header failed");
+       inform("Internal error: base64 encoding of header failed");
        return 1;
     }
 
@@ -550,7 +555,11 @@ field_encode_address(const char *name, char **value, int encoding,
                     const char *charset)
 {
     int prefixlen = strlen(name) + 2, column = prefixlen, groupflag;
-    int asciichars, specialchars, eightbitchars, reformat = 0, errflag = 0;
+    int asciichars;
+    int specialchars;
+    int eightbitchars;
+    bool reformat = false;
+    bool errflag = false;
     size_t len;
     char *mp, *cp = NULL, *output = NULL;
     char *tmpbuf = NULL;
@@ -574,12 +583,12 @@ field_encode_address(const char *name, char **value, int encoding,
 
     for (groupflag = 0; (mp = getname(*value)); ) {
        if ((mn = getm(mp, NULL, 0, errbuf, sizeof(errbuf))) == NULL) {
-           advise(NULL, "%s: %s", errbuf, mp);
-           errflag++;
+           inform("%s: %s", errbuf, mp);
+           errflag = true;
            continue;
        }
 
-       reformat = 0;
+       reformat = false;
 
        /*
         * We only care if the phrase (m_pers) or any trailing comment
@@ -618,7 +627,7 @@ field_encode_address(const char *name, char **value, int encoding,
 
            case CE_BASE64:
                if (field_encode_base64(NULL, &mn->m_pers, charset)) {
-                   errflag++;
+                   errflag = true;
                    goto out;
                }
                break;
@@ -626,18 +635,18 @@ field_encode_address(const char *name, char **value, int encoding,
            case CE_QUOTED:
                if (field_encode_quoted(NULL, &mn->m_pers, charset, asciichars,
                                        eightbitchars + specialchars, 1)) {
-                   errflag++;
+                   errflag = true;
                    goto out;
                }
                break;
 
            default:
-               advise(NULL, "Internal error: unknown RFC-2047 encoding type");
-               errflag++;
+               inform("Internal error: unknown RFC-2047 encoding type");
+               errflag = true;
                goto out;
            }
 
-           reformat++;
+           reformat = true;
        }
 
        check_note:
@@ -658,9 +667,9 @@ field_encode_address(const char *name, char **value, int encoding,
        }
 
        if (mn->m_note[0] != '(' || mn->m_note[len - 1] != ')') {
-           advise(NULL, "Internal error: Invalid note field \"%s\"",
+           inform("Internal error: Invalid note field \"%s\"",
                   mn->m_note);
-           errflag++;
+           errflag = true;
            goto out;
        }
 
@@ -681,7 +690,7 @@ field_encode_address(const char *name, char **value, int encoding,
 
            case CE_BASE64:
                if (field_encode_base64(NULL, &tmpbuf, charset)) {
-                   errflag++;
+                   errflag = true;
                    goto out;
                }
                break;
@@ -689,18 +698,18 @@ field_encode_address(const char *name, char **value, int encoding,
            case CE_QUOTED:
                if (field_encode_quoted(NULL, &tmpbuf, charset, asciichars,
                                        eightbitchars + specialchars, 1)) {
-                   errflag++;
+                   errflag = true;
                    goto out;
                }
                break;
 
            default:
-               advise(NULL, "Internal error: unknown RFC-2047 encoding type");
-               errflag++;
+               inform("Internal error: unknown RFC-2047 encoding type");
+               errflag = true;
                goto out;
            }
 
-           reformat++;
+           reformat = true;
 
            /*
             * Make sure the size of tmpbuf is correct (it always gets
@@ -737,13 +746,13 @@ do_reformat:
 
        if (groupflag && ! mn->m_ingrp) {
            output = add(";", output);
-           column += 1;
+           column++;
        }
 
        groupflag = mn->m_ingrp;
 
        if (mn->m_gname) {
-           cp = add(mn->m_gname, NULL);
+           cp = mh_xstrdup(mn->m_gname);
        }
 
        if (reformat) {
@@ -798,13 +807,10 @@ do_reformat:
     output = NULL;
 
 out:
+    free(tmpbuf);
+    free(output);
 
-    if (tmpbuf)
-       free(tmpbuf);
-    if (output)
-       free(output);
-
-    return errflag > 0;
+    return errflag;
 }
 
 /*