diff options
Diffstat (limited to 'qobject/qstring.c')
-rw-r--r-- | qobject/qstring.c | 113 |
1 files changed, 17 insertions, 96 deletions
diff --git a/qobject/qstring.c b/qobject/qstring.c index b66a2c35f2..b4613899b9 100644 --- a/qobject/qstring.c +++ b/qobject/qstring.c @@ -12,6 +12,7 @@ #include "qemu/osdep.h" #include "qapi/qmp/qstring.h" +#include "qobject-internal.h" /** * qstring_new(): Create a new empty QString @@ -24,14 +25,6 @@ QString *qstring_new(void) } /** - * qstring_get_length(): Get the length of a QString - */ -size_t qstring_get_length(const QString *qstring) -{ - return qstring->length; -} - -/** * qstring_from_substr(): Create a new QString from a C string substring * * Return string reference @@ -41,18 +34,9 @@ QString *qstring_from_substr(const char *str, size_t start, size_t end) QString *qstring; assert(start <= end); - qstring = g_malloc(sizeof(*qstring)); qobject_init(QOBJECT(qstring), QTYPE_QSTRING); - - qstring->length = end - start; - qstring->capacity = qstring->length; - - assert(qstring->capacity < SIZE_MAX); - qstring->string = g_malloc(qstring->capacity + 1); - memcpy(qstring->string, str + start, qstring->length); - qstring->string[qstring->length] = 0; - + qstring->string = g_strndup(str + start, end - start); return qstring; } @@ -66,47 +50,22 @@ QString *qstring_from_str(const char *str) return qstring_from_substr(str, 0, strlen(str)); } -static void capacity_increase(QString *qstring, size_t len) -{ - if (qstring->capacity < (qstring->length + len)) { - assert(len <= SIZE_MAX - qstring->capacity); - qstring->capacity += len; - assert(qstring->capacity <= SIZE_MAX / 2); - qstring->capacity *= 2; /* use exponential growth */ - - qstring->string = g_realloc(qstring->string, qstring->capacity + 1); - } -} - -/* qstring_append(): Append a C string to a QString +/** + * qstring_from_gstring(): Convert a GString to a QString + * + * Return strong reference. */ -void qstring_append(QString *qstring, const char *str) -{ - size_t len = strlen(str); - - capacity_increase(qstring, len); - memcpy(qstring->string + qstring->length, str, len); - qstring->length += len; - qstring->string[qstring->length] = 0; -} -void qstring_append_int(QString *qstring, int64_t value) +QString *qstring_from_gstring(GString *gstr) { - char num[32]; + QString *qstring; - snprintf(num, sizeof(num), "%" PRId64, value); - qstring_append(qstring, num); + qstring = g_malloc(sizeof(*qstring)); + qobject_init(QOBJECT(qstring), QTYPE_QSTRING); + qstring->string = g_string_free(gstr, false); + return qstring; } -/** - * qstring_append_chr(): Append a C char to a QString - */ -void qstring_append_chr(QString *qstring, int c) -{ - capacity_increase(qstring, 1); - qstring->string[qstring->length++] = c; - qstring->string[qstring->length] = 0; -} /** * qstring_get_str(): Return a pointer to the stored string @@ -120,27 +79,6 @@ const char *qstring_get_str(const QString *qstring) } /** - * qstring_get_try_str(): Return a pointer to the stored string - * - * NOTE: will return NULL if qstring is not provided. - */ -const char *qstring_get_try_str(const QString *qstring) -{ - return qstring ? qstring_get_str(qstring) : NULL; -} - -/** - * qobject_get_try_str(): Return a pointer to the corresponding string - * - * NOTE: the string will only be returned if the object is valid, and - * its type is QString, otherwise NULL is returned. - */ -const char *qobject_get_try_str(const QObject *qstring) -{ - return qstring_get_try_str(qobject_to(QString, qstring)); -} - -/** * qstring_is_equal(): Test whether the two QStrings are equal */ bool qstring_is_equal(const QObject *x, const QObject *y) @@ -150,32 +88,15 @@ bool qstring_is_equal(const QObject *x, const QObject *y) } /** - * 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 * object */ void qstring_destroy_obj(QObject *obj) { + QString *qs; + assert(obj != NULL); - qstring_free(qobject_to(QString, obj), FALSE); + qs = qobject_to(QString, obj); + g_free((char *)qs->string); + g_free(qs); } |