X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=76fc3cb6ae0ddcf7c13ebcee158ac5aebf58e0f7;hb=c13b6ca1d14a40fb4558e65ca17478cdb54a1920;hp=b0f547ddb908cc48ddc85f726be2b3e81fd7b084;hpb=a0b97bdb5b2391619437f8ef3c9bae321a1227dd;p=modest diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index b0f547d..76fc3cb 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -42,7 +42,7 @@ #include #include #include - +#include #ifdef HAVE_CONFIG_H #include @@ -100,7 +100,7 @@ const gchar account_title_forbidden_chars[] = { '\\', '/', ':', '*', '?', '\'', '<', '>', '|', '^' }; const gchar folder_name_forbidden_chars[] = { - '<', '>', ':', '\'', '/', '\\', '|', '?', '*', '^', '%', '$' + '<', '>', ':', '\'', '/', '\\', '|', '?', '*', '^', '%', '$', '#', '&' }; const gchar user_name_forbidden_chars[] = { '<', '>' @@ -278,12 +278,12 @@ modest_text_utils_derived_subject (const gchar *subject, const gchar *prefix) gchar* modest_text_utils_remove_address (const gchar *address_list, const gchar *address) { - gchar *dup, *token, *ptr, *result; + gchar *dup, *token, *ptr = NULL, *result; GString *filtered_emails; gchar *email_address; g_return_val_if_fail (address_list, NULL); - + if (!address) return g_strdup (address_list); @@ -378,6 +378,8 @@ modest_text_utils_convert_to_html (const gchar *data) { GString *html; gsize len; + + g_return_val_if_fail (data, NULL); if (!data) return NULL; @@ -397,7 +399,7 @@ modest_text_utils_convert_to_html (const gchar *data) if (len <= HYPERLINKIFY_MAX_LENGTH) hyperlinkify_plain_text (html); - + return g_string_free (html, FALSE); } @@ -405,7 +407,9 @@ gchar * modest_text_utils_convert_to_html_body (const gchar *data, gssize n, gboolean hyperlinkify) { GString *html; - + + g_return_val_if_fail (data, NULL); + if (!data) return NULL; @@ -999,6 +1003,8 @@ void modest_text_utils_get_display_address (gchar *address) { int i; + + g_return_if_fail (address); if (!address) return; @@ -1032,6 +1038,8 @@ gchar * modest_text_utils_get_email_address (const gchar *full_address) { const gchar *left, *right; + + g_return_val_if_fail (full_address, NULL); if (!full_address) return NULL; @@ -1052,53 +1060,86 @@ modest_text_utils_get_email_address (const gchar *full_address) gint modest_text_utils_get_subject_prefix_len (const gchar *sub) { - gint i; - static const gchar* prefix[] = { - "Re:", "RE:", "RV:", "re:" - "Fwd:", "FWD:", "FW:", "fwd:", "Fw:", "fw:", NULL - }; - - if (!sub || (sub[0] != 'R' && sub[0] != 'F' && sub[0] != 'r' && sub[0] != 'f')) /* optimization */ - return 0; + gint prefix_len = 0; - i = 0; + g_return_val_if_fail (sub, 0); + + if (!sub) + return 0; - while (prefix[i]) { - if (g_str_has_prefix(sub, prefix[i])) { - int prefix_len = strlen(prefix[i]); - if (sub[prefix_len] == ' ') - ++prefix_len; /* ignore space after prefix as well */ - return prefix_len; - } - ++i; + /* optimization: "Re", "RE", "re","Fwd", "FWD", "fwd","FW","Fw", "fw" */ + if (sub[0] != 'R' && sub[0] != 'F' && sub[0] != 'r' && sub[0] != 'f') + return 0; + else if (sub[0] && sub[1] != 'e' && sub[1] != 'E' && sub[1] != 'w' && sub[1] != 'W') + return 0; + + prefix_len = 2; + if (sub[2] == 'd') + ++prefix_len; + + /* skip over a [...] block */ + if (sub[prefix_len] == '[') { + int c = prefix_len + 1; + while (sub[c] && sub[c] != ']') + ++c; + if (sub[c]) + return 0; /* no end to the ']' found */ + else + prefix_len = c + 1; } - return 0; + + /* did we find the ':' ? */ + if (sub[prefix_len] == ':') { + ++prefix_len; + if (sub[prefix_len] == ' ') + ++prefix_len; + prefix_len += modest_text_utils_get_subject_prefix_len (sub + prefix_len); +/* g_warning ("['%s','%s']", sub, (char*) sub + prefix_len); */ + return prefix_len; + } else + return 0; } gint modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insensitive) { - gint result = 0; - gchar *n1, *n2; - /* work even when s1 and/or s2 == NULL */ +/* work even when s1 and/or s2 == NULL */ if (G_UNLIKELY(s1 == s2)) return 0; - - /* if it's not case sensitive */ - if (!insensitive) - return strcmp (s1 ? s1 : "", s2 ? s2 : ""); - - n1 = g_utf8_collate_key (s1 ? s1 : "", -1); - n2 = g_utf8_collate_key (s2 ? s2 : "", -1); + if (G_UNLIKELY(!s1)) + return -1; + if (G_UNLIKELY(!s2)) + return 1; - result = strcmp (n1, n2); + /* if it's not case sensitive */ + if (!insensitive) { + + /* optimization: short cut if first char is ascii */ + if (((s1[0] & 0xf0)== 0) && ((s2[0] & 0xf0) == 0)) + return s1[0] - s2[0]; + + return g_utf8_collate (s1, s2); - g_free (n1); - g_free (n2); + } else { + gint result; + gchar *n1, *n2; + + /* optimization: short cut iif first char is ascii */ + if (((s1[0] & 0xf0) == 0) && ((s2[0] & 0xf0) == 0)) + return tolower(s1[0]) - tolower(s2[0]); + + n1 = g_utf8_strdown (s1, -1); + n2 = g_utf8_strdown (s2, -1); + + result = g_utf8_collate (n1, n2); + + g_free (n1); + g_free (n2); - return result; + return result; + } } @@ -1166,6 +1207,7 @@ modest_text_utils_validate_folder_name (const gchar *folder_name) return FALSE; } } + return TRUE; /* it's valid! */ } @@ -1176,13 +1218,15 @@ modest_text_utils_validate_domain_name (const gchar *domain) { gboolean valid = FALSE; regex_t rx; - const gchar* domain_regex = "^[a-z0-9]([.]?[a-z0-9-])*[a-z0-9]$"; + const gchar* domain_regex = "^([a-z0-9-]*[a-z0-9]\\.)+[a-z0-9-]*[a-z0-9]$"; - memset (&rx, 0, sizeof(regex_t)); /* coverity wants this... */ + g_return_val_if_fail (domain, FALSE); if (!domain) return FALSE; + memset (&rx, 0, sizeof(regex_t)); /* coverity wants this... */ + /* domain name: all alphanum or '-' or '.', * but beginning/ending in alphanum */ if (regcomp (&rx, domain_regex, REG_ICASE|REG_EXTENDED|REG_NOSUB)) { @@ -1199,21 +1243,22 @@ modest_text_utils_validate_domain_name (const gchar *domain) gboolean -modest_text_utils_validate_email_address (const gchar *email_address, const gchar **invalid_char_position) +modest_text_utils_validate_email_address (const gchar *email_address, + const gchar **invalid_char_position) { int count = 0; const gchar *c = NULL, *domain = NULL; static gchar *rfc822_specials = "()<>@,;:\\\"[]&"; - - if (invalid_char_position != NULL) + + if (invalid_char_position) *invalid_char_position = NULL; + g_return_val_if_fail (email_address, FALSE); + /* check that the email adress contains exactly one @ */ if (!strstr(email_address, "@") || - (strstr(email_address, "@") != g_strrstr(email_address, "@"))) - { + (strstr(email_address, "@") != g_strrstr(email_address, "@"))) return FALSE; - } /* first we validate the name portion (name@domain) */ for (c = email_address; *c; c++) { @@ -1278,8 +1323,14 @@ modest_text_utils_validate_recipient (const gchar *recipient, const gchar **inva gchar *right_part; gboolean has_error = FALSE; + if (invalid_char_position) + *invalid_char_position = NULL; + + g_return_val_if_fail (recipient, FALSE); + if (modest_text_utils_validate_email_address (recipient, invalid_char_position)) return TRUE; + stripped = g_strdup (recipient); stripped = g_strstrip (stripped); current = stripped; @@ -1385,7 +1436,8 @@ get_email_from_address (const gchar * address) gchar * modest_text_utils_get_color_string (GdkColor *color) { - + g_return_val_if_fail (color, NULL); + return g_strdup_printf ("#%x%x%x%x%x%x%x%x%x%x%x%x", (color->red >> 12) & 0xf, (color->red >> 8) & 0xf, (color->red >> 4) & 0xf, (color->red) & 0xf, @@ -1402,8 +1454,8 @@ modest_text_utils_text_buffer_get_text (GtkTextBuffer *buffer) gchar *slice, *current; GString *result = g_string_new (""); - g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL); - + g_return_val_if_fail (buffer && GTK_IS_TEXT_BUFFER (buffer), NULL); + gtk_text_buffer_get_start_iter (buffer, &start); gtk_text_buffer_get_end_iter (buffer, &end);