X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/61ccf1dbeea93978803303d2cd43efa5da2cc7d1..8c6e995a43e71e012ae133ff8ebea5719d9117fe:/sbr/fmt_rfc2047.c diff --git a/sbr/fmt_rfc2047.c b/sbr/fmt_rfc2047.c index 5e5a5a8e..d98b5008 100644 --- a/sbr/fmt_rfc2047.c +++ b/sbr/fmt_rfc2047.c @@ -1,6 +1,4 @@ - -/* - * fmt_rfc2047.c -- decode RFC-2047 header format +/* fmt_rfc2047.c -- decode RFC-2047 header format * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -13,7 +11,7 @@ # include #endif -static signed char hexindex[] = { +static const signed char hexindex[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, @@ -21,10 +19,18 @@ static signed char hexindex[] = { -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; -static signed char index_64[128] = { +static const signed char index_64[128] = { -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, @@ -37,12 +43,16 @@ static signed char index_64[128] = { #define char64(c) (((unsigned char) (c) > 127) ? -1 : index_64[(unsigned char) (c)]) -static int -unqp (unsigned char byte1, unsigned char byte2) +/* + * Decode two quoted-pair characters + */ + +int +decode_qp (unsigned char byte1, unsigned char byte2) { if (hexindex[byte1] == -1 || hexindex[byte2] == -1) return -1; - return (hexindex[byte1] << 4 | hexindex[byte2]); + return hexindex[byte1] << 4 | hexindex[byte2]; } /* Check if character is linear whitespace */ @@ -63,11 +73,8 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) char *startofmime, *endofmime, *endofcharset; int c, quoted_printable; int encoding_found = 0; /* did we decode anything? */ - int between_encodings = 0; /* are we between two encodings? */ - int equals_pending = 0; /* is there a '=' pending? */ int whitespace = 0; /* how much whitespace between encodings? */ #ifdef HAVE_ICONV - int use_iconv = 0; /* are we converting encoding with iconv? */ iconv_t cd = NULL; int fromutf8 = 0; char *saveq, *convbuf = NULL; @@ -84,13 +91,16 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) if (!strchr (str, '=')) return 0; + bool use_iconv = false; /* are we converting encoding with iconv? */ + bool between_encodings = false; + bool equals_pending = false; for (p = str, q = dst; *p; p++) { /* reset iconv */ #ifdef HAVE_ICONV if (use_iconv) { iconv_close(cd); - use_iconv = 0; + use_iconv = false; } #endif /* @@ -99,8 +109,8 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) */ if (equals_pending) { ADDCHR('='); - equals_pending = 0; - between_encodings = 0; /* we have added non-whitespace text */ + equals_pending = false; + between_encodings = false; /* we have added non-whitespace text */ } if (*p != '=') { @@ -108,15 +118,15 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) if (between_encodings && is_lws(*p)) whitespace++; else - between_encodings = 0; /* we have added non-whitespace text */ + between_encodings = false; /* we have added non-whitespace text */ ADDCHR(*p); continue; } - equals_pending = 1; /* we have a '=' pending */ + equals_pending = true; /* Check for initial =? */ - if (*p == '=' && p[1] && p[1] == '?' && p[2]) { + if (*p == '=' && p[1] == '?' && p[2]) { startofmime = p + 2; /* Scan ahead for the next '?' character */ @@ -149,7 +159,7 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) fromutf8 = !strcasecmp(startofmime, "UTF-8"); *pp = '?'; if (cd == (iconv_t)-1) continue; - use_iconv = 1; + use_iconv = true; #else continue; #endif @@ -179,9 +189,9 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) */ endofmime = NULL; for (pp = startofmime; *pp && *(pp+1); pp++) { - if (is_lws(*pp)) { + if (is_lws(*pp)) break; - } else if (*pp == '?' && pp[1] == '=') { + if (*pp == '?' && pp[1] == '=') { endofmime = pp; break; } @@ -193,7 +203,7 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) * We've found an encoded word, so we can drop * the '=' that was pending */ - equals_pending = 0; + equals_pending = false; /* * If we are between two encoded words separated only by @@ -212,14 +222,14 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) * malloc 0 bytes but skip on to the end */ if (endofmime == startofmime && use_iconv) { - use_iconv = 0; + use_iconv = false; iconv_close(cd); } if (use_iconv) { saveq = q; savedstlen = dstlen; - q = convbuf = (char *) mh_xmalloc(endofmime - startofmime); + q = convbuf = mh_xmalloc(endofmime - startofmime); } /* ADDCHR2 is for adding characters when q is or might be convbuf: * in this case on buffer-full we want to run iconv before returning. @@ -234,7 +244,7 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) if (quoted_printable) { for (pp = startofmime; pp < endofmime; pp++) { if (*pp == '=') { - c = unqp (pp[1], pp[2]); + c = decode_qp (pp[1], pp[2]); if (c == -1) continue; if (c != 0) @@ -345,7 +355,7 @@ decode_rfc2047 (char *str, char *dst, size_t dstlen) p = endofmime + 1; encoding_found = 1; /* we found (at least 1) encoded word */ - between_encodings = 1; /* we have just decoded something */ + between_encodings = true; /* we have just decoded something */ whitespace = 0; /* re-initialize amount of whitespace */ } }