]> granicus.if.org Git - neomutt/commitdiff
Remove buggy usage of M_ICONV_HOOK_TO flag in mutt_idna.c:mutt_idna_to_local().
authorAlain Bench <veronatif@free.fr>
Wed, 7 Mar 2007 02:13:14 +0000 (18:13 -0800)
committerAlain Bench <veronatif@free.fr>
Wed, 7 Mar 2007 02:13:14 +0000 (18:13 -0800)
Wipe unwanted code depending on M_ICONV_HOOK_TO in charset.c:mutt_iconv_open().
Totally wipe M_ICONV_HOOK_TO symbol.
Remove misusages of M_ICONV_HOOK_FROM flag in:
 - crypt-gpgme.c:print_utf8().
 - mutt_idna.c:mutt_idna_to_local() and mutt_local_to_idna().
 - pgp.c:pgp_traditional_encryptsign().
Document usage policy of M_ICONV_HOOK_FROM flag.
Cosmetic downcasing of some constant charset names (utf-8, euc-jp) for consistency.
Correction of a typo in the "iso8859-5" charset name.

ChangeLog
charset.c
charset.h
crypt-gpgme.c
imap/utf7.c
mbyte.c
mutt_idna.c
pgp.c
rfc2047.c
sendlib.c

index fa556d18c8128ed03fe93ffafd7e42951107aa00..73ea4d8874fd4940694b0bc230ee9350abca6d36 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-03-06 17:59 -0800  Rocco Rutte  <pdmef@gmx.net>  (5e47385893fe)
+
+       * UPDATING, doc/manual.xml.head: Documentation updates for
+       format=flowed
+
+2007-03-06 17:45 -0800  Masayuki  <Masayuki Moriyama>  (78b424bf7c5a)
+
+       * ChangeLog, charset.c, hook.c, mbyte.c: Allow iconv-hook to use
+       virtual charsets as targets. (closes: #1269)
+
 2007-03-04 19:26 +0100  Alain Bench  <veronatif@free.fr>  (4dc1d87f4c25)
 
        * doc/manual.xml.head, init.h: Doc fixes and updates concerning hooks
index 570654ef8f074b046a365b96198c9aa5e45e183d..25d4fa4dbb5c333230ed1bbe69e07353c21b3e73 100644 (file)
--- a/charset.c
+++ b/charset.c
@@ -129,7 +129,7 @@ PreferredMIMENames[] =
   { "iso-ir-144",      "iso-8859-5"    },
   { "ISO_8859-5",      "iso-8859-5"    },
   { "cyrillic",                "iso-8859-5"    },
-  { "csISOLatinCyrillic", "iso8859-5"  },
+  { "csISOLatinCyrillic", "iso-8859-5" },
 
   { "ISO_8859-9:1989", "iso-8859-9"    },
   { "iso-ir-148",      "iso-8859-9"    },
@@ -150,9 +150,9 @@ PreferredMIMENames[] =
   { "csShiftJis",      "Shift_JIS"     },
   
   { "Extended_UNIX_Code_Packed_Format_for_Japanese",
-                       "EUC-JP"        },
+                       "euc-jp"        },
   { "csEUCPkdFmtJapanese", 
-                       "EUC-JP"        },
+                       "euc-jp"        },
   
   { "csGB2312",                "gb2312"        },
   { "csbig5",          "big5"          },
@@ -321,7 +321,14 @@ int iconv_close (iconv_t cd)
  * Like iconv_open, but canonicalises the charsets, applies
  * charset-hooks, recanonicalises, and finally applies iconv-hooks.
  * Parameter flags=0 skips charset-hooks, while M_ICONV_HOOK_FROM
- * applies them to fromcode.
+ * applies them to fromcode. Callers should use flags=0 when fromcode
+ * can safely be considered true, either some constant, or some value
+ * provided by the user; M_ICONV_HOOK_FROM should be used only when
+ * fromcode is unsure, taken from a possibly wrong incoming MIME label,
+ * or such. Misusing M_ICONV_HOOK_FROM leads to unwanted interactions
+ * in some setups. Note: By design charset-hooks should never be, and
+ * are never, applied to tocode. Highlight note: The top-well-named
+ * M_ICONV_HOOK_FROM acts on charset-hooks, not at all on iconv-hooks.
  */
 
 iconv_t mutt_iconv_open (const char *tocode, const char *fromcode, int flags)
