From 3a2c51d2a3e64fe444ed9322f01101880df5679c Mon Sep 17 00:00:00 2001
From: Dan Winship <danw@src.gnome.org>
Date: Wed, 31 Jul 2002 19:02:02 +0000
Subject: Don't use "isprint(c)" to mean "c >= 32 && c < 128" since it doesn't
 in

	* e-html-utils.c (is_addr_char, is_trailing_garbage): Don't use
	"isprint(c)" to mean "c >= 32 && c < 128" since it doesn't in most
	locales.
	(is_domain_name_char): new macro for dns-valid characters
	(email_address_extract): Use is_domain_name_char rather than
	is_addr_char for the part after the @.

svn path=/trunk/; revision=17655
---
 e-util/e-html-utils.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

(limited to 'e-util/e-html-utils.c')

diff --git a/e-util/e-html-utils.c b/e-util/e-html-utils.c
index 2b5e3d2d37..958987c475 100644
--- a/e-util/e-html-utils.c
+++ b/e-util/e-html-utils.c
@@ -39,21 +39,23 @@ check_size (char **buffer, int *buffer_size, char *out, int len)
 	return out;
 }
 
-/* 1 = non-email-address chars: ()<>@,;:\"[]`'|  */
-/* 2 = trailing url garbage:    ,.!?;:>)]}`'-_|  */
+/* 1 = non-email-address chars: ()<>@,;:\"[]`'{}| */
+/* 2 = trailing url garbage:    ,.!?;:>)]}`'-_|   */
+/* 4 = dns chars                                  */
 static int special_chars[] = {
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    /*  nul - 0x0f */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    /* 0x10 - 0x1f */
-	1, 2, 1, 0, 0, 0, 0, 3, 1, 3, 0, 0, 3, 2, 2, 0,    /*   sp - /    */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 0, 3, 2,    /*    0 - ?    */
-	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    /*    @ - O    */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 0, 2,    /*    P - _    */
-	3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    /*    ` - o    */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0     /*    p - del  */
+	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,    /*  nul - 0x0f */
+	3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,    /* 0x10 - 0x1f */
+	1, 2, 1, 0, 0, 0, 0, 3, 1, 3, 0, 0, 3, 6, 6, 0,    /*   sp - /    */
+	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 1, 0, 3, 2,    /*    0 - ?    */
+	1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,    /*    @ - O    */
+	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 3, 0, 2,    /*    P - _    */
+	3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,    /*    ` - o    */
+	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 3, 3, 0, 3     /*    p - del  */
 };
 
-#define is_addr_char(c) (isprint (c) && !(special_chars[c] & 1))
-#define is_trailing_garbage(c) (!isprint(c) || (special_chars[c] & 2))
+#define is_addr_char(c) (c < 128 && !(special_chars[c] & 1))
+#define is_trailing_garbage(c) (c > 127 || (special_chars[c] & 2))
+#define is_domain_name_char(c) (c < 128 && (special_chars[c] & 4))
 
 static char *
 url_extract (const unsigned char **text, gboolean check)
@@ -93,7 +95,7 @@ email_address_extract (const unsigned char **cur, char **out, const unsigned cha
 		return NULL;
 
 	/* Now look forward for a valid domain part */
-	for (end = *cur + 1, dot = NULL; is_addr_char (*end); end++) {
+	for (end = *cur + 1, dot = NULL; is_domain_name_char (*end); end++) {
 		if (*end == '.' && !dot)
 			dot = end;
 	}
-- 
cgit