From 34bc515362401bdb0c747b9d4e524e7c2430a9d1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 21 Jun 2001 19:53:47 +0000 Subject: New function that decides if 2 word types are mergeable. An atom and a 2001-06-21 Jeffrey Stedfast * camel-mime-utils.c (word_types_compatable): New function that decides if 2 word types are mergeable. An atom and a qstring are mergeable; 2 qstrings are mergeable; and 2 encoded words are mergeable. (header_encode_phrase_merge_words): If 2 words are merged, the new word type is the MAX of the combined types. This means that if we merge a qstring and an atom, the resulting word type is a qstring. * camel-internet-address.c (internet_format): s/g_string_sprintfa/g_string_append since this makes more sense in this particular case. (internet_encode): Same here. svn path=/trunk/; revision=10377 --- camel/camel-mime-utils.c | 62 +++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 25 deletions(-) (limited to 'camel/camel-mime-utils.c') diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c index d787559710..5f66c08ab4 100644 --- a/camel/camel-mime-utils.c +++ b/camel/camel-mime-utils.c @@ -1405,12 +1405,23 @@ struct _phrase_word { int encoding; }; -/* split the input into words - with info about each word - merge common word types - clean up -*/ +static gboolean +word_types_compatable (enum _phrase_word_t type1, enum _phrase_word_t type2) +{ + switch (type1) { + case WORD_ATOM: + return type2 == WORD_QSTRING; + case WORD_QSTRING: + return type2 != WORD_2047; + case WORD_2047: + return type2 == WORD_2047; + default: + return FALSE; + } +} +/* split the input into words with info about each word + * merge common word types clean up */ static GList * header_encode_phrase_get_words (const unsigned char *in) { @@ -1431,14 +1442,13 @@ header_encode_phrase_get_words (const unsigned char *in) newinptr = g_utf8_next_char (inptr); c = g_utf8_get_char (inptr); - + if (!g_unichar_validate (c)) { w(g_warning ("Invalid UTF-8 sequence encountered (pos %d, char '%c'): %s", (inptr - in), inptr[0], in)); inptr++; continue; } - inptr = newinptr; if (g_unichar_isspace (c)) { @@ -1494,29 +1504,31 @@ header_encode_phrase_merge_words (GList **wordsp) wordl = words; while (wordl) { word = wordl->data; - /* leave atoms as atoms (unless they're surrounded by quoted words??) */ - if (word->type != WORD_ATOM) { - nextl = g_list_next (wordl); - while (nextl) { - next = nextl->data; - /* merge nodes of the same type AND we are not creating too long a string */ - if (word->type == next->type) { - if (next->end - word->start < CAMEL_FOLD_PREENCODED) { - word->end = next->end; - words = g_list_remove_link (words, nextl); - g_free (next); - nextl = g_list_next (wordl); - } else { - /* if it is going to be too long, make sure we include the - separating whitespace */ - word->end = next->start; - break; - } + nextl = g_list_next (wordl); + + while (nextl) { + next = nextl->data; + /* merge nodes of the same type AND we are not creating too long a string */ + if (word_types_compatable (word->type, next->type)) { + if (next->end - word->start < CAMEL_FOLD_PREENCODED) { + /* the resulting word type is the MAX of the 2 types */ + word->type = MAX(word->type, next->type); + + word->end = next->end; + words = g_list_remove_link (words, nextl); + g_free (next); + nextl = g_list_next (wordl); } else { + /* if it is going to be too long, make sure we include the + separating whitespace */ + word->end = next->start; break; } + } else { + break; } } + wordl = g_list_next (wordl); } -- cgit v1.2.3