return retval;
}
+
+/* Performs a case-insensitive strstr for ASCII strings */
+static const gchar *
+ascii_stristr(const gchar *haystack, const gchar *needle)
+{
+ int needle_len;
+ int haystack_len;
+ const gchar *pos;
+ const gchar *max_pos;
+
+ if (haystack == NULL || needle == NULL) {
+ return haystack; /* as in strstr */
+ }
+
+ needle_len = strlen(needle);
+
+ if (needle_len == 0) {
+ return haystack; /* as in strstr */
+ }
+
+ haystack_len = strlen(haystack);
+ max_pos = haystack + haystack_len - needle_len;
+
+ for (pos = haystack; pos <= max_pos; pos++) {
+ if (g_ascii_strncasecmp (pos, needle, needle_len) == 0) {
+ return pos;
+ }
+ }
+
+ return NULL;
+}
+
+
gchar*
modest_text_utils_remove_address (const gchar *address_list, const gchar *address)
{
gchar *email_address;
g_return_val_if_fail (address_list, NULL);
-
+
if (!address)
return g_strdup (address_list);
email_address = get_email_from_address (address);
-
+
/* search for substring */
- if (!strstr ((const char *) address_list, (const char *) email_address)) {
+ if (!ascii_stristr ((const char *) address_list, (const char *) email_address)) {
g_free (email_address);
return g_strdup (address_list);
}
dup = g_strdup (address_list);
filtered_emails = g_string_new (NULL);
-
+
token = strtok_r (dup, ",", &ptr);
while (token != NULL) {
/* Add to list if not found */
- if (!strstr ((const char *) token, (const char *) email_address)) {
+ if (!ascii_stristr ((const char *) token, (const char *) email_address)) {
if (filtered_emails->len == 0)
g_string_append_printf (filtered_emails, "%s", g_strstrip (token));
else
g_string_prepend (l, remaining->str);
} else {
do {
+ gunichar remaining_first;
breakpoint =
get_breakpoint (remaining->str,
rem_indent,
remaining, breakpoint);
g_string_erase (remaining, 0,
breakpoint);
- if (remaining->str[0] == ' ') {
- g_string_erase (remaining, 0,
- 1);
+ remaining_first = g_utf8_get_char_validated (remaining->str, remaining->len);
+ if (remaining_first != ((gunichar) -1)) {
+ if (g_unichar_isspace (remaining_first)) {
+ g_string_erase (remaining, 0, g_utf8_next_char (remaining->str) - remaining->str);
+ }
}
} while (remaining->len);
}
/* quoted string */
if (*current == '\"') {
+ gchar *last_quote = NULL;
current = g_utf8_next_char (current);
has_error = TRUE;
for (; *current != '\0'; current = g_utf8_next_char (current)) {
} else if (*current == '\"') {
has_error = FALSE;
current = g_utf8_next_char (current);
- break;
+ last_quote = current;
}
}
+ if (last_quote)
+ current = last_quote;
} else {
has_error = TRUE;
for (current = stripped ; *current != '\0'; current = g_utf8_next_char (current)) {
g_free (stripped);
right_part = g_strstrip (right_part);
+ if (g_str_has_suffix (right_part, ",") || g_str_has_suffix (right_part, ";"))
+ right_part [(strlen (right_part) - 1)] = '\0';
+
if (g_str_has_prefix (right_part, "<") &&
g_str_has_suffix (right_part, ">")) {
gchar *address;