mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Make split(..., NULL) split on horizontal space; fix bug with tabs in config file.
svn:r3155
This commit is contained in:
parent
a3922d0bdc
commit
bbc10c2ea1
@ -247,7 +247,7 @@ void smartlist_insert(smartlist_t *sl, int idx, void *val)
|
|||||||
* trailing space from each entry. If
|
* trailing space from each entry. If
|
||||||
* <b>flags</b>&SPLIT_IGNORE_BLANK is true, remove any entries of
|
* <b>flags</b>&SPLIT_IGNORE_BLANK is true, remove any entries of
|
||||||
* length 0. If max>0, divide the string into no more than <b>max</b>
|
* 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 smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
|
||||||
int flags, int max)
|
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(sl);
|
||||||
tor_assert(str);
|
tor_assert(str);
|
||||||
tor_assert(sep);
|
|
||||||
|
|
||||||
cp = str;
|
cp = str;
|
||||||
while (1) {
|
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) {
|
if (max>0 && n == max-1) {
|
||||||
end = strchr(cp,'\0');
|
end = strchr(cp,'\0');
|
||||||
} else {
|
} else if (sep) {
|
||||||
end = strstr(cp,sep);
|
end = strstr(cp,sep);
|
||||||
if (!end)
|
if (!end)
|
||||||
end = strchr(cp,'\0');
|
end = strchr(cp,'\0');
|
||||||
|
} else {
|
||||||
|
for (end = cp; *end && *end != '\t' && *end != ' '; ++end)
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!*end) {
|
if (!*end) {
|
||||||
next = NULL;
|
next = NULL;
|
||||||
} else {
|
} else if (sep) {
|
||||||
next = end+strlen(sep);
|
next = end+strlen(sep);
|
||||||
|
} else {
|
||||||
|
next = end+1;
|
||||||
|
while (*next == '\t' || *next == ' ')
|
||||||
|
++next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags&SPLIT_SKIP_SPACE) {
|
if (flags&SPLIT_SKIP_SPACE) {
|
||||||
|
@ -1831,7 +1831,7 @@ config_init_logs(or_options_t *options, int validate_only)
|
|||||||
elts = smartlist_create();
|
elts = smartlist_create();
|
||||||
for (opt = options->Logs; opt; opt = opt->next) {
|
for (opt = options->Logs; opt; opt = opt->next) {
|
||||||
int levelMin=LOG_DEBUG, levelMax=LOG_ERR;
|
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);
|
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3);
|
||||||
if (smartlist_len(elts) == 0) {
|
if (smartlist_len(elts) == 0) {
|
||||||
log_fn(LOG_WARN, "Bad syntax on Log option 'Log %s'", opt->value);
|
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));
|
r = tor_malloc_zero(sizeof(exit_redirect_t));
|
||||||
elements = smartlist_create();
|
elements = smartlist_create();
|
||||||
smartlist_split_string(elements, line->value, " ",
|
smartlist_split_string(elements, line->value, NULL,
|
||||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
|
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
|
||||||
if (smartlist_len(elements) != 2) {
|
if (smartlist_len(elements) != 2) {
|
||||||
log_fn(LOG_WARN, "Wrong number of elements in RedirectExit line");
|
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];
|
char digest[DIGEST_LEN];
|
||||||
|
|
||||||
items = smartlist_create();
|
items = smartlist_create();
|
||||||
smartlist_split_string(items, line, " ",
|
smartlist_split_string(items, line, NULL,
|
||||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
|
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
|
||||||
if (smartlist_len(items) < 2) {
|
if (smartlist_len(items) < 2) {
|
||||||
log_fn(LOG_WARN, "Too few arguments to DirServer line.");
|
log_fn(LOG_WARN, "Too few arguments to DirServer line.");
|
||||||
|
@ -125,7 +125,8 @@ accounting_parse_options(or_options_t *options, int validate_only)
|
|||||||
}
|
}
|
||||||
|
|
||||||
items = smartlist_create();
|
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) {
|
if (smartlist_len(items)<2) {
|
||||||
log_fn(LOG_WARN, "Too few arguments to AccountingStart");
|
log_fn(LOG_WARN, "Too few arguments to AccountingStart");
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -642,6 +642,22 @@ test_util(void) {
|
|||||||
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
|
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
|
||||||
smartlist_clear(sl);
|
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);
|
smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>", SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
|
||||||
test_eq(3, smartlist_len(sl));
|
test_eq(3, smartlist_len(sl));
|
||||||
test_streq("z", smartlist_get(sl, 0));
|
test_streq("z", smartlist_get(sl, 0));
|
||||||
|
Loading…
Reference in New Issue
Block a user