changeset 24843:c7d11c2673cc

merge of '5dc6f2359f155e18525e7b42ecd827005e473725' and 'c2ac5fa50fc703703cc562bb7f7e4baf62d91fa3'
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 19 Dec 2008 04:12:30 +0000
parents e7b27ee5e7b6 (diff) a3ff72aa9c39 (current diff)
children 94a47062819c
files
diffstat 1 files changed, 20 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/util.c	Fri Dec 19 03:43:26 2008 +0000
+++ b/libpurple/util.c	Fri Dec 19 04:12:30 2008 +0000
@@ -4572,18 +4572,35 @@
 purple_utf8_has_word(const char *haystack, const char *needle)
 {
 	char *hay, *pin, *p;
+	const char *start, *prev_char;
+	gunichar before, after;
 	int n;
 	gboolean ret = FALSE;
 
-	hay = g_utf8_strdown(haystack, -1);
+	start = hay = g_utf8_strdown(haystack, -1);
 
 	pin = g_utf8_strdown(needle, -1);
 	n = strlen(pin);
 
-	if ((p = strstr(hay, pin)) != NULL) {
-		if ((p == hay || !isalnum(*(p - 1))) && !isalnum(*(p + n))) {
+	while ((p = strstr(start, pin)) != NULL) {
+		prev_char = g_utf8_find_prev_char(hay, p);
+		before = -2;
+		if (prev_char) {
+			before = g_utf8_get_char(prev_char);
+		}
+		after = g_utf8_get_char_validated(p + n, - 1);
+
+		if ((p == hay ||
+				/* The character before is a reasonable guess for a word boundary
+				   ("!g_unichar_isalnum()" is not a valid way to determine word
+				    boundaries, but it is the only reasonable thing to do here),
+				   and isn't the '&' from a "&amp;" or some such entity*/
+				(before != -2 && !g_unichar_isalnum(before) && *(p - 1) != '&'))
+				&& after != -2 && !g_unichar_isalnum(after)) {
 			ret = TRUE;
+			break;
 		}
+		start = p + 1;
 	}
 
 	g_free(pin);