diff libpurple/util.c @ 24838:0d7c21b5f1d7

propagate from branch 'im.pidgin.pidgin' (head c06356e8e8d2c586f0192a5564053c2584020da8) to branch 'im.pidgin.pidgin.openq' (head a7077bc12b850d60ea7d768f4b9d4ee6ae6ad2c1)
author SHiNE CsyFeK <csyfek@gmail.com>
date Thu, 25 Dec 2008 14:06:10 +0000
parents 3d3376237a7c
children 43b721aa4b76 fb89c9f6e57a 45434c3fd878
line wrap: on
line diff
--- a/libpurple/util.c	Wed Dec 17 13:52:00 2008 +0000
+++ b/libpurple/util.c	Thu Dec 25 14:06:10 2008 +0000
@@ -1676,20 +1676,18 @@
 							  size = "xx-small";
 							  break;
 							case 2:
-							  size = "x-small";
+							  size = "small";
 							  break;
 							case 3:
-							  size = "small";
+							  size = "medium";
 							  break;
 							case 4:
-							  size = "medium";
+							  size = "large";
 							  break;
 							case 5:
-							  size = "large";
+							  size = "x-large";
 							  break;
 							case 6:
-							  size = "x-large";
-							  break;
 							case 7:
 							  size = "xx-large";
 							  break;
@@ -4572,18 +4570,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);