diff options
author | Filipe Brandenburger <filbranden@google.com> | 2015-11-05 21:57:26 -0800 |
---|---|---|
committer | Filipe Brandenburger <filbranden@google.com> | 2015-11-05 21:57:26 -0800 |
commit | 0247447e96f1385cf0c48e3e6b696214fbe36802 (patch) | |
tree | 5847461a86e67da35f285f103d7d19ee419d4fb0 /src/basic/extract-word.c | |
parent | 27fc921b658adc5baa988c4c213888b016a60b18 (diff) |
extract-word: Skip coalesced separators in place
Just skip them in place, instead of setting separator=true. We only do
that in a single place (while finding a separator outside of quote or
backslash states) so we don't really need a separate state for it.
Tested that no regressions were introduced in test-extract-word. Ran a
full `make check` and also installed the binaries on a test system and
did not see any issues related to parsing unit files or starting units
after a reboot.
Diffstat (limited to 'src/basic/extract-word.c')
-rw-r--r-- | src/basic/extract-word.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/src/basic/extract-word.c b/src/basic/extract-word.c index 67511a32e1..ff6d211ef4 100644 --- a/src/basic/extract-word.c +++ b/src/basic/extract-word.c @@ -34,7 +34,6 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra char quote = 0; /* 0 or ' or " */ bool backslash = false; /* whether we've just seen a backslash */ - bool separator = false; /* whether we've just seen a separator */ assert(p); assert(ret); @@ -140,14 +139,6 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra } } - } else if (separator) { - for (;; (*p) ++, c = **p) { - if (c == 0) - goto finish_force_terminate; - if (!strchr(separators, c)) - goto finish; - } - } else { for (;; (*p) ++, c = **p) { if (c == 0) @@ -163,8 +154,15 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra (*p) ++; goto finish_force_next; } - separator = true; - break; + /* Skip additional coalesced separators. */ + for (;; (*p) ++, c = **p) { + if (c == 0) + goto finish_force_terminate; + if (!strchr(separators, c)) + break; + } + goto finish; + } else { if (!GREEDY_REALLOC(s, allocated, sz+2)) return -ENOMEM; |