[gmime] cleaned up address route parsing a bit...
- From: Jeffrey Stedfast <fejj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gmime] cleaned up address route parsing a bit...
- Date: Thu, 8 Aug 2013 18:46:05 +0000 (UTC)
commit c6ea1980d339d7dda8c5adb1debba3f0b6a3ddbc
Author: Jeffrey Stedfast <fejj gnome org>
Date: Thu Aug 8 14:45:40 2013 -0400
cleaned up address route parsing a bit...
gmime/internet-address.c | 106 +++++++++++++++++++++++++++-------------------
1 files changed, 63 insertions(+), 43 deletions(-)
---
diff --git a/gmime/internet-address.c b/gmime/internet-address.c
index ad215dc..b55e93f 100644
--- a/gmime/internet-address.c
+++ b/gmime/internet-address.c
@@ -1374,6 +1374,62 @@ decode_group (const char **in)
return addr;
}
+static gboolean
+decode_route (const char **in)
+{
+ const char *start = *in;
+ const char *inptr = *in;
+ GString *route;
+
+ route = g_string_new ("");
+
+ do {
+ inptr++;
+
+ g_string_append_c (route, '@');
+ if (!decode_domain (&inptr, route))
+ goto error;
+
+ decode_lwsp (&inptr);
+ if (*inptr == ',') {
+ g_string_append_c (route, ',');
+ inptr++;
+ decode_lwsp (&inptr);
+
+ /* obs-domain-lists allow commas with nothing between them... */
+ while (*inptr == ',') {
+ inptr++;
+ decode_lwsp (&inptr);
+ }
+ }
+ } while (*inptr == '@');
+
+ g_string_free (route, TRUE);
+ decode_lwsp (&inptr);
+
+ if (*inptr != ':') {
+ w(g_warning ("Invalid route domain-list, missing ':': %.*s", inptr - start, start));
+ goto error;
+ }
+
+ /* eat the ':' */
+ *in = inptr + 1;
+
+ return TRUE;
+
+ error:
+
+ while (*inptr && *inptr != ':' && *inptr != '>')
+ inptr++;
+
+ if (*inptr == ':')
+ inptr++;
+
+ *in = inptr;
+
+ return FALSE;
+}
+
static InternetAddress *
decode_address (const char **in)
{
@@ -1432,47 +1488,11 @@ decode_address (const char **in)
inptr++;
/* check for obsolete routing... */
- if (*inptr == '@') {
- GString *route = g_string_new ("");
-
- do {
- inptr++;
-
- g_string_append_c (route, '@');
- if (!decode_domain (&inptr, route))
- break;
-
- decode_lwsp (&inptr);
- if (*inptr == ',') {
- g_string_append_c (route, ',');
- inptr++;
- decode_lwsp (&inptr);
-
- /* obs-domain-lists allow commas with nothing between them...
*/
- while (*inptr == ',') {
- inptr++;
- decode_lwsp (&inptr);
- }
- }
- } while (*inptr == '@');
-
- if (*inptr != ':') {
- w(g_warning ("Invalid obs-angle-addr, missing ':': %.*s", inptr -
start, start));
-
- while (*inptr && *inptr != '>' && *inptr != ',')
- inptr++;
-
- if (*inptr == '>')
- inptr++;
-
- break;
- }
-
- inptr++;
+ if (*inptr != '@' || decode_route (&inptr)) {
+ /* rfc2822 addr-spec */
+ addr = decode_addrspec (&inptr);
}
- /* rfc2822 addr-spec */
- addr = decode_addrspec (&inptr);
decode_lwsp (&inptr);
if (*inptr != '>') {
w(g_warning ("Invalid rfc2822 angle-addr, missing closing '>': %.*s",
@@ -1483,8 +1503,9 @@ decode_address (const char **in)
if (*inptr == '>')
inptr++;
- } else
+ } else {
inptr++;
+ }
/* if comment is non-NULL, we can check for a comment containing a name */
comment = inptr;
@@ -1597,13 +1618,12 @@ internet_address_list_parse_string (const char *str)
{
InternetAddressList *addrlist;
const char *inptr = str;
+ InternetAddress *addr;
+ const char *start;
addrlist = internet_address_list_new ();
while (inptr && *inptr) {
- InternetAddress *addr;
- const char *start;
-
start = inptr;
if ((addr = decode_address (&inptr))) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]