enable quoted tokens in the token enumerator
authorTobias Brunner <tobias@strongswan.org>
Wed, 3 Dec 2008 10:03:59 +0000 (10:03 -0000)
committerTobias Brunner <tobias@strongswan.org>
Wed, 3 Dec 2008 10:03:59 +0000 (10:03 -0000)
src/charon/plugins/unit_tester/tests/test_enumerator.c
src/libstrongswan/utils/enumerator.c

index 32d3ff8..6898084 100644 (file)
@@ -231,6 +231,8 @@ bool test_enumerate_token()
                {" abc 1:2 cde;3  4efg5.  ", ":;.,", " 12345"},
                {"abc.cde,efg", ",.", ""},
                {"  abc   cde  efg  ", " ", " "},
+               {"a'abc' c 'cde' cefg", " ", " abcd"},
+               {"'abc' abc 'cde'd 'efg'", " ", " abcd"},
        }, tests2[] = {
                {"a, b, c", ",", " "},
                {"a,b,c", ",", " "},
index ad8f7ad..d4d32fb 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2008 Tobias Brunner
  * Copyright (C) 2007 Martin Willi
  * Hochschule fuer Technik Rapperswil
  *
@@ -215,27 +216,48 @@ static bool enumerate_token_enum(token_enum_t *this, char **token)
                }
        }
        
-       /* find separators */
-       sep = this->sep;
-       while (*sep)
+       switch (*this->pos)
        {
-               tmp = strchr(this->pos, *sep);
-               if (tmp && (pos == NULL || tmp < pos))
+               case '"':
+               case '\'':
                {
-                       pos = tmp;
+                       /* read quoted token */
+                       tmp = strchr(this->pos + 1, *this->pos);
+                       if (tmp)
+                       {
+                               *token = this->pos + 1;
+                               *tmp = '\0';
+                               this->pos = tmp + 1;
+                               return TRUE;
+                       }
+                       /* unterminated string, FALL-THROUGH */
+               }
+               default:
+               {
+                       /* find nearest separator */
+                       sep = this->sep;
+                       while (*sep)
+                       {
+                               tmp = strchr(this->pos, *sep);
+                               if (tmp && (pos == NULL || tmp < pos))
+                               {
+                                       pos = tmp;
+                               }
+                               sep++;
+                       }
+                       *token = this->pos;
+                       if (pos)
+                       {
+                               *pos = '\0';
+                               this->pos = pos + 1;
+                       }
+                       else
+                       {
+                               last = TRUE;
+                               pos = this->pos = strchr(this->pos, '\0');
+                       }
+                       break;
                }
-               sep++;
-       }
-       *token = this->pos;
-       if (pos)
-       {
-               *pos = '\0';
-               this->pos = pos + 1;
-       }
-       else
-       {
-               last = TRUE;
-               pos = this->pos = strchr(this->pos, '\0');
        }
        
        /* trim trailing characters/separators */