From 206644aedeb8859801051ac170ec562c6a113a79 Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Tue, 23 Jun 2015 17:00:40 +0000 Subject: util: Allow non-separator coalescing parsing in extract_first_word If EXTRACT_DONT_COALESCE_SEPARATORS is passed, then leading separators, trailing separators and spans of multiple separators aren't skipped, and empty arguments from before, after or between separators may be extracted. --- src/basic/util.c | 28 ++++++++++++++++++++++------ src/basic/util.h | 1 + 2 files changed, 23 insertions(+), 6 deletions(-) (limited to 'src/basic') 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); -- cgit v1.2.3-54-g00ecf