diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/lib/srprs.c | 40 | ||||
-rw-r--r-- | source3/lib/srprs.h | 13 |
2 files changed, 52 insertions, 1 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; +} diff --git a/source3/lib/srprs.h b/source3/lib/srprs.h index bbbcdc776a..350e08c2c1 100644 --- a/source3/lib/srprs.h +++ b/source3/lib/srprs.h @@ -113,9 +113,10 @@ bool srprs_charsetinv(const char** ptr, const char* set, struct cbuf* oss); * assert(*cont == false); * assert(strcmp(cbuf_gets(out, 0), "start...continued...end")==0); * @endcode + * @see cbuf_print_quoted_string * * @param[in,out] ptr parse position - * @param[out] str output buffer where to put the match, may be NULL + * @param[out] str output buffer where to put the match * @param[in,out] cont * * @return true if matched @@ -177,5 +178,15 @@ bool srprs_eol(const char** ptr, struct cbuf* nl); */ bool srprs_line(const char** ptr, struct cbuf* str); +/** + * Match a quoted string with escaped characters. + * @see cbuf_print_quoted + * + * @param[in,out] ptr parse position + * @param[out] str output buffer where to put the match + * + * @return true if matched + */ +bool srprs_quoted(const char** ptr, struct cbuf* str); #endif /* __SRPRS_H */ |