@@ -335,13 +342,6 @@ iconv_t mutt_iconv_open (const char *tocode, const char *fromcode, int flags)
 
   /* transform to MIME preferred charset names */
   mutt_canonical_charset (tocode1, sizeof (tocode1), tocode);
-
-#ifdef M_ICONV_HOOK_TO
-  /* Not used. */
-  if ((flags & M_ICONV_HOOK_TO) && (tmp = mutt_charset_hook (tocode1)))
-    mutt_canonical_charset (tocode1, sizeof (tocode1), tmp);
-#endif
-
   mutt_canonical_charset (fromcode1, sizeof (fromcode1), fromcode);
 
   /* maybe apply charset-hooks and recanonicalise fromcode,
@@ -438,7 +438,9 @@ size_t mutt_iconv (iconv_t cd, ICONV_CONST char **inbuf, size_t *inbytesleft,
 
 /*
  * Convert a string
- * Used in rfc2047.c and rfc2231.c
+ * Used in rfc2047.c, rfc2231.c, crypt-gpgme.c, mutt_idna.c, and more.
+ * Parameter flags is given as-is to mutt_iconv_open(). See there
+ * for its meaning and usage policy.
  */
 
 int mutt_convert_string (char **ps, const char *from, const char *to, int flags)
@@ -511,6 +513,10 @@ struct fgetconv_not
   iconv_t cd;
 };
 
+/*
+ * Parameter flags is given as-is to mutt_iconv_open(). See there
+ * for its meaning and usage policy.
+ */
 FGETCONV *fgetconv_open (FILE *file, const char *from, const char *to, int flags)
 {
   struct fgetconv_s *fc;
index 3fba1ccef671f0b4996572732e2c9dc5e75208b1..ab5f062bfbc8f0e8b232bac8d4945272f18e55b1 100644 (file)
--- a/charset.h
+++ b/charset.h
@@ -49,7 +49,11 @@ void fgetconv_close (FGETCONV **);
 void mutt_set_langinfo_charset (void);
 char *mutt_get_default_charset ();
 
-#define M_ICONV_HOOK_FROM 1
-#define M_ICONV_HOOK_TO   2
+/* flags for charset.c:mutt_convert_string(), fgetconv_open(), and
+ * mutt_iconv_open(). Note that applying charset-hooks to tocode is
+ * never needed, and sometimes hurts: Hence there is no M_ICONV_HOOK_TO
+ * flag.
+ */
+#define M_ICONV_HOOK_FROM 1    /* apply charset-hooks to fromcode */
 
 #endif /* _CHARSET_H */
index bf1bd3821a0da3fd7cf3904c5099e9cf5150a9b4..dde507a05381c33fe4a581851956b0bf58d63348 100644 (file)
@@ -146,7 +146,11 @@ print_utf8 (FILE *fp, const char *buf, size_t len)
   tstr = safe_malloc (len+1);
   memcpy (tstr, buf, len);
   tstr[len] = 0;
-  mutt_convert_string (&tstr, "utf-8", Charset, M_ICONV_HOOK_FROM);
+
+  /* fromcode "utf-8" is sure, so we don't want
+   * charset-hook corrections: flags must be 0.
+   */
+  mutt_convert_string (&tstr, "utf-8", Charset, 0);
   fputs (tstr, fp);
   FREE (&tstr);
 }
@@ -1921,7 +1925,11 @@ static void copy_clearsigned (gpgme_data_t data, STATE *s, char *charset)
     return;
   unlink (fname);
   FREE (&fname);
