diff -r bfa5a9f26203 src/Makefile.am --- a/src/Makefile.am Sun Jun 17 22:11:32 2007 -0400 +++ b/src/Makefile.am Sun Jun 17 22:11:40 2007 -0400 @@ -29,6 +29,7 @@ CLIENT_SOURCES = \ libvirt.c internal.h \ hash.c hash.h \ test.c test.h \ + buf.c buf.h \ xml.c xml.h \ xen_unified.c xen_unified.h \ xen_internal.c xen_internal.h \ diff -r bfa5a9f26203 src/buf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/buf.c Sun Jun 17 22:11:40 2007 -0400 @@ -0,0 +1,210 @@ +/* + * buf.c: buffers for libvirt + * + * Copyright (C) 2005-2007 Red Hat, Inc. + * + * See COPYING.LIB for the License of this software + * + * Daniel Veillard + */ + +#include "libvirt/libvirt.h" + +#include +#include +#include +#include +#include "buf.h" + +/** + * virBufferGrow: + * @buf: the buffer + * @len: the minimum free size to allocate on top of existing used space + * + * Grow the available space of a buffer to at least @len bytes. + * + * Returns the new available space or -1 in case of error + */ +static int +virBufferGrow(virBufferPtr buf, unsigned int len) +{ + int size; + char *newbuf; + + if (buf == NULL) + return (-1); + if (len + buf->use < buf->size) + return (0); + + size = buf->use + len + 1000; + + newbuf = (char *) realloc(buf->content, size); + if (newbuf == NULL) return -1; + buf->content = newbuf; + buf->size = size; + return (buf->size - buf->use); +} + +/** + * virBufferAdd: + * @buf: the buffer to dump + * @str: the string + * @len: the number of bytes to add + * + * Add a string range to an XML buffer. if len == -1, the length of + * str is recomputed to the full string. + * + * Returns 0 successful, -1 in case of internal or API error. + */ +int +virBufferAdd(virBufferPtr buf, const char *str, int len) +{ + unsigned int needSize; + + if ((str == NULL) || (buf == NULL)) { + return -1; + } + if (len == 0) + return 0; + + if (len < 0) + len = strlen(str); + + needSize = buf->use + len + 2; + if (needSize > buf->size) { + if (!virBufferGrow(buf, needSize - buf->use)) { + return (-1); + } + } + /* XXX: memmove() is 2x slower than memcpy(), do we really need it? */ + memmove(&buf->content[buf->use], str, len); + buf->use += len; + buf->content[buf->use] = 0; + return (0); +} + +virBufferPtr +virBufferNew(unsigned int size) +{ + virBufferPtr buf; + + if (!(buf = malloc(sizeof(*buf)))) return NULL; + if (size && (buf->content = malloc(size))==NULL) { + free(buf); + return NULL; + } + buf->size = size; + buf->use = 0; + + return buf; +} + +void +virBufferFree(virBufferPtr buf) +{ + if (buf) { + if (buf->content) + free(buf->content); + free(buf); + } +} + +/** + * virBufferContentAndFree: + * @buf: Buffer + * + * Return the content from the buffer and free (only) the buffer structure. + */ +char * +virBufferContentAndFree (virBufferPtr buf) +{ + char *content = buf->content; + + free (buf); + return content; +} + +/** + * virBufferVSprintf: + * @buf: the buffer to dump + * @format: the format + * @argptr: the variable list of arguments + * + * Do a formatted print to an XML buffer. + * + * Returns 0 successful, -1 in case of internal or API error. + */ +int +virBufferVSprintf(virBufferPtr buf, const char *format, ...) +{ + int size, count; + va_list locarg, argptr; + + if ((format == NULL) || (buf == NULL)) { + return (-1); + } + size = buf->size - buf->use - 1; + va_start(argptr, format); + va_copy(locarg, argptr); + while (((count = vsnprintf(&buf->content[buf->use], size, format, + locarg)) < 0) || (count >= size - 1)) { + buf->content[buf->use] = 0; + va_end(locarg); + if (virBufferGrow(buf, 1000) < 0) { + return (-1); + } + size = buf->size - buf->use - 1; + va_copy(locarg, argptr); + } + va_end(locarg); + buf->use += count; + buf->content[buf->use] = 0; + return (0); +} + +/** + * virBufferStrcat: + * @buf: the buffer to dump + * @argptr: the variable list of strings, the last argument must be NULL + * + * Concatenate strings to an XML buffer. + * + * Returns 0 successful, -1 in case of internal or API error. + */ +int +virBufferStrcat(virBufferPtr buf, ...) +{ + va_list ap; + char *str; + + va_start(ap, buf); + + while ((str = va_arg(ap, char *)) != NULL) { + unsigned int len = strlen(str); + unsigned int needSize = buf->use + len + 2; + + if (needSize > buf->size) { + if (!virBufferGrow(buf, needSize - buf->use)) + return -1; + } + memcpy(&buf->content[buf->use], str, len); + buf->use += len; + buf->content[buf->use] = 0; + } + va_end(ap); + return 0; +} + +/* + * vim: set tabstop=4: + * vim: set shiftwidth=4: + * vim: set expandtab: + */ +/* + * Local variables: + * indent-tabs-mode: nil + * c-indent-level: 4 + * c-basic-offset: 4 + * tab-width: 4 + * End: + */ diff -r bfa5a9f26203 src/buf.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/buf.h Sun Jun 17 22:11:40 2007 -0400 @@ -0,0 +1,37 @@ +/* + * buf.h: buffers for libvirt + * + * Copyright (C) 2005-2007 Red Hat, Inc. + * + * See COPYING.LIB for the License of this software + * + * Daniel Veillard + */ + +#ifndef __VIR_BUFFER_H__ +#define __VIR_BUFFER_H__ + +#include "internal.h" + +/** + * virBuffer: + * + * A buffer structure. + */ +typedef struct _virBuffer virBuffer; +typedef virBuffer *virBufferPtr; +struct _virBuffer { + char *content; /* The buffer content UTF8 */ + unsigned int use; /* The buffer size used */ + unsigned int size; /* The buffer size */ +}; + +virBufferPtr virBufferNew(unsigned int size); +void virBufferFree(virBufferPtr buf); +char *virBufferContentAndFree(virBufferPtr buf); +int virBufferAdd(virBufferPtr buf, const char *str, int len); +int virBufferVSprintf(virBufferPtr buf, const char *format, ...) + ATTRIBUTE_FORMAT(printf, 2, 3); +int virBufferStrcat(virBufferPtr buf, ...); + +#endif /* __VIR_BUFFER_H__ */ diff -r bfa5a9f26203 src/conf.c --- a/src/conf.c Sun Jun 17 22:11:32 2007 -0400 +++ b/src/conf.c Sun Jun 17 22:11:40 2007 -0400 @@ -18,7 +18,7 @@ #include #include "internal.h" -#include "xml.h" +#include "buf.h" #include "conf.h" /************************************************************************ diff -r bfa5a9f26203 src/test.c --- a/src/test.c Sun Jun 17 22:11:32 2007 -0400 +++ b/src/test.c Sun Jun 17 22:11:40 2007 -0400 @@ -35,6 +35,7 @@ #include "internal.h" #include "test.h" #include "xml.h" +#include "buf.h" int testOpen(virConnectPtr conn, const char *name, diff -r bfa5a9f26203 src/xen_internal.c --- a/src/xen_internal.c Sun Jun 17 22:11:32 2007 -0400 +++ b/src/xen_internal.c Sun Jun 17 22:11:40 2007 -0400 @@ -35,7 +35,7 @@ /* required for shutdown flags */ #include -#include "xml.h" +#include "buf.h" /* #define DEBUG */ /* diff -r bfa5a9f26203 src/xend_internal.c --- a/src/xend_internal.c Sun Jun 17 22:11:32 2007 -0400 +++ b/src/xend_internal.c Sun Jun 17 22:11:40 2007 -0400 @@ -35,6 +35,7 @@ #include "internal.h" #include "sexpr.h" #include "xml.h" +#include "buf.h" #include "xen_unified.h" #include "xend_internal.h" #include "xen_internal.h" /* for DOM0_INTERFACE_VERSION */ diff -r bfa5a9f26203 src/xm_internal.c --- a/src/xm_internal.c Sun Jun 17 22:11:32 2007 -0400 +++ b/src/xm_internal.c Sun Jun 17 22:11:40 2007 -0400 @@ -47,6 +47,7 @@ #include "hash.h" #include "internal.h" #include "xml.h" +#include "buf.h" typedef struct xenXMConfCache *xenXMConfCachePtr; typedef struct xenXMConfCache { diff -r bfa5a9f26203 src/xml.c --- a/src/xml.c Sun Jun 17 22:11:32 2007 -0400 +++ b/src/xml.c Sun Jun 17 22:11:40 2007 -0400 @@ -22,6 +22,7 @@ #include "hash.h" #include "sexpr.h" #include "xml.h" +#include "buf.h" #include "xs_internal.h" /* for xenStoreDomainGetNetworkID */ /** @@ -267,177 +268,6 @@ virXPathNodeSet(const char *xpath, xmlXP return(ret); } #endif /* !PROXY */ - -/** - * virBufferGrow: - * @buf: the buffer - * @len: the minimum free size to allocate on top of existing used space - * - * Grow the available space of an XML buffer to at least @len bytes. - * - * Returns the new available space or -1 in case of error - */ -static int -virBufferGrow(virBufferPtr buf, unsigned int len) -{ - int size; - char *newbuf; - - if (buf == NULL) - return (-1); - if (len + buf->use < buf->size) - return (0); - - size = buf->use + len + 1000; - - newbuf = (char *) realloc(buf->content, size); - if (newbuf == NULL) { - virXMLError(NULL, VIR_ERR_NO_MEMORY, _("growing buffer"), size); - return (-1); - } - buf->content = newbuf; - buf->size = size; - return (buf->size - buf->use); -} - -/** - * virBufferAdd: - * @buf: the buffer to dump - * @str: the string - * @len: the number of bytes to add - * - * Add a string range to an XML buffer. if len == -1, the length of - * str is recomputed to the full string. - * - * Returns 0 successful, -1 in case of internal or API error. - */ -int -virBufferAdd(virBufferPtr buf, const char *str, int len) -{ - unsigned int needSize; - - if ((str == NULL) || (buf == NULL)) { - return -1; - } - if (len == 0) - return 0; - - if (len < 0) - len = strlen(str); - - needSize = buf->use + len + 2; - if (needSize > buf->size) { - if (!virBufferGrow(buf, needSize - buf->use)) { - return (-1); - } - } - /* XXX: memmove() is 2x slower than memcpy(), do we really need it? */ - memmove(&buf->content[buf->use], str, len); - buf->use += len; - buf->content[buf->use] = 0; - return (0); -} - -virBufferPtr -virBufferNew(unsigned int size) -{ - virBufferPtr buf; - - if (!(buf = malloc(sizeof(*buf)))) { - virXMLError(NULL, VIR_ERR_NO_MEMORY, _("allocate new buffer"), sizeof(*buf)); - return NULL; - } - if (size && (buf->content = malloc(size))==NULL) { - virXMLError(NULL, VIR_ERR_NO_MEMORY, _("allocate buffer content"), size); - free(buf); - return NULL; - } - buf->size = size; - buf->use = 0; - - return buf; -} - -void -virBufferFree(virBufferPtr buf) -{ - if (buf) { - if (buf->content) - free(buf->content); - free(buf); - } -} - -/** - * virBufferVSprintf: - * @buf: the buffer to dump - * @format: the format - * @argptr: the variable list of arguments - * - * Do a formatted print to an XML buffer. - * - * Returns 0 successful, -1 in case of internal or API error. - */ -int -virBufferVSprintf(virBufferPtr buf, const char *format, ...) -{ - int size, count; - va_list locarg, argptr; - - if ((format == NULL) || (buf == NULL)) { - return (-1); - } - size = buf->size - buf->use - 1; - va_start(argptr, format); - va_copy(locarg, argptr); - while (((count = vsnprintf(&buf->content[buf->use], size, format, - locarg)) < 0) || (count >= size - 1)) { - buf->content[buf->use] = 0; - va_end(locarg); - if (virBufferGrow(buf, 1000) < 0) { - return (-1); - } - size = buf->size - buf->use - 1; - va_copy(locarg, argptr); - } - va_end(locarg); - buf->use += count; - buf->content[buf->use] = 0; - return (0); -} - -/** - * virBufferStrcat: - * @buf: the buffer to dump - * @argptr: the variable list of strings, the last argument must be NULL - * - * Concatenate strings to an XML buffer. - * - * Returns 0 successful, -1 in case of internal or API error. - */ -int -virBufferStrcat(virBufferPtr buf, ...) -{ - va_list ap; - char *str; - - va_start(ap, buf); - - while ((str = va_arg(ap, char *)) != NULL) { - unsigned int len = strlen(str); - unsigned int needSize = buf->use + len + 2; - - if (needSize > buf->size) { - if (!virBufferGrow(buf, needSize - buf->use)) - return -1; - } - memcpy(&buf->content[buf->use], str, len); - buf->use += len; - buf->content[buf->use] = 0; - } - va_end(ap); - return 0; -} #ifndef PROXY diff -r bfa5a9f26203 src/xml.h --- a/src/xml.h Sun Jun 17 22:11:32 2007 -0400 +++ b/src/xml.h Sun Jun 17 22:11:40 2007 -0400 @@ -14,26 +14,6 @@ #ifdef __cplusplus extern "C" { #endif - -/** - * virBuffer: - * - * A buffer structure. - */ -typedef struct _virBuffer virBuffer; -typedef virBuffer *virBufferPtr; -struct _virBuffer { - char *content; /* The buffer content UTF8 */ - unsigned int use; /* The buffer size used */ - unsigned int size; /* The buffer size */ -}; - -virBufferPtr virBufferNew(unsigned int size); -void virBufferFree(virBufferPtr buf); -int virBufferAdd(virBufferPtr buf, const char *str, int len); -int virBufferVSprintf(virBufferPtr buf, const char *format, ...) - ATTRIBUTE_FORMAT(printf, 2, 3); -int virBufferStrcat(virBufferPtr buf, ...); int virXPathBoolean (const char *xpath, xmlXPathContextPtr ctxt);