From 9202f2c2204cd66b75ac0f8be15577697f56c0e2 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 8 Jun 2012 13:50:23 -0600 Subject: [PATCH] buf: support peeking at string contents Right now, the only way to get at the contents of a virBuffer is to destroy it. But there are cases in my upcoming patches where peeking at the contents makes life easier. I suppose this does open up the potential for bad code to dereference a stale pointer, by disregarding the docs that the return value is invalid on the next virBuf operation, but such is life. * src/util/buf.h (virBufferCurrentContent): New declaration. * src/util/buf.c (virBufferCurrentContent): Implement it. * src/libvirt_private.syms (buf.h): Export it. * tests/virbuftest.c (testBufAutoIndent): Test it. --- src/libvirt_private.syms | 1 + src/util/buf.c | 22 +++++++++++++++++++++- src/util/buf.h | 1 + tests/virbuftest.c | 8 ++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fdf21866ff..ef8047d75d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -20,6 +20,7 @@ virBufferAddChar; virBufferAdjustIndent; virBufferAsprintf; virBufferContentAndReset; +virBufferCurrentContent; virBufferError; virBufferEscape; virBufferEscapeSexpr; diff --git a/src/util/buf.c b/src/util/buf.c index 630e4c9c2f..6c7c50103c 100644 --- a/src/util/buf.c +++ b/src/util/buf.c @@ -174,13 +174,33 @@ virBufferAddChar(virBufferPtr buf, char c) virBufferAdd(buf, &c, 1); } +/** + * virBufferCurrentContent: + * @buf: Buffer + * + * Get the current content from the buffer. The content is only valid + * until the next operation on @buf, and an empty string is returned if + * no content is present yet. + * + * Returns the buffer content or NULL in case of error. + */ +const char * +virBufferCurrentContent(virBufferPtr buf) +{ + if (!buf || buf->error) + return NULL; + return buf->use ? buf->content : ""; +} + /** * virBufferContentAndReset: * @buf: Buffer * * Get the content from the buffer and free (only) the buffer structure. * The caller owns the returned string & should free it when no longer - * required. The buffer object is reset to its initial state. + * required. The buffer object is reset to its initial state. This + * interface intentionally returns NULL instead of an empty string if + * there is no content. * * Returns the buffer content or NULL in case of error. */ diff --git a/src/util/buf.h b/src/util/buf.h index a8e2eb5fcc..2750b17c1d 100644 --- a/src/util/buf.h +++ b/src/util/buf.h @@ -37,6 +37,7 @@ struct _virBuffer { }; # endif +const char *virBufferCurrentContent(virBufferPtr buf); char *virBufferContentAndReset(virBufferPtr buf); void virBufferFreeAndReset(virBufferPtr buf); int virBufferError(const virBufferPtr buf); diff --git a/tests/virbuftest.c b/tests/virbuftest.c index cd02db12f3..35ba997874 100644 --- a/tests/virbuftest.c +++ b/tests/virbuftest.c @@ -73,6 +73,10 @@ static int testBufAutoIndent(const void *data ATTRIBUTE_UNUSED) ret = -1; } virBufferAdjustIndent(buf, 3); + if (STRNEQ(virBufferCurrentContent(buf), "")) { + TEST_ERROR("Wrong content"); + ret = -1; + } if (virBufferGetIndent(buf, false) != 3 || virBufferGetIndent(buf, true) != 3 || virBufferError(buf)) { @@ -102,6 +106,10 @@ static int testBufAutoIndent(const void *data ATTRIBUTE_UNUSED) } virBufferAdjustIndent(buf, 2); virBufferAddLit(buf, "1"); + if (STRNEQ(virBufferCurrentContent(buf), " 1")) { + TEST_ERROR("Wrong content"); + ret = -1; + } if (virBufferGetIndent(buf, false) != 2 || virBufferGetIndent(buf, true) != 0) { TEST_ERROR("Wrong indentation"); -- GitLab