summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/srprs.c40
-rw-r--r--source3/lib/srprs.h13
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 */