xref: /openbmc/qemu/qobject/qstring.c (revision 7f0278435df1fa845b3bd9556942f89296d4246b)
1a372823aSPaolo Bonzini /*
2a372823aSPaolo Bonzini  * QString Module
3a372823aSPaolo Bonzini  *
4a372823aSPaolo Bonzini  * Copyright (C) 2009 Red Hat Inc.
5a372823aSPaolo Bonzini  *
6a372823aSPaolo Bonzini  * Authors:
7a372823aSPaolo Bonzini  *  Luiz Capitulino <lcapitulino@redhat.com>
8a372823aSPaolo Bonzini  *
9a372823aSPaolo Bonzini  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
10a372823aSPaolo Bonzini  * See the COPYING.LIB file in the top-level directory.
11a372823aSPaolo Bonzini  */
12a372823aSPaolo Bonzini 
13a372823aSPaolo Bonzini #include "qapi/qmp/qobject.h"
14a372823aSPaolo Bonzini #include "qapi/qmp/qstring.h"
15a372823aSPaolo Bonzini #include "qemu-common.h"
16a372823aSPaolo Bonzini 
17a372823aSPaolo Bonzini static void qstring_destroy_obj(QObject *obj);
18a372823aSPaolo Bonzini 
19a372823aSPaolo Bonzini static const QType qstring_type = {
20a372823aSPaolo Bonzini     .code = QTYPE_QSTRING,
21a372823aSPaolo Bonzini     .destroy = qstring_destroy_obj,
22a372823aSPaolo Bonzini };
23a372823aSPaolo Bonzini 
24a372823aSPaolo Bonzini /**
25a372823aSPaolo Bonzini  * qstring_new(): Create a new empty QString
26a372823aSPaolo Bonzini  *
27a372823aSPaolo Bonzini  * Return strong reference.
28a372823aSPaolo Bonzini  */
29a372823aSPaolo Bonzini QString *qstring_new(void)
30a372823aSPaolo Bonzini {
31a372823aSPaolo Bonzini     return qstring_from_str("");
32a372823aSPaolo Bonzini }
33a372823aSPaolo Bonzini 
34a372823aSPaolo Bonzini /**
3554d49ac9SLuiz Capitulino  * qstring_get_length(): Get the length of a QString
3654d49ac9SLuiz Capitulino  */
3754d49ac9SLuiz Capitulino size_t qstring_get_length(const QString *qstring)
3854d49ac9SLuiz Capitulino {
3954d49ac9SLuiz Capitulino     return qstring->length;
4054d49ac9SLuiz Capitulino }
4154d49ac9SLuiz Capitulino 
4254d49ac9SLuiz Capitulino /**
43a372823aSPaolo Bonzini  * qstring_from_substr(): Create a new QString from a C string substring
44a372823aSPaolo Bonzini  *
45a372823aSPaolo Bonzini  * Return string reference
46a372823aSPaolo Bonzini  */
47a372823aSPaolo Bonzini QString *qstring_from_substr(const char *str, int start, int end)
48a372823aSPaolo Bonzini {
49a372823aSPaolo Bonzini     QString *qstring;
50a372823aSPaolo Bonzini 
51a372823aSPaolo Bonzini     qstring = g_malloc(sizeof(*qstring));
52a372823aSPaolo Bonzini 
53a372823aSPaolo Bonzini     qstring->length = end - start + 1;
54a372823aSPaolo Bonzini     qstring->capacity = qstring->length;
55a372823aSPaolo Bonzini 
56a372823aSPaolo Bonzini     qstring->string = g_malloc(qstring->capacity + 1);
57a372823aSPaolo Bonzini     memcpy(qstring->string, str + start, qstring->length);
58a372823aSPaolo Bonzini     qstring->string[qstring->length] = 0;
59a372823aSPaolo Bonzini 
60a372823aSPaolo Bonzini     QOBJECT_INIT(qstring, &qstring_type);
61a372823aSPaolo Bonzini 
62a372823aSPaolo Bonzini     return qstring;
63a372823aSPaolo Bonzini }
64a372823aSPaolo Bonzini 
65a372823aSPaolo Bonzini /**
66a372823aSPaolo Bonzini  * qstring_from_str(): Create a new QString from a regular C string
67a372823aSPaolo Bonzini  *
68a372823aSPaolo Bonzini  * Return strong reference.
69a372823aSPaolo Bonzini  */
70a372823aSPaolo Bonzini QString *qstring_from_str(const char *str)
71a372823aSPaolo Bonzini {
72a372823aSPaolo Bonzini     return qstring_from_substr(str, 0, strlen(str) - 1);
73a372823aSPaolo Bonzini }
74a372823aSPaolo Bonzini 
75a372823aSPaolo Bonzini static void capacity_increase(QString *qstring, size_t len)
76a372823aSPaolo Bonzini {
77a372823aSPaolo Bonzini     if (qstring->capacity < (qstring->length + len)) {
78a372823aSPaolo Bonzini         qstring->capacity += len;
79a372823aSPaolo Bonzini         qstring->capacity *= 2; /* use exponential growth */
80a372823aSPaolo Bonzini 
81a372823aSPaolo Bonzini         qstring->string = g_realloc(qstring->string, qstring->capacity + 1);
82a372823aSPaolo Bonzini     }
83a372823aSPaolo Bonzini }
84a372823aSPaolo Bonzini 
85a372823aSPaolo Bonzini /* qstring_append(): Append a C string to a QString
86a372823aSPaolo Bonzini  */
87a372823aSPaolo Bonzini void qstring_append(QString *qstring, const char *str)
88a372823aSPaolo Bonzini {
89a372823aSPaolo Bonzini     size_t len = strlen(str);
90a372823aSPaolo Bonzini 
91a372823aSPaolo Bonzini     capacity_increase(qstring, len);
92a372823aSPaolo Bonzini     memcpy(qstring->string + qstring->length, str, len);
93a372823aSPaolo Bonzini     qstring->length += len;
94a372823aSPaolo Bonzini     qstring->string[qstring->length] = 0;
95a372823aSPaolo Bonzini }
96a372823aSPaolo Bonzini 
97a372823aSPaolo Bonzini void qstring_append_int(QString *qstring, int64_t value)
98a372823aSPaolo Bonzini {
99a372823aSPaolo Bonzini     char num[32];
100a372823aSPaolo Bonzini 
101a372823aSPaolo Bonzini     snprintf(num, sizeof(num), "%" PRId64, value);
102a372823aSPaolo Bonzini     qstring_append(qstring, num);
103a372823aSPaolo Bonzini }
104a372823aSPaolo Bonzini 
105a372823aSPaolo Bonzini /**
106a372823aSPaolo Bonzini  * qstring_append_chr(): Append a C char to a QString
107a372823aSPaolo Bonzini  */
108a372823aSPaolo Bonzini void qstring_append_chr(QString *qstring, int c)
109a372823aSPaolo Bonzini {
110a372823aSPaolo Bonzini     capacity_increase(qstring, 1);
111a372823aSPaolo Bonzini     qstring->string[qstring->length++] = c;
112a372823aSPaolo Bonzini     qstring->string[qstring->length] = 0;
113a372823aSPaolo Bonzini }
114a372823aSPaolo Bonzini 
115a372823aSPaolo Bonzini /**
116a372823aSPaolo Bonzini  * qobject_to_qstring(): Convert a QObject to a QString
117a372823aSPaolo Bonzini  */
118a372823aSPaolo Bonzini QString *qobject_to_qstring(const QObject *obj)
119a372823aSPaolo Bonzini {
120*7f027843SMarkus Armbruster     if (!obj || qobject_type(obj) != QTYPE_QSTRING) {
121a372823aSPaolo Bonzini         return NULL;
122*7f027843SMarkus Armbruster     }
123a372823aSPaolo Bonzini     return container_of(obj, QString, base);
124a372823aSPaolo Bonzini }
125a372823aSPaolo Bonzini 
126a372823aSPaolo Bonzini /**
127a372823aSPaolo Bonzini  * qstring_get_str(): Return a pointer to the stored string
128a372823aSPaolo Bonzini  *
129a372823aSPaolo Bonzini  * NOTE: Should be used with caution, if the object is deallocated
130a372823aSPaolo Bonzini  * this pointer becomes invalid.
131a372823aSPaolo Bonzini  */
132a372823aSPaolo Bonzini const char *qstring_get_str(const QString *qstring)
133a372823aSPaolo Bonzini {
134a372823aSPaolo Bonzini     return qstring->string;
135a372823aSPaolo Bonzini }
136a372823aSPaolo Bonzini 
137a372823aSPaolo Bonzini /**
138a372823aSPaolo Bonzini  * qstring_destroy_obj(): Free all memory allocated by a QString
139a372823aSPaolo Bonzini  * object
140a372823aSPaolo Bonzini  */
141a372823aSPaolo Bonzini static void qstring_destroy_obj(QObject *obj)
142a372823aSPaolo Bonzini {
143a372823aSPaolo Bonzini     QString *qs;
144a372823aSPaolo Bonzini 
145a372823aSPaolo Bonzini     assert(obj != NULL);
146a372823aSPaolo Bonzini     qs = qobject_to_qstring(obj);
147a372823aSPaolo Bonzini     g_free(qs->string);
148a372823aSPaolo Bonzini     g_free(qs);
149a372823aSPaolo Bonzini }
150