From c6b7b1264234ee4a55be39f83c72951d55d03868 Mon Sep 17 00:00:00 2001 From: hiro Date: Wed, 14 Sep 2005 08:19:04 +0000 Subject: normalize address fields before encoding them. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@581 ee746299-78ed-0310-b773-934348b2243d --- libsylph/utils.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ libsylph/utils.h | 4 +++ 2 files changed, 84 insertions(+) (limited to 'libsylph') diff --git a/libsylph/utils.c b/libsylph/utils.c index c0c6edff..09632f64 100644 --- a/libsylph/utils.c +++ b/libsylph/utils.c @@ -958,6 +958,86 @@ void extract_list_id_str(gchar *str) g_strstrip(str); } +gchar *normalize_address_field(const gchar *str) +{ + GString *new_str; + GSList *addr_list, *cur; + gchar *addr, *p, *q, *r; + gchar *ret_str; + + addr_list = address_list_append_orig(NULL, str); + + new_str = g_string_new(NULL); + + for (cur = addr_list; cur != NULL; cur = cur->next) { + p = addr = (gchar *)cur->data; + q = strchr_with_skip_quote(p, '"', '<'); + if (q && q > p) { + r = q - 1; + while (r > p && g_ascii_isspace(*r)) + --r; + g_string_append_len(new_str, p, r - p + 1); + g_string_append_c(new_str, ' '); + p = q; + } + if (*p == '<') { + q = strchr(p, '>'); + if (q) { + r = q + 1; + if (*r) { + while (g_ascii_isspace(*r)) + ++r; + g_string_append(new_str, r); + if (new_str->len > 0 && + !g_ascii_isspace + (new_str->str[new_str->len - 1])) + g_string_append_c(new_str, ' '); + } + g_string_append_len(new_str, p, q - p + 1); + } else { + g_string_append(new_str, p); + g_string_append_c(new_str, '>'); + } + } else + g_string_append(new_str, p); + + if (cur->next) + g_string_append(new_str, ", "); + } + + slist_free_strings(addr_list); + ret_str = new_str->str; + g_string_free(new_str, FALSE); + + return ret_str; +} + +GSList *address_list_append_orig(GSList *addr_list, const gchar *str) +{ + const gchar *p = str, *q; + gchar *addr; + + if (!str) return addr_list; + + while (*p) { + if (*p == ',' || g_ascii_isspace(*p)) { + ++p; + } else if ((q = strchr_with_skip_quote(p, '"', ','))) { + addr = g_strndup(p, q - p); + g_strstrip(addr); + addr_list = g_slist_append(addr_list, addr); + p = q + 1; + } else { + addr = g_strdup(p); + g_strstrip(addr); + addr_list = g_slist_append(addr_list, addr); + break; + } + } + + return addr_list; +} + GSList *address_list_append(GSList *addr_list, const gchar *str) { gchar *work; diff --git a/libsylph/utils.h b/libsylph/utils.h index 18b511f1..7301c59b 100644 --- a/libsylph/utils.h +++ b/libsylph/utils.h @@ -310,6 +310,10 @@ gchar *strrchr_with_skip_quote (const gchar *str, void extract_address (gchar *str); void extract_list_id_str (gchar *str); +gchar *normalize_address_field (const gchar *str); + +GSList *address_list_append_orig (GSList *addr_list, + const gchar *str); GSList *address_list_append (GSList *addr_list, const gchar *str); GSList *references_list_prepend (GSList *msgid_list, -- cgit v1.2.3