xref: /qemu/qobject/qstring.c (revision 775932020dd6bd7e9c1acc0d7779677d8b4c094c)
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 
13f2ad72b3SPeter Maydell #include "qemu/osdep.h"
147b1b5d19SPaolo Bonzini #include "qapi/qmp/qstring.h"
1566f70487SLuiz Capitulino #include "qemu-common.h"
1666f70487SLuiz Capitulino 
1766f70487SLuiz Capitulino /**
18d30ec846SAnthony Liguori  * qstring_new(): Create a new empty QString
19d30ec846SAnthony Liguori  *
20d30ec846SAnthony Liguori  * Return strong reference.
21d30ec846SAnthony Liguori  */
22d30ec846SAnthony Liguori QString *qstring_new(void)
23d30ec846SAnthony Liguori {
24d30ec846SAnthony Liguori     return qstring_from_str("");
25d30ec846SAnthony Liguori }
26d30ec846SAnthony Liguori 
27d30ec846SAnthony Liguori /**
2854d49ac9SLuiz Capitulino  * qstring_get_length(): Get the length of a QString
2954d49ac9SLuiz Capitulino  */
3054d49ac9SLuiz Capitulino size_t qstring_get_length(const QString *qstring)
3154d49ac9SLuiz Capitulino {
3254d49ac9SLuiz Capitulino     return qstring->length;
3354d49ac9SLuiz Capitulino }
3454d49ac9SLuiz Capitulino 
3554d49ac9SLuiz Capitulino /**
364b5c5766SLuiz Capitulino  * qstring_from_substr(): Create a new QString from a C string substring
374b5c5766SLuiz Capitulino  *
384b5c5766SLuiz Capitulino  * Return string reference
394b5c5766SLuiz Capitulino  */
404b5c5766SLuiz Capitulino QString *qstring_from_substr(const char *str, int start, int end)
414b5c5766SLuiz Capitulino {
424b5c5766SLuiz Capitulino     QString *qstring;
434b5c5766SLuiz Capitulino 
447267c094SAnthony Liguori     qstring = g_malloc(sizeof(*qstring));
4555e1819cSEric Blake     qobject_init(QOBJECT(qstring), QTYPE_QSTRING);
464b5c5766SLuiz Capitulino 
474b5c5766SLuiz Capitulino     qstring->length = end - start + 1;
484b5c5766SLuiz Capitulino     qstring->capacity = qstring->length;
494b5c5766SLuiz Capitulino 
507267c094SAnthony Liguori     qstring->string = g_malloc(qstring->capacity + 1);
514b5c5766SLuiz Capitulino     memcpy(qstring->string, str + start, qstring->length);
524b5c5766SLuiz Capitulino     qstring->string[qstring->length] = 0;
534b5c5766SLuiz Capitulino 
544b5c5766SLuiz Capitulino 
554b5c5766SLuiz Capitulino     return qstring;
564b5c5766SLuiz Capitulino }
574b5c5766SLuiz Capitulino 
584b5c5766SLuiz Capitulino /**
5966f70487SLuiz Capitulino  * qstring_from_str(): Create a new QString from a regular C string
6066f70487SLuiz Capitulino  *
6166f70487SLuiz Capitulino  * Return strong reference.
6266f70487SLuiz Capitulino  */
6366f70487SLuiz Capitulino QString *qstring_from_str(const char *str)
6466f70487SLuiz Capitulino {
654b5c5766SLuiz Capitulino     return qstring_from_substr(str, 0, strlen(str) - 1);
6666f70487SLuiz Capitulino }
6766f70487SLuiz Capitulino 
686fe9565cSLuiz Capitulino static void capacity_increase(QString *qstring, size_t len)
69d30ec846SAnthony Liguori {
70d30ec846SAnthony Liguori     if (qstring->capacity < (qstring->length + len)) {
71d30ec846SAnthony Liguori         qstring->capacity += len;
72d30ec846SAnthony Liguori         qstring->capacity *= 2; /* use exponential growth */
73d30ec846SAnthony Liguori 
747267c094SAnthony Liguori         qstring->string = g_realloc(qstring->string, qstring->capacity + 1);
75d30ec846SAnthony Liguori     }
766fe9565cSLuiz Capitulino }
77d30ec846SAnthony Liguori 
786fe9565cSLuiz Capitulino /* qstring_append(): Append a C string to a QString
796fe9565cSLuiz Capitulino  */
806fe9565cSLuiz Capitulino void qstring_append(QString *qstring, const char *str)
816fe9565cSLuiz Capitulino {
826fe9565cSLuiz Capitulino     size_t len = strlen(str);
836fe9565cSLuiz Capitulino 
846fe9565cSLuiz Capitulino     capacity_increase(qstring, len);
85d30ec846SAnthony Liguori     memcpy(qstring->string + qstring->length, str, len);
86d30ec846SAnthony Liguori     qstring->length += len;
87d30ec846SAnthony Liguori     qstring->string[qstring->length] = 0;
88d30ec846SAnthony Liguori }
89d30ec846SAnthony Liguori 
90764c1caeSLuiz Capitulino void qstring_append_int(QString *qstring, int64_t value)
91764c1caeSLuiz Capitulino {
92764c1caeSLuiz Capitulino     char num[32];
93764c1caeSLuiz Capitulino 
94764c1caeSLuiz Capitulino     snprintf(num, sizeof(num), "%" PRId64, value);
95764c1caeSLuiz Capitulino     qstring_append(qstring, num);
96764c1caeSLuiz Capitulino }
97764c1caeSLuiz Capitulino 
9866f70487SLuiz Capitulino /**
996fe9565cSLuiz Capitulino  * qstring_append_chr(): Append a C char to a QString
1006fe9565cSLuiz Capitulino  */
1016fe9565cSLuiz Capitulino void qstring_append_chr(QString *qstring, int c)
1026fe9565cSLuiz Capitulino {
1036fe9565cSLuiz Capitulino     capacity_increase(qstring, 1);
1046fe9565cSLuiz Capitulino     qstring->string[qstring->length++] = c;
1056fe9565cSLuiz Capitulino     qstring->string[qstring->length] = 0;
1066fe9565cSLuiz Capitulino }
1076fe9565cSLuiz Capitulino 
1086fe9565cSLuiz Capitulino /**
10966f70487SLuiz Capitulino  * qstring_get_str(): Return a pointer to the stored string
11066f70487SLuiz Capitulino  *
11166f70487SLuiz Capitulino  * NOTE: Should be used with caution, if the object is deallocated
11266f70487SLuiz Capitulino  * this pointer becomes invalid.
11366f70487SLuiz Capitulino  */
11466f70487SLuiz Capitulino const char *qstring_get_str(const QString *qstring)
11566f70487SLuiz Capitulino {
11666f70487SLuiz Capitulino     return qstring->string;
11766f70487SLuiz Capitulino }
11866f70487SLuiz Capitulino 
11966f70487SLuiz Capitulino /**
120*77593202SPeter Xu  * qstring_get_try_str(): Return a pointer to the stored string
121*77593202SPeter Xu  *
122*77593202SPeter Xu  * NOTE: will return NULL if qstring is not provided.
123*77593202SPeter Xu  */
124*77593202SPeter Xu const char *qstring_get_try_str(const QString *qstring)
125*77593202SPeter Xu {
126*77593202SPeter Xu     return qstring ? qstring_get_str(qstring) : NULL;
127*77593202SPeter Xu }
128*77593202SPeter Xu 
129*77593202SPeter Xu /**
130b38dd678SMax Reitz  * qstring_is_equal(): Test whether the two QStrings are equal
131b38dd678SMax Reitz  */
132b38dd678SMax Reitz bool qstring_is_equal(const QObject *x, const QObject *y)
133b38dd678SMax Reitz {
1347dc847ebSMax Reitz     return !strcmp(qobject_to(QString, x)->string,
1357dc847ebSMax Reitz                    qobject_to(QString, y)->string);
136b38dd678SMax Reitz }
137b38dd678SMax Reitz 
138b38dd678SMax Reitz /**
13966f70487SLuiz Capitulino  * qstring_destroy_obj(): Free all memory allocated by a QString
14066f70487SLuiz Capitulino  * object
14166f70487SLuiz Capitulino  */
14255e1819cSEric Blake void qstring_destroy_obj(QObject *obj)
14366f70487SLuiz Capitulino {
14466f70487SLuiz Capitulino     QString *qs;
14566f70487SLuiz Capitulino 
14666f70487SLuiz Capitulino     assert(obj != NULL);
1477dc847ebSMax Reitz     qs = qobject_to(QString, obj);
1487267c094SAnthony Liguori     g_free(qs->string);
1497267c094SAnthony Liguori     g_free(qs);
15066f70487SLuiz Capitulino }
151