Show
Ignore:
Timestamp:
2007-02-23 23:01:24 (22 months ago)
Author:
Takashi TAKIZAWA <taki@…>
Branch:
HEAD
Message:

Add $assumed_charset, $file_charset and $strict_mime.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • charset.c

    r4640 r4921  
    592592  FREE (_fc);           /* __FREE_CHECKED__ */ 
    593593} 
     594 
     595const char *mutt_get_first_charset (const char *charset) 
     596{ 
     597  static char fcharset[SHORT_STRING]; 
     598  const char *c, *c1; 
     599 
     600  c = charset; 
     601  if (!mutt_strlen(c)) 
     602    return "us-ascii"; 
     603  if (!(c1 = strchr (c, ':'))) 
     604    return charset; 
     605  strfcpy (fcharset, c, c1 - c + 1); 
     606  return fcharset; 
     607} 
     608 
     609static size_t convert_string (ICONV_CONST char *f, size_t flen, 
     610                             const char *from, const char *to, 
     611                             char **t, size_t *tlen) 
     612{ 
     613  iconv_t cd; 
     614  char *buf, *ob; 
     615  size_t obl, n; 
     616  int e; 
     617 
     618  cd = mutt_iconv_open (to, from, 0); 
     619  if (cd == (iconv_t)(-1)) 
     620    return (size_t)(-1); 
     621  obl = 4 * flen + 1; 
     622  ob = buf = safe_malloc (obl); 
     623  n = iconv (cd, &f, &flen, &ob, &obl); 
     624  if (n == (size_t)(-1) || iconv (cd, 0, 0, &ob, &obl) == (size_t)(-1)) 
     625  { 
     626    e = errno; 
     627    FREE (&buf); 
     628    iconv_close (cd); 
     629    errno = e; 
     630    return (size_t)(-1); 
     631  } 
     632  *ob = '\0'; 
     633 
     634  *tlen = ob - buf; 
     635 
     636  safe_realloc ((void **) &buf, ob - buf + 1); 
     637  *t = buf; 
     638  iconv_close (cd); 
     639 
     640  return n; 
     641} 
     642 
     643int mutt_convert_nonmime_string (char **ps) 
     644{ 
     645  const char *c, *c1; 
     646 
     647  for (c = AssumedCharset; c; c = c1 ? c1 + 1 : 0) 
     648  { 
     649    char *u = *ps; 
     650    char *s; 
     651    char *fromcode; 
     652    size_t m, n; 
     653    size_t ulen = mutt_strlen (*ps); 
     654    size_t slen; 
     655 
     656    if (!u || !*u) 
     657      return 0; 
     658 
     659    c1 = strchr (c, ':'); 
     660    n = c1 ? c1 - c : mutt_strlen (c); 
     661    if (!n) 
     662      continue; 
     663    fromcode = safe_malloc (n + 1); 
     664    strfcpy (fromcode, c, n + 1); 
     665    m = convert_string (u, ulen, fromcode, Charset, &s, &slen); 
     666    FREE (&fromcode); 
     667    if (m != (size_t)(-1)) 
     668    { 
     669      FREE (ps); /* __FREE_CHECKED__ */ 
     670      *ps = s; 
     671      return 0; 
     672    } 
     673  } 
     674  return -1; 
     675} 
     676