From: Eric Blake Date: Sat, 30 Apr 2011 16:44:42 +0000 (-0600) Subject: buf: add virBufferVasprintf X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=f09acccfd7c39eb81d4ef26edc90396db0c6681d;p=libvirt.git buf: add virBufferVasprintf Match the fact that we have virAsprintf and virVasprintf. * src/util/buf.h (virBufferVasprintf): New prototype. * src/util/buf.c (virBufferAsprintf): Move guts... (virBufferVasprintf): ...to new function. * src/libvirt_private.syms (buf.h): Export it. * bootstrap.conf (gnulib_modules): Add stdarg, for va_copy. --- diff --git a/bootstrap.conf b/bootstrap.conf index fde00da18a..09e82183ff 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -70,6 +70,7 @@ sigaction sigpipe snprintf socket +stdarg stpcpy strchrnul strndup diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fc8edb4d76..00f7e08f9a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -22,6 +22,7 @@ virBitmapString; # buf.h virBufferAdd; virBufferAddChar; +virBufferAsprintf; virBufferContentAndReset; virBufferError; virBufferEscapeSexpr; @@ -30,7 +31,7 @@ virBufferFreeAndReset; virBufferStrcat; virBufferURIEncodeString; virBufferUse; -virBufferAsprintf; +virBufferVasprintf; # caps.h diff --git a/src/util/buf.c b/src/util/buf.c index 7814e8e2f3..750e2770b1 100644 --- a/src/util/buf.c +++ b/src/util/buf.c @@ -1,7 +1,7 @@ /* * buf.c: buffers for libvirt * - * Copyright (C) 2005-2008, 2010 Red Hat, Inc. + * Copyright (C) 2005-2008, 2010-2011 Red Hat, Inc. * * See COPYING.LIB for the License of this software * @@ -223,8 +223,25 @@ virBufferUse(const virBufferPtr buf) void virBufferAsprintf(const virBufferPtr buf, const char *format, ...) { - int size, count, grow_size; va_list argptr; + va_start(argptr, format); + virBufferVasprintf(buf, format, argptr); + va_end(argptr); +} + +/** + * virBufferVasprintf: + * @buf: the buffer to dump + * @format: the format + * @argptr: the variable list of arguments + * + * Do a formatted print to an XML buffer. + */ +void +virBufferVasprintf(const virBufferPtr buf, const char *format, va_list argptr) +{ + int size, count, grow_size; + va_list copy; if ((format == NULL) || (buf == NULL)) return; @@ -236,38 +253,34 @@ virBufferAsprintf(const virBufferPtr buf, const char *format, ...) virBufferGrow(buf, 100) < 0) return; - va_start(argptr, format); + va_copy(copy, argptr); size = buf->size - buf->use; if ((count = vsnprintf(&buf->content[buf->use], - size, format, argptr)) < 0) { + size, format, copy)) < 0) { virBufferSetError(buf); - goto err; + va_end(copy); + return; } + va_end(copy); /* Grow buffer if necessary and retry */ if (count >= size) { buf->content[buf->use] = 0; - va_end(argptr); - va_start(argptr, format); grow_size = (count + 1 > 1000) ? count + 1 : 1000; if (virBufferGrow(buf, grow_size) < 0) { - goto err; + return; } size = buf->size - buf->use; if ((count = vsnprintf(&buf->content[buf->use], size, format, argptr)) < 0) { virBufferSetError(buf); - goto err; + return; } } buf->use += count; - -err: - va_end(argptr); - return; } /** diff --git a/src/util/buf.h b/src/util/buf.h index 00f204354f..06d01baeef 100644 --- a/src/util/buf.h +++ b/src/util/buf.h @@ -1,7 +1,7 @@ /* * buf.h: buffers for libvirt * - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2008, 2011 Red Hat, Inc. * * See COPYING.LIB for the License of this software * @@ -13,6 +13,8 @@ # include "internal.h" +# include + /** * virBuffer: * @@ -42,6 +44,8 @@ void virBufferAdd(const virBufferPtr buf, const char *str, int len); void virBufferAddChar(const virBufferPtr buf, char c); void virBufferAsprintf(const virBufferPtr buf, const char *format, ...) ATTRIBUTE_FMT_PRINTF(2, 3); +void virBufferVasprintf(const virBufferPtr buf, const char *format, va_list ap) + ATTRIBUTE_FMT_PRINTF(2, 0); void virBufferStrcat(const virBufferPtr buf, ...) ATTRIBUTE_SENTINEL; void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str);