summaryrefslogtreecommitdiff
path: root/src/basic
diff options
context:
space:
mode:
Diffstat (limited to 'src/basic')
-rw-r--r--src/basic/util.c28
-rw-r--r--src/basic/util.h1
2 files changed, 23 insertions, 6 deletions
diff --git a/src/basic/util.c b/src/basic/util.c
index d4c385fcef..0b974b2ab5 100644
--- a/src/basic/util.c
+++ b/src/basic/util.c
@@ -5735,10 +5735,20 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra
switch (state) {
case START:
- if (c == 0)
+ if (c == 0) {
+ if (flags & EXTRACT_DONT_COALESCE_SEPARATORS)
+ if (!GREEDY_REALLOC(s, allocated, sz+1))
+ return -ENOMEM;
goto finish_force_terminate;
- else if (strchr(separators, c))
+ } else if (strchr(separators, c)) {
+ if (flags & EXTRACT_DONT_COALESCE_SEPARATORS) {
+ if (!GREEDY_REALLOC(s, allocated, sz+1))
+ return -ENOMEM;
+ (*p) ++;
+ goto finish_force_next;
+ }
break;
+ }
state = VALUE;
/* fallthrough */
@@ -5758,9 +5768,13 @@ int extract_first_word(const char **p, char **ret, const char *separators, Extra
return -ENOMEM;
state = DOUBLE_QUOTE;
- } else if (strchr(separators, c))
+ } else if (strchr(separators, c)) {
+ if (flags & EXTRACT_DONT_COALESCE_SEPARATORS) {
+ (*p) ++;
+ goto finish_force_next;
+ }
state = SEPARATOR;
- else {
+ } else {
if (!GREEDY_REALLOC(s, allocated, sz+2))
return -ENOMEM;
@@ -5857,10 +5871,11 @@ end_escape:
case SEPARATOR:
if (c == 0)
- goto finish;
+ goto finish_force_terminate;
+ if (flags & EXTRACT_DONT_COALESCE_SEPARATORS)
+ goto finish_force_next;
if (!strchr(separators, c))
goto finish;
-
break;
}
@@ -5876,6 +5891,7 @@ finish:
return 0;
}
+finish_force_next:
s[sz] = 0;
*ret = s;
s = NULL;
diff --git a/src/basic/util.h b/src/basic/util.h
index 82fb771e20..4d6a8abb57 100644
--- a/src/basic/util.h
+++ b/src/basic/util.h
@@ -859,6 +859,7 @@ typedef enum ExtractFlags {
EXTRACT_CUNESCAPE = 2,
EXTRACT_CUNESCAPE_RELAX = 4,
EXTRACT_QUOTES = 8,
+ EXTRACT_DONT_COALESCE_SEPARATORS = 16,
} ExtractFlags;
int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags);