Show
Ignore:
Timestamp:
2007-03-06 17:45:49 (21 months ago)
Author:
Masayuki Moriyama
Branch:
HEAD
Message:

Allow iconv-hook to use virtual charsets as targets. (closes: #1269)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • charset.c

    r4932 r4961  
    319319 
    320320/* 
    321  * Like iconv_open, but canonicalises the charsets 
     321 * Like iconv_open, but canonicalises the charsets, applies 
     322 * charset-hooks, recanonicalises, and finally applies iconv-hooks. 
     323 * Parameter flags=0 skips charset-hooks, while M_ICONV_HOOK_FROM 
     324 * applies them to fromcode. 
    322325 */ 
    323326 
     
    330333 
    331334  iconv_t cd; 
    332    
     335 
     336  /* transform to MIME preferred charset names */ 
    333337  mutt_canonical_charset (tocode1, sizeof (tocode1), tocode); 
    334338 
     
    340344 
    341345  mutt_canonical_charset (fromcode1, sizeof (fromcode1), fromcode); 
     346 
     347  /* maybe apply charset-hooks and recanonicalise fromcode, 
     348   * but only when caller asked us to sanitize a potentialy wrong 
     349   * charset name incoming from the wild exterior. */ 
    342350  if ((flags & M_ICONV_HOOK_FROM) && (tmp = mutt_charset_hook (fromcode1))) 
    343351    mutt_canonical_charset (fromcode1, sizeof (fromcode1), tmp); 
    344352 
    345   if ((cd = iconv_open (tocode1, fromcode1)) != (iconv_t) -1) 
     353  /* always apply iconv-hooks to suit system's iconv tastes */ 
     354  tocode2 = mutt_iconv_hook (tocode1); 
     355  tocode2 = (tocode2) ? tocode2 : tocode1; 
     356  fromcode2 = mutt_iconv_hook (fromcode1); 
     357  fromcode2 = (fromcode2) ? fromcode2 : fromcode1; 
     358 
     359  /* call system iconv with names it appreciates */ 
     360  if ((cd = iconv_open (tocode2, fromcode2)) != (iconv_t) -1) 
    346361    return cd; 
    347   if ((tocode2 = mutt_iconv_hook (tocode1)) && (fromcode2 = mutt_iconv_hook (fromcode1))) 
    348     return iconv_open (tocode2, fromcode2); 
    349362   
    350363  return (iconv_t) -1;