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
This commit is contained in:
Dan Winship
2002-07-31 19:02:02 +00:00
parent 5f31361087
commit 3a2c51d2a3
2 changed files with 24 additions and 13 deletions

View File

@ -1,3 +1,12 @@
2002-07-31 Dan Winship <danw@ximian.com>
* 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 @.
2002-07-30 Jeffrey Stedfast <fejj@ximian.com> 2002-07-30 Jeffrey Stedfast <fejj@ximian.com>
* e-host-utils.c (e_gethostbyname_r): If the user has enabled IPv6 * e-host-utils.c (e_gethostbyname_r): If the user has enabled IPv6

View File

@ -39,21 +39,23 @@ check_size (char **buffer, int *buffer_size, char *out, int len)
return out; return out;
} }
/* 1 = non-email-address chars: ()<>@,;:\"[]`'| */ /* 1 = non-email-address chars: ()<>@,;:\"[]`'{}| */
/* 2 = trailing url garbage: ,.!?;:>)]}`'-_| */ /* 2 = trailing url garbage: ,.!?;:>)]}`'-_| */
/* 4 = dns chars */
static int special_chars[] = { static int special_chars[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* nul - 0x0f */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* nul - 0x0f */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */ 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, 2, 2, 0, /* sp - / */ 1, 2, 1, 0, 0, 0, 0, 3, 1, 3, 0, 0, 3, 6, 6, 0, /* sp - / */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 0, 3, 2, /* 0 - ? */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 1, 0, 3, 2, /* 0 - ? */
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ - O */ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* @ - O */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 0, 2, /* P - _ */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 3, 0, 2, /* P - _ */
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` - o */ 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /* ` - o */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0 /* p - del */ 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_addr_char(c) (c < 128 && !(special_chars[c] & 1))
#define is_trailing_garbage(c) (!isprint(c) || (special_chars[c] & 2)) #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 * static char *
url_extract (const unsigned char **text, gboolean check) 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; return NULL;
/* Now look forward for a valid domain part */ /* 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) if (*end == '.' && !dot)
dot = end; dot = end;
} }