[Libvir] PATCH 9/9: Split out virBuffer from xml.c
Daniel P. Berrange
berrange at redhat.com
Mon Jun 18 02:31:46 UTC 2007
And with the patch attached this time...
On Mon, Jun 18, 2007 at 03:30:11AM +0100, Daniel P. Berrange wrote:
> The virBuffer functions are currently held in src/xml.c file. This patch
> splits them out into a self-contained src/buf.c file. In combination with
> the previous patch this will make the move of QEMU code from qemud/ to
> src/ easier, since both dirs have identical buf.c/.h files now.
>
> b/src/buf.c | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> b/src/buf.h | 37 +++++++++
> src/Makefile.am | 1
> src/conf.c | 2
> src/test.c | 1
> src/xen_internal.c | 2
> src/xend_internal.c | 1
> src/xm_internal.c | 1
> src/xml.c | 172 ------------------------------------------
> src/xml.h | 20 ----
> 10 files changed, 254 insertions(+), 193 deletions(-)
>
> Dan.
> --
> |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
> |=- Perl modules: http://search.cpan.org/~danberr/ -=|
> |=- Projects: http://freshmeat.net/~danielpb/ -=|
> |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
>
> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
-------------- next part --------------
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 <veillard at redhat.com>
+ */
+
+#include "libvirt/libvirt.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#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 <veillard at redhat.com>
+ */
+
+#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 <fcntl.h>
#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 <xen/sched.h>
-#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);
More information about the libvir-list
mailing list