summaryrefslogtreecommitdiff
path: root/source3/lib/srprs.c
diff options
context:
space:
mode:
authorGregor Beck <gbeck@sernet.de>2011-03-17 10:22:25 +0100
committerMichael Adam <obnox@samba.org>2011-04-04 15:57:36 +0200
commit8fc8c880074d01af5a2d92fbd9b2fb042bdd59f3 (patch)
treeef9bd3449bcdf7300ea3908d30b9df0e0dd36d7c /source3/lib/srprs.c
parent9272614d9dad501ad95ac76b40f53e433a4878bc (diff)
downloadsamba-8fc8c880074d01af5a2d92fbd9b2fb042bdd59f3.tar.gz
samba-8fc8c880074d01af5a2d92fbd9b2fb042bdd59f3.tar.bz2
samba-8fc8c880074d01af5a2d92fbd9b2fb042bdd59f3.zip
s3: add function srprs_quoted to parse strings written with cbuf_print_quoted
Diffstat (limited to 'source3/lib/srprs.c')
-rw-r--r--source3/lib/srprs.c40
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;
+}