소스 검색

Make split(..., NULL) split on horizontal space; fix bug with tabs in config file.

svn:r3155
Nick Mathewson 20 년 전
부모
커밋
bbc10c2ea1
4개의 변경된 파일32개의 추가작업 그리고 8개의 파일을 삭제
  1. 11 4
      src/common/container.c
  2. 3 3
      src/or/config.c
  3. 2 1
      src/or/hibernate.c
  4. 16 0
      src/or/test.c

+ 11 - 4
src/common/container.c

@@ -247,7 +247,7 @@ void smartlist_insert(smartlist_t *sl, int idx, void *val)
  * trailing space from each entry.  If
  * <b>flags</b>&amp;SPLIT_IGNORE_BLANK is true, remove any entries of
  * length 0.  If max>0, divide the string into no more than <b>max</b>
- * pieces.
+ * pieces.  If <b>sep</b> is NULL, split on any sequence of horizontal space.
  */
 int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
                            int flags, int max)
@@ -257,7 +257,6 @@ int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
 
   tor_assert(sl);
   tor_assert(str);
-  tor_assert(sep);
 
   cp = str;
   while (1) {
@@ -267,15 +266,23 @@ int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
 
     if (max>0 && n == max-1) {
       end = strchr(cp,'\0');
-    } else {
+    } else if (sep) {
       end = strstr(cp,sep);
       if (!end)
         end = strchr(cp,'\0');
+    } else {
+      for (end = cp; *end && *end != '\t' && *end != ' '; ++end)
+        ;
     }
+
     if (!*end) {
       next = NULL;
-    } else {
+    } else if (sep) {
       next = end+strlen(sep);
+    } else {
+      next = end+1;
+      while (*next == '\t' || *next == ' ')
+        ++next;
     }
 
     if (flags&SPLIT_SKIP_SPACE) {

+ 3 - 3
src/or/config.c

@@ -1831,7 +1831,7 @@ config_init_logs(or_options_t *options, int validate_only)
   elts = smartlist_create();
   for (opt = options->Logs; opt; opt = opt->next) {
     int levelMin=LOG_DEBUG, levelMax=LOG_ERR;
-    smartlist_split_string(elts, opt->value, " ",
+    smartlist_split_string(elts, opt->value, NULL,
                            SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3);
     if (smartlist_len(elts) == 0) {
       log_fn(LOG_WARN, "Bad syntax on Log option 'Log %s'", opt->value);
@@ -2045,7 +2045,7 @@ parse_redirect_line(smartlist_t *result, struct config_line_t *line)
 
   r = tor_malloc_zero(sizeof(exit_redirect_t));
   elements = smartlist_create();
-  smartlist_split_string(elements, line->value, " ",
+  smartlist_split_string(elements, line->value, NULL,
                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
   if (smartlist_len(elements) != 2) {
     log_fn(LOG_WARN, "Wrong number of elements in RedirectExit line");
@@ -2098,7 +2098,7 @@ parse_dir_server_line(const char *line, int validate_only)
   char digest[DIGEST_LEN];
 
   items = smartlist_create();
-  smartlist_split_string(items, line, " ",
+  smartlist_split_string(items, line, NULL,
                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
   if (smartlist_len(items) < 2) {
     log_fn(LOG_WARN, "Too few arguments to DirServer line.");

+ 2 - 1
src/or/hibernate.c

@@ -125,7 +125,8 @@ accounting_parse_options(or_options_t *options, int validate_only)
   }
 
   items = smartlist_create();
-  smartlist_split_string(items, v, " ", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK,0);
+  smartlist_split_string(items, v, NULL,
+                         SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK,0);
   if (smartlist_len(items)<2) {
     log_fn(LOG_WARN, "Too few arguments to AccountingStart");
     goto err;

+ 16 - 0
src/or/test.c

@@ -642,6 +642,22 @@ test_util(void) {
   SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
   smartlist_clear(sl);
 
+  smartlist_split_string(sl, " ab\tc \td ef  ", NULL,
+                         SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
+  test_eq(4, smartlist_len(sl));
+  test_streq("ab", smartlist_get(sl,0));
+  test_streq("c", smartlist_get(sl,1));
+  test_streq("d", smartlist_get(sl,2));
+  test_streq("ef", smartlist_get(sl,3));
+  smartlist_split_string(sl, "ghi\tj", NULL,
+                         SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
+  test_eq(6, smartlist_len(sl));
+  test_streq("ghi", smartlist_get(sl,4));
+  test_streq("j", smartlist_get(sl,5));
+
+  SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
+  smartlist_clear(sl);
+
   smartlist_split_string(sl, " z <> zhasd <>  <> bnud<>   ", "<>", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
   test_eq(3, smartlist_len(sl));
   test_streq("z", smartlist_get(sl, 0));