Mercurial > pidgin
diff libpurple/util.c @ 27469:8c41a23e6b44
Add purple_ipv6_address_is_valid; guess what it does?
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sat, 11 Jul 2009 07:32:27 +0000 |
parents | 60d128c6413a |
children | 1d30e9d6de9b |
line wrap: on
line diff
--- a/libpurple/util.c Sat Jul 11 06:52:07 2009 +0000 +++ b/libpurple/util.c Sat Jul 11 07:32:27 2009 +0000 @@ -4446,6 +4446,7 @@ return ((c - domain) > 3 ? TRUE : FALSE); } +/* TODO 3.0.0: Rename this to purple_ipv4_address_is_valid */ gboolean purple_ip_address_is_valid(const char *ip) { @@ -4460,6 +4461,51 @@ return TRUE; } +gboolean +purple_ipv6_address_is_valid(const gchar *ip) +{ + const gchar *c; + gboolean double_colon = FALSE; + gint chunks = 1; + gint in = 0; + + g_return_val_if_fail(ip != NULL, FALSE); + + if (*ip == '\0') + return FALSE; + + for (c = ip; *c; ++c) { + if ((*c >= '0' && *c <= '9') || + (*c >= 'a' && *c <= 'f') || + (*c >= 'A' && *c <= 'F')) { + if (++in > 4) + /* Only four hex digits per chunk */ + return FALSE; + continue; + } else if (*c == ':') { + /* The start of a new chunk */ + ++chunks; + in = 0; + if (*(c + 1) == ':') { + /* + * '::' indicates a consecutive series of chunks full + * of zeroes. There can be only one of these per address. + */ + if (double_colon) + return FALSE; + double_colon = TRUE; + } + } else + return FALSE; + } + + /* + * Either we saw a '::' and there were fewer than 8 chunks -or- + * we didn't see a '::' and saw exactly 8 chunks. + */ + return (double_colon && chunks < 8) || (!double_colon && chunks == 8); +} + /* Stolen from gnome_uri_list_extract_uris */ GList * purple_uri_list_extract_uris(const gchar *uri_list)