diff options
Diffstat (limited to 'source3/lib/srprs.c')
-rw-r--r-- | source3/lib/srprs.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/source3/lib/srprs.c b/source3/lib/srprs.c index 77464f5f3a..5a032d27b6 100644 --- a/source3/lib/srprs.c +++ b/source3/lib/srprs.c @@ -183,3 +183,43 @@ bool srprs_line(const char** ptr, cbuf* str) ; return true; } + +bool srprs_quoted(const char** ptr, cbuf* str) +{ + const char* pos = *ptr; + const size_t spos = cbuf_getpos(str); + + if (!srprs_char(&pos, '"')) { + goto fail; + } + + while (true) { + while (srprs_charsetinv(&pos, "\\\"", str)) + ; + + switch (*pos) { + case '\0': + goto fail; + case '"': + *ptr = pos+1; + return true; + + case '\\': + pos++; + if (!srprs_charset(&pos, "\\\"", str)) { + unsigned u; + if (!srprs_hex(&pos, 2, &u)) { + goto fail; + } + cbuf_putc(str, u); + } + break; + default: + assert(false); + } + } + +fail: + cbuf_setpos(str, spos); + return false; +} |