Browse Source

qstring: add qstring_free()

Similar to g_string_free(), optionally return the underlying char*.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20200110153039.1379601-10-marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Marc-André Lureau 5 năm trước cách đây
mục cha
commit
164c374b75
2 tập tin đã thay đổi với 23 bổ sung5 xóa
  1. 1 0
      include/qapi/qmp/qstring.h
  2. 22 5
      qobject/qstring.c

+ 1 - 0
include/qapi/qmp/qstring.h

@@ -33,6 +33,7 @@ void qstring_append_int(QString *qstring, int64_t value);
 void qstring_append(QString *qstring, const char *str);
 void qstring_append(QString *qstring, const char *str);
 void qstring_append_chr(QString *qstring, int c);
 void qstring_append_chr(QString *qstring, int c);
 bool qstring_is_equal(const QObject *x, const QObject *y);
 bool qstring_is_equal(const QObject *x, const QObject *y);
+char *qstring_free(QString *qstring, bool return_str);
 void qstring_destroy_obj(QObject *obj);
 void qstring_destroy_obj(QObject *obj);
 
 
 #endif /* QSTRING_H */
 #endif /* QSTRING_H */

+ 22 - 5
qobject/qstring.c

@@ -149,16 +149,33 @@ bool qstring_is_equal(const QObject *x, const QObject *y)
                    qobject_to(QString, y)->string);
                    qobject_to(QString, y)->string);
 }
 }
 
 
+/**
+ * qstring_free(): Free the memory allocated by a QString object
+ *
+ * Return: if @return_str, return the underlying string, to be
+ * g_free(), otherwise NULL is returned.
+ */
+char *qstring_free(QString *qstring, bool return_str)
+{
+    char *rv = NULL;
+
+    if (return_str) {
+        rv = qstring->string;
+    } else {
+        g_free(qstring->string);
+    }
+
+    g_free(qstring);
+
+    return rv;
+}
+
 /**
 /**
  * qstring_destroy_obj(): Free all memory allocated by a QString
  * qstring_destroy_obj(): Free all memory allocated by a QString
  * object
  * object
  */
  */
 void qstring_destroy_obj(QObject *obj)
 void qstring_destroy_obj(QObject *obj)
 {
 {
-    QString *qs;
-
     assert(obj != NULL);
     assert(obj != NULL);
-    qs = qobject_to(QString, obj);
-    g_free(qs->string);
-    g_free(qs);
+    qstring_free(qobject_to(QString, obj), FALSE);
 }
 }