-  
+
+  /* fromcode comes from the MIME Content-Type charset label. It might
+   * be a wrong label, so we want the ability to do corrections via
+   * charset-hooks. Therefore we set flags to M_ICONV_HOOK_FROM.
+   */
   fc = fgetconv_open (fp, charset, Charset, M_ICONV_HOOK_FROM);
   
   for (complete = 1, armor_header = 1;
index 97212ad5ba842eb4b684d9400bce0309b8ba35e4..4ad1db7777e2917749728cc7824f8b9ea15cd426 100644 (file)
@@ -257,7 +257,7 @@ void imap_utf7_encode (char **s)
   if (Charset)
   {
     char *t = safe_strdup (*s);
-    if (!mutt_convert_string (&t, Charset, "UTF-8", 0))
+    if (!mutt_convert_string (&t, Charset, "utf-8", 0))
     {
       char *u7 = utf8_to_utf7 (t, strlen (t), NULL, 0);
       FREE (s);                /* __FREE_CHECKED__ */
@@ -272,7 +272,7 @@ void imap_utf7_decode (char **s)
   if (Charset)
   {
     char *t = utf7_to_utf8 (*s, strlen (*s), 0, 0);
-    if (t && !mutt_convert_string (&t, "UTF-8", Charset, 0))
+    if (t && !mutt_convert_string (&t, "utf-8", Charset, 0))
     {
       FREE (s);                /* __FREE_CHECKED__ */
       *s = t;
diff --git a/mbyte.c b/mbyte.c
index cd60dbed95e86a3a3d1fe1c4e0c52bd923c00410..f00c892bc0e5668f7ec4961f1398476274a588c4 100644 (file)
--- a/mbyte.c
+++ b/mbyte.c
@@ -73,13 +73,13 @@ void mutt_set_charset (char *charset)
     charset_is_ja = 1;
 
     /* Note flags=0 to skip charset-hooks: User masters the $charset
-     * name, and we are sure of our "UTF-8" constant. So there is no
+     * name, and we are sure of our "utf-8" constant. So there is no
      * possibility of wrong name that we would want to try to correct
      * with a charset-hook. Or rather: If $charset was wrong, we would
      * want to try to correct... $charset directly.
      */
-    charset_to_utf8 = mutt_iconv_open ("UTF-8", charset, 0);
-    charset_from_utf8 = mutt_iconv_open (charset, "UTF-8", 0);
+    charset_to_utf8 = mutt_iconv_open ("utf-8", charset, 0);
+    charset_from_utf8 = mutt_iconv_open (charset, "utf-8", 0);
   }
 #endif
 
index 52138b3ffc5d4ca740ef9afbf28b835ac853d88c..721bf4f0807d8fea0b0a775d4a206ccd6e62038c 100644 (file)
@@ -55,7 +55,9 @@ int mutt_idna_to_local (const char *in, char **out, int flags)
   /* Is this the right function?  Interesting effects with some bad identifiers! */
   if (idna_to_unicode_8z8z (in, out, 1) != IDNA_SUCCESS)
     goto notrans;
-  if (mutt_convert_string (out, "utf-8", Charset, M_ICONV_HOOK_TO) == -1)
+
+  /* we don't want charset-hook effects, so we set flags to 0 */
+  if (mutt_convert_string (out, "utf-8", Charset, 0) == -1)
     goto notrans;
 
   /* 
@@ -68,7 +70,9 @@ int mutt_idna_to_local (const char *in, char **out, int flags)
     int irrev = 0;
     char *t2 = NULL;
     char *tmp = safe_strdup (*out);
-    if (mutt_convert_string (&tmp, Charset, "utf-8", M_ICONV_HOOK_FROM) == -1)
+
+    /* we don't want charset-hook effects, so we set flags to 0 */
+    if (mutt_convert_string (&tmp, Charset, "utf-8", 0) == -1)
       irrev = 1;
     if (!irrev && idna_to_ascii_8z (tmp, &t2, 1) != IDNA_SUCCESS)
       irrev = 1;
@@ -106,7 +110,8 @@ int mutt_local_to_idna (const char *in, char **out)
     return -1;
   }
   
-  if (mutt_convert_string (&tmp, Charset, "utf-8", M_ICONV_HOOK_FROM) == -1)
+  /* we don't want charset-hook effects, so we set flags to 0 */
+  if (mutt_convert_string (&tmp, Charset, "utf-8", 0) == -1)
     rv = -1;
   if (!rv && idna_to_ascii_8z (tmp, out, 1) != IDNA_SUCCESS)
     rv = -2;
diff --git a/pgp.c b/pgp.c
index 4c58c723cf9156d2937f08a94795f314adcc4831..fe142de4df4a97046a71e02a3a899c320b7010c8 100644 (file)
--- a/pgp.c
+++ b/pgp.c
@@ -201,7 +201,11 @@ static void pgp_copy_clearsigned (FILE *fpin, STATE *s, char *charset)
   FGETCONV *fc;
   
   rewind (fpin);
-  
+
+  /* fromcode comes from the MIME Content-Type charset label. It might
+   * be a wrong label, so we want the ability to do corrections via
+   * charset-hooks. Therefore we set flags to M_ICONV_HOOK_FROM.
+   */
   fc = fgetconv_open (fpin, charset, Charset, M_ICONV_HOOK_FROM);
   
   for (complete = 1, armor_header = 1;
@@ -1422,8 +1426,9 @@ BODY *pgp_traditional_encryptsign (BODY *a, int flags, char *keylist)
       send_charset = "us-ascii";
     else
       send_charset = "utf-8";
-    
-    fc = fgetconv_open (fp, from_charset, "utf-8", M_ICONV_HOOK_FROM);
+
+    /* fromcode is assumed to be correct: we set flags to 0 */
+    fc = fgetconv_open (fp, from_charset, "utf-8", 0);
     while ((c = fgetconv (fc)) != EOF)
       fputc (c, pgpin);
     
index 98f3e3bf1b9b62bbf791fce6e0d8096e23e97542..f61784e03ff5b17793782a6e20173e5aa76ceffa 100644 (file)
--- a/rfc2047.c
+++ b/rfc2047.c
@@ -375,7 +375,7 @@ static size_t choose_block (char *d, size_t dlen, int col,
                            encoder_t *encoder, size_t *wlen)
 {
   size_t n, nn;
-  int utf8 = fromcode && !ascii_strcasecmp (fromcode, "UTF-8");
+  int utf8 = fromcode && !ascii_strcasecmp (fromcode, "utf-8");
 
   n = dlen;
   for (;;)
@@ -416,7 +416,7 @@ static int rfc2047_encode (ICONV_CONST char *d, size_t dlen, int col,
   encoder_t encoder;
   char *tocode1 = 0;
   const char *tocode;
-  char *icode = "UTF-8";
+  char *icode = "utf-8";
 
   /* Try to convert to UTF-8. */
   if (convert_string (d, dlen, fromcode, icode, &u, &ulen))
@@ -595,7 +595,7 @@ void _rfc2047_encode_string (char **pd, int encode_specials, int col)
 
   charsets = SendCharset;
   if (!charsets || !*charsets)
-    charsets = "UTF-8";
+    charsets = "utf-8";
 
   rfc2047_encode (*pd, strlen (*pd), col,
                  Charset, charsets, &e, &elen,
index 5c8430db047bbf1b59a9461ea6600f7c227f3d03..d9cfacb0165d93241efda3bf8383871483236396 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
@@ -632,7 +632,7 @@ static size_t convert_file_to (FILE *file, const char *fromcode,
   CONTENT_STATE *states;
   size_t *score;
 
-  cd1 = mutt_iconv_open ("UTF-8", fromcode, 0);
+  cd1 = mutt_iconv_open ("utf-8", fromcode, 0);
   if (cd1 == (iconv_t)(-1))
     return -1;
 
@@ -642,8 +642,8 @@ static size_t convert_file_to (FILE *file, const char *fromcode,
   infos  = safe_calloc (ncodes, sizeof (CONTENT));
 
   for (i = 0; i < ncodes; i++)
-    if (ascii_strcasecmp (tocodes[i], "UTF-8"))
-      cd[i] = mutt_iconv_open (tocodes[i], "UTF-8", 0);
+    if (ascii_strcasecmp (tocodes[i], "utf-8"))
+      cd[i] = mutt_iconv_open (tocodes[i], "utf-8", 0);
     else
       /* Special case for conversion to UTF-8 */
       cd[i] = (iconv_t)(-1), score[i] = (size_t)(-1);