diff options
-rw-r--r-- | source3/lib/cbuf.c | 33 | ||||
-rw-r--r-- | source3/lib/cbuf.h | 17 |
2 files changed, 49 insertions, 1 deletions
diff --git a/source3/lib/cbuf.c b/source3/lib/cbuf.c index 16dd52c292..42353f8f64 100644 --- a/source3/lib/cbuf.c +++ b/source3/lib/cbuf.c @@ -286,3 +286,36 @@ int cbuf_print_quoted_string(cbuf* ost, const char* s) s++; } } + + +int cbuf_print_quoted(cbuf* ost, const char* s, size_t len) +{ + int n = 1; + int ret; + cbuf_reserve(ost, len+2); + + cbuf_putc(ost,'"'); + + while(len--) { + switch (*s) { + case '"': + case '\\': + ret = cbuf_printf(ost, "\\%c", *s); + break; + default: + if (isprint(*s) && ((*s == ' ') || !isspace(*s))) { + ret = cbuf_putc(ost, *s); + } else { + ret = cbuf_printf(ost, "\\%02x", *s); + } + } + s++; + if (ret == -1) { + return -1; + } + n += ret; + } + ret = cbuf_putc(ost,'"'); + + return (ret == -1) ? -1 : (n + ret); +} diff --git a/source3/lib/cbuf.h b/source3/lib/cbuf.h index ffb52d7b9a..90318ec7a9 100644 --- a/source3/lib/cbuf.h +++ b/source3/lib/cbuf.h @@ -225,11 +225,26 @@ char* cbuf_gets(cbuf* b, size_t idx); * @see srprs_quoted_string * * @param[out] ost outstream - * @param[in] s string + * @param[in] s '\0' terminated string of printable characters. * * @return numner of bytes written, -1 on error */ int cbuf_print_quoted_string(cbuf* ost, const char* s); +/** + * Print quoted string to stream. + * Escapes nonprintable characters. + * + * @todo check for ssputc failure + * @see srprs_quoted + * + * @param[out] ost outstream + * @param[in] s string of bytes + * @param[in] len number of bytes + * + * @return numner of bytes written, -1 on error + */ +int cbuf_print_quoted(cbuf* ost, const char* s, size_t len); + #endif /*__CBUF_H*/ |