[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] Move string-splitting into a separate function



Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/tmp/cvs-serv7065/src/or

Modified Files:
	config.c test.c 
Log Message:
Move string-splitting into a separate function

Index: config.c
===================================================================
RCS file: /home/or/cvsroot/src/or/config.c,v
retrieving revision 1.142
retrieving revision 1.143
diff -u -d -r1.142 -r1.143
--- config.c	17 Aug 2004 11:55:47 -0000	1.142
+++ config.c	17 Aug 2004 21:06:36 -0000	1.143
@@ -128,39 +128,6 @@
   }
 }
 
-/**
- * Given a list of comma-separated entries, each surrounded by optional
- * whitespace, insert copies of the entries (in order) into lst, without
- * their surrounding whitespace.
- */
-static void parse_csv_into_smartlist(smartlist_t *lst, const char *val)
-{
-  const char *cp, *start, *end;
-
-  cp = val;
-  while (1) {
-    while (isspace(*cp))
-      ++cp;
-    start = cp;
-    end = strchr(cp, ',');
-    if (!end)
-      end = strchr(cp, '\0');
-    for (cp=end-1; cp>=start && isspace(*cp); --cp)
-      ;
-    /* Now start points to the first nonspace character of an entry,
-     * end points to the terminator of that entry,
-     * and cp points to the last nonspace character of an entry. */
-    tor_assert(start <= cp);
-    tor_assert(cp <= end);
-    tor_assert(*end == '\0' || *end == ',');
-    tor_assert((!isspace(*start) && !isspace(*cp)) || start==cp);
-    smartlist_add(lst, tor_strndup(start, cp-start+1));
-    if (!*end)
-      break;
-    cp = end+1;
-  }
-}
-
 /** Search the linked list <b>c</b> for any option whose key is <b>key</b>.
  * If such an option is found, interpret it as of type <b>type</b>, and store
  * the result in <b>arg</b>.  If the option is misformatted, log a warning and
@@ -202,7 +169,7 @@
     case CONFIG_TYPE_CSV:
       if(*(smartlist_t**)arg == NULL)
         *(smartlist_t**)arg = smartlist_create();
-      parse_csv_into_smartlist(*(smartlist_t**)arg, c->value);
+      smartlist_split_string(*(smartlist_t**)arg, c->value, ",", 1);
       break;
     case CONFIG_TYPE_LINELIST:
       /* Note: this reverses the order that the lines appear in.  That's

Index: test.c
===================================================================
RCS file: /home/or/cvsroot/src/or/test.c,v
retrieving revision 1.110
retrieving revision 1.111
diff -u -d -r1.110 -r1.111
--- test.c	15 Aug 2004 08:15:12 -0000	1.110
+++ test.c	17 Aug 2004 21:06:36 -0000	1.111
@@ -550,6 +550,40 @@
   test_eq((void*)3,   smartlist_get(sl,3));
   test_eq((void*)4,   smartlist_get(sl,4));
   test_eq((void*)555, smartlist_get(sl,5));
+
+  smartlist_clear(sl);
+  smartlist_split_string(sl, "abc", ":", 0);
+  test_eq(1, smartlist_len(sl));
+  test_streq("abc", smartlist_get(sl, 0));
+  smartlist_split_string(sl, "a::bc::", "::", 0);
+  test_eq(4, smartlist_len(sl));
+  test_streq("a", smartlist_get(sl, 1));
+  test_streq("bc", smartlist_get(sl, 2));
+  test_streq("", smartlist_get(sl, 3));
+  smartlist_split_string(sl, "/def/  /ghijk", "/", 0);
+  test_eq(8, smartlist_len(sl));
+  test_streq("", smartlist_get(sl, 4));
+  test_streq("def", smartlist_get(sl, 5));
+  test_streq("  ", smartlist_get(sl, 6));
+  test_streq("ghijk", smartlist_get(sl, 7));
+  SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
+  smartlist_clear(sl);
+
+  smartlist_split_string(sl, "a,bbd,cdef", ",", 1);
+  test_eq(3, smartlist_len(sl));
+  test_streq("a", smartlist_get(sl,0));
+  test_streq("bbd", smartlist_get(sl,1));
+  test_streq("cdef", smartlist_get(sl,2));
+  smartlist_split_string(sl, " z <> zhasd <>  <> bnud<>   ", "<>", 1);
+  test_eq(8, smartlist_len(sl));
+  test_streq("z", smartlist_get(sl,3));
+  test_streq("zhasd", smartlist_get(sl,4));
+  test_streq("", smartlist_get(sl,5));
+  test_streq("bnud", smartlist_get(sl,6));
+  test_streq("", smartlist_get(sl,7));
+
+  SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
+
   /* XXXX test older functions. */
   smartlist_free(sl);
 }