Patchwork [03/29] Introduce QString

login
register
mail settings
Submitter Luiz Capitulino
Date Aug. 19, 2009, 11:07 p.m.
Message ID <1250723280-3509-4-git-send-email-lcapitulino@redhat.com>
Download mbox | patch
Permalink /patch/31676/
State Superseded
Headers show

Comments

Luiz Capitulino - Aug. 19, 2009, 11:07 p.m.
QString is a high-level data type that can be used to store C
strings.

The following functions are available:

- qstring_from_str() Create a new QString from a C string
- qstring_get_str()  Return a pointer to the stored string

Note that qstring_get_str() is too low-level for a data type like
this, but it's interesting for quick read-only accesses.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 Makefile  |    2 +-
 qobject.h |    1 +
 qstring.c |   73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 qstring.h |   16 +++++++++++++
 4 files changed, 91 insertions(+), 1 deletions(-)
 create mode 100644 qstring.c
 create mode 100644 qstring.h
Paolo Bonzini - Aug. 20, 2009, 8:41 a.m.
On 08/20/2009 01:07 AM, Luiz Capitulino wrote:
> QString is a high-level data type that can be used to store C
> strings.
>
> The following functions are available:
>
> - qstring_from_str() Create a new QString from a C string
> - qstring_get_str()  Return a pointer to the stored string
>
> Note that qstring_get_str() is too low-level for a data type like
> this, but it's interesting for quick read-only accesses.

Same comments as for qint.h.

Maybe add qstring_dup_str, doing strdup(qstring_get_str(x))?

 > +    qstring = qemu_malloc(sizeof(*qstring));
 > +    qstring->string = qemu_strdup(str);
 > +    QOBJECT_INIT(qstring, &qstring_type);

Since this is immutable, what about allocating the bytes straight after 
the QType_HEAD, without going through an additional indirection?

Another useful thingy could be to cache the length, since you have to 
compute it anyway to allocate the QString.  I'm just shooting around 
ideas, feel free to not implement them if they are not useful in the 
remainder of the series. :-)

Paolo
Luiz Capitulino - Aug. 20, 2009, 2:19 p.m.
On Thu, 20 Aug 2009 10:41:24 +0200
Paolo Bonzini <bonzini@gnu.org> wrote:

> On 08/20/2009 01:07 AM, Luiz Capitulino wrote:
> > QString is a high-level data type that can be used to store C
> > strings.
> >
> > The following functions are available:
> >
> > - qstring_from_str() Create a new QString from a C string
> > - qstring_get_str()  Return a pointer to the stored string
> >
> > Note that qstring_get_str() is too low-level for a data type like
> > this, but it's interesting for quick read-only accesses.
> 
> Same comments as for qint.h.
> 
> Maybe add qstring_dup_str, doing strdup(qstring_get_str(x))?

 This is not needed by current code, I'm avoiding adding code
that won't be used.

Patch

diff --git a/Makefile b/Makefile
index d604302..6100b35 100644
--- a/Makefile
+++ b/Makefile
@@ -90,7 +90,7 @@  obj-y += buffered_file.o migration.o migration-tcp.o net.o qemu-sockets.o
 obj-y += qemu-char.o aio.o net-checksum.o savevm.o
 obj-y += msmouse.o ps2.o
 obj-y += qdev.o qdev-properties.o ssi.o
-obj-y += qint.o
+obj-y += qint.o qstring.o
 
 obj-$(CONFIG_BRLAPI) += baum.o
 obj-$(CONFIG_WIN32) += tap-win32.o
diff --git a/qobject.h b/qobject.h
index 8ff7bfd..61cd4a3 100644
--- a/qobject.h
+++ b/qobject.h
@@ -42,6 +42,7 @@ 
 typedef enum {
     QTYPE_NONE,
     QTYPE_QINT,
+    QTYPE_QSTRING,
 } qtype_code;
 
 struct QObject;
diff --git a/qstring.c b/qstring.c
new file mode 100644
index 0000000..7736209
--- /dev/null
+++ b/qstring.c
@@ -0,0 +1,73 @@ 
+/*
+ * QString data type.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * Authors:
+ *  Luiz Capitulino <lcapitulino@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+#include "qobject.h"
+#include "qstring.h"
+#include "qemu-common.h"
+
+static const QType qstring_type;
+
+/**
+ * qstring_from_str(): Create a new QString from a regular C string
+ *
+ * Return new reference.
+ */
+QString *qstring_from_str(const char *str)
+{
+    QString *qstring;
+
+    qstring = qemu_malloc(sizeof(*qstring));
+    qstring->string = qemu_strdup(str);
+    QOBJECT_INIT(qstring, &qstring_type);
+
+    return qstring;
+}
+
+/**
+ * qobject_to_qstring(): Convert a QObject to a QString
+ */
+QString *qobject_to_qstring(const QObject *obj)
+{
+    if (qobject_type(obj) != QTYPE_QSTRING)
+        return NULL;
+
+    return container_of(obj, QString, base);
+}
+
+/**
+ * qstring_get_str(): Return a pointer to the stored string.
+ *
+ * NOTE: Should be used with caution, if the object is deallocated
+ * this pointer becomes invalid.
+ */
+const char *qstring_get_str(const QString *qstring)
+{
+    return qstring->string;
+}
+
+/**
+ * qstring_destroy_obj(): Free all memory allocated by a QString
+ * object
+ */
+static void qstring_destroy_obj(QObject *obj)
+{
+    QString *qs;
+
+    assert(obj != NULL);
+    qs = qobject_to_qstring(obj);
+    qemu_free(qs->string);
+    qemu_free(qs);
+}
+
+static const QType qstring_type = {
+    .code = QTYPE_QSTRING,
+    .destroy = qstring_destroy_obj,
+};
diff --git a/qstring.h b/qstring.h
new file mode 100644
index 0000000..6e1fcdc
--- /dev/null
+++ b/qstring.h
@@ -0,0 +1,16 @@ 
+#ifndef QSTRING_H
+#define QSTRING_H
+
+#include "qobject.h"
+#include "qemu-common.h"
+
+typedef struct QString {
+    QType_HEAD
+    char *string;
+} QString;
+
+QString *qstring_from_str(const char *str);
+const char *qstring_get_str(const QString *qstring);
+QString *qobject_to_qstring(const QObject *obj);
+
+#endif /* QSTRING_H */