xref: /qemu/qobject/qstring.c (revision 54d49ac99227aff646ac940abfab3417f5cb1693)
166f70487SLuiz Capitulino /*
241836a9fSLuiz Capitulino  * QString Module
366f70487SLuiz Capitulino  *
466f70487SLuiz Capitulino  * Copyright (C) 2009 Red Hat Inc.
566f70487SLuiz Capitulino  *
666f70487SLuiz Capitulino  * Authors:
766f70487SLuiz Capitulino  *  Luiz Capitulino <lcapitulino@redhat.com>
866f70487SLuiz Capitulino  *
941836a9fSLuiz Capitulino  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
1041836a9fSLuiz Capitulino  * See the COPYING.LIB file in the top-level directory.
1166f70487SLuiz Capitulino  */
1241836a9fSLuiz Capitulino 
137b1b5d19SPaolo Bonzini #include "qapi/qmp/qobject.h"
147b1b5d19SPaolo Bonzini #include "qapi/qmp/qstring.h"
1566f70487SLuiz Capitulino #include "qemu-common.h"
1666f70487SLuiz Capitulino 
17aa43d9ccSBlue Swirl static void qstring_destroy_obj(QObject *obj);
18aa43d9ccSBlue Swirl 
19aa43d9ccSBlue Swirl static const QType qstring_type = {
20aa43d9ccSBlue Swirl     .code = QTYPE_QSTRING,
21aa43d9ccSBlue Swirl     .destroy = qstring_destroy_obj,
22aa43d9ccSBlue Swirl };
2366f70487SLuiz Capitulino 
2466f70487SLuiz Capitulino /**
25d30ec846SAnthony Liguori  * qstring_new(): Create a new empty QString
26d30ec846SAnthony Liguori  *
27d30ec846SAnthony Liguori  * Return strong reference.
28d30ec846SAnthony Liguori  */
29d30ec846SAnthony Liguori QString *qstring_new(void)
30d30ec846SAnthony Liguori {
31d30ec846SAnthony Liguori     return qstring_from_str("");
32d30ec846SAnthony Liguori }
33d30ec846SAnthony Liguori 
34d30ec846SAnthony Liguori /**
35*54d49ac9SLuiz Capitulino  * qstring_get_length(): Get the length of a QString
36*54d49ac9SLuiz Capitulino  */
37*54d49ac9SLuiz Capitulino size_t qstring_get_length(const QString *qstring)
38*54d49ac9SLuiz Capitulino {
39*54d49ac9SLuiz Capitulino     return qstring->length;
40*54d49ac9SLuiz Capitulino }
41*54d49ac9SLuiz Capitulino 
42*54d49ac9SLuiz Capitulino /**
434b5c5766SLuiz Capitulino  * qstring_from_substr(): Create a new QString from a C string substring
444b5c5766SLuiz Capitulino  *
454b5c5766SLuiz Capitulino  * Return string reference
464b5c5766SLuiz Capitulino  */
474b5c5766SLuiz Capitulino QString *qstring_from_substr(const char *str, int start, int end)
484b5c5766SLuiz Capitulino {
494b5c5766SLuiz Capitulino     QString *qstring;
504b5c5766SLuiz Capitulino 
517267c094SAnthony Liguori     qstring = g_malloc(sizeof(*qstring));
524b5c5766SLuiz Capitulino 
534b5c5766SLuiz Capitulino     qstring->length = end - start + 1;
544b5c5766SLuiz Capitulino     qstring->capacity = qstring->length;
554b5c5766SLuiz Capitulino 
567267c094SAnthony Liguori     qstring->string = g_malloc(qstring->capacity + 1);
574b5c5766SLuiz Capitulino     memcpy(qstring->string, str + start, qstring->length);
584b5c5766SLuiz Capitulino     qstring->string[qstring->length] = 0;
594b5c5766SLuiz Capitulino 
604b5c5766SLuiz Capitulino     QOBJECT_INIT(qstring, &qstring_type);
614b5c5766SLuiz Capitulino 
624b5c5766SLuiz Capitulino     return qstring;
634b5c5766SLuiz Capitulino }
644b5c5766SLuiz Capitulino 
654b5c5766SLuiz Capitulino /**
6666f70487SLuiz Capitulino  * qstring_from_str(): Create a new QString from a regular C string
6766f70487SLuiz Capitulino  *
6866f70487SLuiz Capitulino  * Return strong reference.
6966f70487SLuiz Capitulino  */
7066f70487SLuiz Capitulino QString *qstring_from_str(const char *str)
7166f70487SLuiz Capitulino {
724b5c5766SLuiz Capitulino     return qstring_from_substr(str, 0, strlen(str) - 1);
7366f70487SLuiz Capitulino }
7466f70487SLuiz Capitulino 
756fe9565cSLuiz Capitulino static void capacity_increase(QString *qstring, size_t len)
76d30ec846SAnthony Liguori {
77d30ec846SAnthony Liguori     if (qstring->capacity < (qstring->length + len)) {
78d30ec846SAnthony Liguori         qstring->capacity += len;
79d30ec846SAnthony Liguori         qstring->capacity *= 2; /* use exponential growth */
80d30ec846SAnthony Liguori 
817267c094SAnthony Liguori         qstring->string = g_realloc(qstring->string, qstring->capacity + 1);
82d30ec846SAnthony Liguori     }
836fe9565cSLuiz Capitulino }
84d30ec846SAnthony Liguori 
856fe9565cSLuiz Capitulino /* qstring_append(): Append a C string to a QString
866fe9565cSLuiz Capitulino  */
876fe9565cSLuiz Capitulino void qstring_append(QString *qstring, const char *str)
886fe9565cSLuiz Capitulino {
896fe9565cSLuiz Capitulino     size_t len = strlen(str);
906fe9565cSLuiz Capitulino 
916fe9565cSLuiz Capitulino     capacity_increase(qstring, len);
92d30ec846SAnthony Liguori     memcpy(qstring->string + qstring->length, str, len);
93d30ec846SAnthony Liguori     qstring->length += len;
94d30ec846SAnthony Liguori     qstring->string[qstring->length] = 0;
95d30ec846SAnthony Liguori }
96d30ec846SAnthony Liguori 
97764c1caeSLuiz Capitulino void qstring_append_int(QString *qstring, int64_t value)
98764c1caeSLuiz Capitulino {
99764c1caeSLuiz Capitulino     char num[32];
100764c1caeSLuiz Capitulino 
101764c1caeSLuiz Capitulino     snprintf(num, sizeof(num), "%" PRId64, value);
102764c1caeSLuiz Capitulino     qstring_append(qstring, num);
103764c1caeSLuiz Capitulino }
104764c1caeSLuiz Capitulino 
10566f70487SLuiz Capitulino /**
1066fe9565cSLuiz Capitulino  * qstring_append_chr(): Append a C char to a QString
1076fe9565cSLuiz Capitulino  */
1086fe9565cSLuiz Capitulino void qstring_append_chr(QString *qstring, int c)
1096fe9565cSLuiz Capitulino {
1106fe9565cSLuiz Capitulino     capacity_increase(qstring, 1);
1116fe9565cSLuiz Capitulino     qstring->string[qstring->length++] = c;
1126fe9565cSLuiz Capitulino     qstring->string[qstring->length] = 0;
1136fe9565cSLuiz Capitulino }
1146fe9565cSLuiz Capitulino 
1156fe9565cSLuiz Capitulino /**
11666f70487SLuiz Capitulino  * qobject_to_qstring(): Convert a QObject to a QString
11766f70487SLuiz Capitulino  */
11866f70487SLuiz Capitulino QString *qobject_to_qstring(const QObject *obj)
11966f70487SLuiz Capitulino {
12066f70487SLuiz Capitulino     if (qobject_type(obj) != QTYPE_QSTRING)
12166f70487SLuiz Capitulino         return NULL;
12266f70487SLuiz Capitulino 
12366f70487SLuiz Capitulino     return container_of(obj, QString, base);
12466f70487SLuiz Capitulino }
12566f70487SLuiz Capitulino 
12666f70487SLuiz Capitulino /**
12766f70487SLuiz Capitulino  * qstring_get_str(): Return a pointer to the stored string
12866f70487SLuiz Capitulino  *
12966f70487SLuiz Capitulino  * NOTE: Should be used with caution, if the object is deallocated
13066f70487SLuiz Capitulino  * this pointer becomes invalid.
13166f70487SLuiz Capitulino  */
13266f70487SLuiz Capitulino const char *qstring_get_str(const QString *qstring)
13366f70487SLuiz Capitulino {
13466f70487SLuiz Capitulino     return qstring->string;
13566f70487SLuiz Capitulino }
13666f70487SLuiz Capitulino 
13766f70487SLuiz Capitulino /**
13866f70487SLuiz Capitulino  * qstring_destroy_obj(): Free all memory allocated by a QString
13966f70487SLuiz Capitulino  * object
14066f70487SLuiz Capitulino  */
14166f70487SLuiz Capitulino static void qstring_destroy_obj(QObject *obj)
14266f70487SLuiz Capitulino {
14366f70487SLuiz Capitulino     QString *qs;
14466f70487SLuiz Capitulino 
14566f70487SLuiz Capitulino     assert(obj != NULL);
14666f70487SLuiz Capitulino     qs = qobject_to_qstring(obj);
1477267c094SAnthony Liguori     g_free(qs->string);
1487267c094SAnthony Liguori     g_free(qs);
14966f70487SLuiz Capitulino }
150