diff options
author | Peter Maydell | 2021-01-01 15:33:03 +0100 |
---|---|---|
committer | Peter Maydell | 2021-01-01 15:33:03 +0100 |
commit | 1f7c02797fa189ce4b34382020bbce63262a5758 (patch) | |
tree | 467ab5404de2084c44df0f9d97b8524fa210c789 /qobject/qstring.c | |
parent | Merge remote-tracking branch 'remotes/marcel/tags/rdma-pull-request' into sta... (diff) | |
parent | qobject: Make QString immutable (diff) | |
download | qemu-1f7c02797fa189ce4b34382020bbce63262a5758.tar.gz qemu-1f7c02797fa189ce4b34382020bbce63262a5758.tar.xz qemu-1f7c02797fa189ce4b34382020bbce63262a5758.zip |
Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2020-12-19' into staging
QAPI patches patches for 2020-12-19
# gpg: Signature made Sat 19 Dec 2020 09:40:05 GMT
# gpg: using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653
# gpg: issuer "armbru@redhat.com"
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [full]
# gpg: aka "Markus Armbruster <armbru@pond.sub.org>" [full]
# Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653
* remotes/armbru/tags/pull-qapi-2020-12-19: (33 commits)
qobject: Make QString immutable
block: Use GString instead of QString to build filenames
keyval: Use GString to accumulate value strings
json: Use GString instead of QString to accumulate strings
migration: Replace migration's JSON writer by the general one
qobject: Factor JSON writer out of qobject_to_json()
qobject: Factor quoted_str() out of to_json()
qobject: Drop qstring_get_try_str()
qobject: Drop qobject_get_try_str()
Revert "qobject: let object_property_get_str() use new API"
block: Avoid qobject_get_try_str()
qmp: Fix tracing of non-string command IDs
qobject: Move internals to qobject-internal.h
hw/rdma: Replace QList by GQueue
Revert "qstring: add qstring_free()"
qobject: Change qobject_to_json()'s value to GString
qobject: Use GString instead of QString to accumulate JSON
qobject: Make qobject_to_json_pretty() take a pretty argument
monitor: Use GString instead of QString for output buffer
hmp: Simplify how qmp_human_monitor_command() gets output
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
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); } |