X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=rfc2231.c;h=19a4add0dd15b94ce6974bf41114d18b4d9fedd2;hp=ad03be97696330e2b2578b5ee1ae76390ea82c2c;hb=df70e07e24add1869bcc9b7af2277d9d0c09a281;hpb=f404a0ca916be07049af51a3022baaaaab94def6 diff --git a/rfc2231.c b/rfc2231.c index ad03be9..19a4add 100644 --- a/rfc2231.c +++ b/rfc2231.c @@ -43,32 +43,31 @@ #include #include -struct rfc2231_parameter -{ +struct rfc2231_parameter { char *attribute; char *value; - int index; - int encoded; - struct rfc2231_parameter - *next; + int index; + int encoded; + struct rfc2231_parameter + *next; }; static char *rfc2231_get_charset (char *, char *, size_t); static struct rfc2231_parameter *rfc2231_new_parameter (void); static void rfc2231_decode_one (char *, char *); static void rfc2231_free_parameter (struct rfc2231_parameter **); -static void rfc2231_join_continuations (PARAMETER **, struct rfc2231_parameter *); -static void rfc2231_list_insert (struct rfc2231_parameter **, struct rfc2231_parameter *); +static void rfc2231_join_continuations (PARAMETER **, + struct rfc2231_parameter *); +static void rfc2231_list_insert (struct rfc2231_parameter **, + struct rfc2231_parameter *); -static void purge_empty_parameters (PARAMETER **headp) +static void purge_empty_parameters (PARAMETER ** headp) { PARAMETER *p, *q, **last; - - for (last = headp, p = *headp; p; p = q) - { + + for (last = headp, p = *headp; p; p = q) { q = p->next; - if (!p->attribute || !p->value) - { + if (!p->attribute || !p->value) { *last = q; p->next = NULL; mutt_free_parameter (&p); @@ -79,7 +78,7 @@ static void purge_empty_parameters (PARAMETER **headp) } -void rfc2231_decode_parameters (PARAMETER **headp) +void rfc2231_decode_parameters (PARAMETER ** headp) { PARAMETER *head = NULL; PARAMETER **last; @@ -93,20 +92,19 @@ void rfc2231_decode_parameters (PARAMETER **headp) int encoded; int index; - short dirty = 0; /* set to 1 when we may have created - * empty parameters. - */ - - if (!headp) return; + short dirty = 0; /* set to 1 when we may have created + * empty parameters. + */ + + if (!headp) + return; purge_empty_parameters (headp); - - for (last = &head, p = *headp; p; p = q) - { + + for (last = &head, p = *headp; p; p = q) { q = p->next; - if (!(s = strchr (p->attribute, '*'))) - { + if (!(s = strchr (p->attribute, '*'))) { /* * Using RFC 2047 encoding in MIME parameters is explicitly @@ -116,16 +114,19 @@ void rfc2231_decode_parameters (PARAMETER **headp) */ if (option (OPTRFC2047PARAMS) && p->value && strstr (p->value, "=?")) - rfc2047_decode (&p->value); + rfc2047_decode (&p->value); + else if (!option (OPTSTRICTMIME)) { + if (ascii_strcasecmp (AssumedCharset, "us-ascii")) + mutt_convert_nonmime_string (&p->value); + } *last = p; last = &p->next; p->next = NULL; } - else if (*(s + 1) == '\0') - { + else if (*(s + 1) == '\0') { *s = '\0'; - + s = rfc2231_get_charset (p->value, charset, sizeof (charset)); rfc2231_decode_one (p->value, s); mutt_convert_string (&p->value, charset, Charset, M_ICONV_HOOK_FROM); @@ -133,14 +134,13 @@ void rfc2231_decode_parameters (PARAMETER **headp) *last = p; last = &p->next; p->next = NULL; - + dirty = 1; } - else - { - *s = '\0'; s++; /* let s point to the first character of index. */ - for (t = s; *t && isdigit ((unsigned char) *t); t++) - ; + else { + *s = '\0'; + s++; /* let s point to the first character of index. */ + for (t = s; *t && isdigit ((unsigned char) *t); t++); encoded = (*t == '*'); *t = '\0'; @@ -151,7 +151,7 @@ void rfc2231_decode_parameters (PARAMETER **headp) conttmp->value = p->value; conttmp->encoded = encoded; conttmp->index = index; - + p->attribute = NULL; p->value = NULL; FREE (&p); @@ -160,18 +160,17 @@ void rfc2231_decode_parameters (PARAMETER **headp) } } - if (conthead) - { + if (conthead) { rfc2231_join_continuations (last, conthead); dirty = 1; } - + *headp = head; - + if (dirty) purge_empty_parameters (headp); } - + static struct rfc2231_parameter *rfc2231_new_parameter (void) { return safe_calloc (sizeof (struct rfc2231_parameter), 1); @@ -179,8 +178,7 @@ static struct rfc2231_parameter *rfc2231_new_parameter (void) static void rfc2231_free_parameter (struct rfc2231_parameter **p) { - if (*p) - { + if (*p) { FREE (&(*p)->attribute); FREE (&(*p)->value); FREE (p); @@ -190,16 +188,15 @@ static void rfc2231_free_parameter (struct rfc2231_parameter **p) static char *rfc2231_get_charset (char *value, char *charset, size_t chslen) { char *t, *u; - - if (!(t = strchr (value, '\''))) - { + + if (!(t = strchr (value, '\''))) { charset[0] = '\0'; return value; } - + *t = '\0'; strfcpy (charset, value, chslen); - + if ((u = strchr (t + 1, '\''))) return u + 1; else @@ -210,19 +207,17 @@ static void rfc2231_decode_one (char *dest, char *src) { char *d; - for (d = dest; *src; src++) - { + for (d = dest; *src; src++) { if (*src == '%' && isxdigit ((unsigned char) *(src + 1)) && - isxdigit ((unsigned char) *(src + 2))) - { + isxdigit ((unsigned char) *(src + 2))) { *d++ = (hexval (*(src + 1)) << 4) | (hexval (*(src + 2))); src += 2; } else *d++ = *src; } - + *d = '\0'; } @@ -233,30 +228,30 @@ static void rfc2231_decode_one (char *dest, char *src) */ static void rfc2231_list_insert (struct rfc2231_parameter **list, - struct rfc2231_parameter *par) + struct rfc2231_parameter *par) { struct rfc2231_parameter **last = list; struct rfc2231_parameter *p = *list, *q; int c; - - while (p) - { + + while (p) { last = &p->next; - q = p; p = p->next; + q = p; + p = p->next; c = strcmp (par->value, q->value); if ((c > 0) || (c == 0 && par->index >= q->index)) break; } - + par->next = p; *last = par; } /* process continuation parameters */ -static void rfc2231_join_continuations (PARAMETER **head, - struct rfc2231_parameter *par) +static void rfc2231_join_continuations (PARAMETER ** head, + struct rfc2231_parameter *par) { struct rfc2231_parameter *q; @@ -267,11 +262,11 @@ static void rfc2231_join_continuations (PARAMETER **head, int encoded; size_t l, vl; - - while (par) - { - value = NULL; l = 0; - + + while (par) { + value = NULL; + l = 0; + strfcpy (attribute, par->attribute, sizeof (attribute)); if ((encoded = par->encoded)) @@ -279,27 +274,25 @@ static void rfc2231_join_continuations (PARAMETER **head, else valp = par->value; - do - { + do { if (encoded && par->encoded) - rfc2231_decode_one (par->value, valp); - + rfc2231_decode_one (par->value, valp); + vl = strlen (par->value); - + safe_realloc (&value, l + vl + 1); - strcpy (value + l, par->value); /* __STRCPY_CHECKED__ */ + strcpy (value + l, par->value); /* __STRCPY_CHECKED__ */ l += vl; q = par->next; rfc2231_free_parameter (&par); if ((par = q)) - valp = par->value; + valp = par->value; } while (par && !strcmp (par->attribute, attribute)); - - if (value) - { + + if (value) { if (encoded) - mutt_convert_string (&value, charset, Charset, M_ICONV_HOOK_FROM); + mutt_convert_string (&value, charset, Charset, M_ICONV_HOOK_FROM); *head = mutt_new_parameter (); (*head)->attribute = safe_strdup (attribute); (*head)->value = value; @@ -324,14 +317,13 @@ int rfc2231_encode_string (char **pd) for (s = *pd; *s; s++) if (*s & 0x80) break; - + if (!*s) return 0; - + if (!Charset || !SendCharset || !(charset = mutt_choose_charset (Charset, SendCharset, - *pd, strlen (*pd), &d, &dlen))) - { + *pd, strlen (*pd), &d, &dlen))) { charset = safe_strdup (Charset ? Charset : "unknown-8bit"); d = *pd; dlen = strlen (d); @@ -346,20 +338,18 @@ int rfc2231_encode_string (char **pd) else if (strchr (MimeSpecials, *s) || strchr ("*'%", *s)) ++ext; - if (encode) - { - e = safe_malloc (dlen + 2*ext + strlen (charset) + 3); - sprintf (e, "%s''", charset); /* __SPRINTF_CHECKED__ */ + if (encode) { + e = safe_malloc (dlen + 2 * ext + strlen (charset) + 3); + sprintf (e, "%s''", charset); /* __SPRINTF_CHECKED__ */ t = e + strlen (e); for (s = d, slen = dlen; slen; s++, slen--) if (*s < 0x20 || *s >= 0x7f || - strchr (MimeSpecials, *s) || strchr ("*'%", *s)) - { - sprintf (t, "%%%02X", (unsigned char)*s); - t += 3; + strchr (MimeSpecials, *s) || strchr ("*'%", *s)) { + sprintf (t, "%%%02X", (unsigned char) *s); + t += 3; } else - *t++ = *s; + *t++ = *s; *t = '\0'; if (d != *pd) @@ -367,14 +357,12 @@ int rfc2231_encode_string (char **pd) FREE (pd); *pd = e; } - else if (d != *pd) - { + else if (d != *pd) { FREE (pd); *pd = d; } - + FREE (&charset); - + return encode; } -