X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=c054a5e2dfffc4d7567a12789f2b7532b98db4ee;hp=3e61cfc690ce3c488f63249e02132979ae58a6e0;hb=5680999d6a70bb204064fd8f00bd309b974ff036;hpb=e61d161744d31c7799d1a7b5246b53a7a03d9ea5 diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 3e61cfc..c054a5e 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 @@ -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; @@ -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; @@ -524,9 +528,9 @@ modest_text_utils_split_addresses_list (const gchar *addresses) void modest_text_utils_address_range_at_position (const gchar *recipients_list, - gint position, - gint *start, - gint *end) + guint position, + guint *start, + guint *end) { gchar *current = NULL; gint range_start = 0; @@ -534,8 +538,12 @@ modest_text_utils_address_range_at_position (const gchar *recipients_list, gint index; gboolean is_quoted = FALSE; + g_return_if_fail (recipients_list); + g_return_if_fail (position < g_utf8_strlen(recipients_list, -1)); + index = 0; - for (current = (gchar *) recipients_list; *current != '\0'; current = g_utf8_find_next_char (current, NULL)) { + for (current = (gchar *) recipients_list; *current != '\0'; + current = g_utf8_find_next_char (current, NULL)) { gunichar c = g_utf8_get_char (current); if ((c == ',') && (!is_quoted)) { @@ -995,6 +1003,8 @@ void modest_text_utils_get_display_address (gchar *address) { int i; + + g_return_if_fail (address); if (!address) return; @@ -1028,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; @@ -1048,88 +1060,113 @@ 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; + + g_return_val_if_fail (sub, 0); - i = 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); + + } else { + gint result; + gchar *n1, *n2; - g_free (n1); - g_free (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; + } } -gchar* +const gchar* modest_text_utils_get_display_date (time_t date) { - time_t now; - static const guint BUF_SIZE = 64; - static const guint ONE_DAY = 24 * 60 * 60; /* seconds in one day */ - gchar date_buf[BUF_SIZE]; - gchar today_buf [BUF_SIZE]; +#define DATE_BUF_SIZE 64 + static gchar date_buf[DATE_BUF_SIZE]; + + /* calculate the # of days since epoch for + * for today and for the date provided + * based on idea from pvanhoof */ + int day = time(NULL) / (24 * 60 * 60); + int date_day = date / (24 * 60 * 60); - modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date); + /* if it's today, show the time, if it's not today, show the date instead */ - now = time (NULL); + if (day == date_day) /* is the date today? */ + modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%X", date); + else + modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%x", date); - /* we check if the date is within the last 24h, if not, we don't - * have to do the extra, expensive strftime, which was very visible - * in the profiles. - */ - if (abs(now - date) < ONE_DAY) { - - /* it's within the last 24 hours, but double check */ - /* use the localized dates */ - modest_text_utils_strftime (today_buf, BUF_SIZE, "%x", now); - - /* if it's today, use the time instead */ - if (strcmp (date_buf, today_buf) == 0) - modest_text_utils_strftime (date_buf, BUF_SIZE, "%X", date); - } - - return g_strdup(date_buf); + return date_buf; /* this is a static buffer, don't free! */ } + gboolean modest_text_utils_validate_folder_name (const gchar *folder_name) { @@ -1170,6 +1207,7 @@ modest_text_utils_validate_folder_name (const gchar *folder_name) return FALSE; } } + return TRUE; /* it's valid! */ } @@ -1182,11 +1220,13 @@ modest_text_utils_validate_domain_name (const gchar *domain) regex_t rx; const gchar* domain_regex = "^[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)) { @@ -1203,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++) { @@ -1282,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; @@ -1389,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, @@ -1406,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);