xref: /qemu/qobject/qstring.c (revision 764c1caeb32bae139ce3984cba987e328a66e2ab)
166f70487SLuiz Capitulino /*
266f70487SLuiz Capitulino  * QString data type.
366f70487SLuiz Capitulino  *
466f70487SLuiz Capitulino  * Copyright (C) 2009 Red Hat Inc.
566f70487SLuiz Capitulino  *
666f70487SLuiz Capitulino  * Authors:
766f70487SLuiz Capitulino  *  Luiz Capitulino <lcapitulino@redhat.com>
866f70487SLuiz Capitulino  *
966f70487SLuiz Capitulino  * This work is licensed under the terms of the GNU GPL, version 2.  See
1066f70487SLuiz Capitulino  * the COPYING file in the top-level directory.
1166f70487SLuiz Capitulino  */
1266f70487SLuiz Capitulino #include "qobject.h"
1366f70487SLuiz Capitulino #include "qstring.h"
1466f70487SLuiz Capitulino #include "qemu-common.h"
1566f70487SLuiz Capitulino 
16aa43d9ccSBlue Swirl static void qstring_destroy_obj(QObject *obj);
17aa43d9ccSBlue Swirl 
18aa43d9ccSBlue Swirl static const QType qstring_type = {
19aa43d9ccSBlue Swirl     .code = QTYPE_QSTRING,
20aa43d9ccSBlue Swirl     .destroy = qstring_destroy_obj,
21aa43d9ccSBlue Swirl };
2266f70487SLuiz Capitulino 
2366f70487SLuiz Capitulino /**
24d30ec846SAnthony Liguori  * qstring_new(): Create a new empty QString
25d30ec846SAnthony Liguori  *
26d30ec846SAnthony Liguori  * Return strong reference.
27d30ec846SAnthony Liguori  */
28d30ec846SAnthony Liguori QString *qstring_new(void)
29d30ec846SAnthony Liguori {
30d30ec846SAnthony Liguori     return qstring_from_str("");
31d30ec846SAnthony Liguori }
32d30ec846SAnthony Liguori 
33d30ec846SAnthony Liguori /**
3466f70487SLuiz Capitulino  * qstring_from_str(): Create a new QString from a regular C string
3566f70487SLuiz Capitulino  *
3666f70487SLuiz Capitulino  * Return strong reference.
3766f70487SLuiz Capitulino  */
3866f70487SLuiz Capitulino QString *qstring_from_str(const char *str)
3966f70487SLuiz Capitulino {
4066f70487SLuiz Capitulino     QString *qstring;
4166f70487SLuiz Capitulino 
4266f70487SLuiz Capitulino     qstring = qemu_malloc(sizeof(*qstring));
43d30ec846SAnthony Liguori 
44d30ec846SAnthony Liguori     qstring->length = strlen(str);
45d30ec846SAnthony Liguori     qstring->capacity = qstring->length;
46d30ec846SAnthony Liguori 
47d30ec846SAnthony Liguori     qstring->string = qemu_malloc(qstring->capacity + 1);
48d30ec846SAnthony Liguori     memcpy(qstring->string, str, qstring->length);
49d30ec846SAnthony Liguori     qstring->string[qstring->length] = 0;
50d30ec846SAnthony Liguori 
5166f70487SLuiz Capitulino     QOBJECT_INIT(qstring, &qstring_type);
5266f70487SLuiz Capitulino 
5366f70487SLuiz Capitulino     return qstring;
5466f70487SLuiz Capitulino }
5566f70487SLuiz Capitulino 
566fe9565cSLuiz Capitulino static void capacity_increase(QString *qstring, size_t len)
57d30ec846SAnthony Liguori {
58d30ec846SAnthony Liguori     if (qstring->capacity < (qstring->length + len)) {
59d30ec846SAnthony Liguori         qstring->capacity += len;
60d30ec846SAnthony Liguori         qstring->capacity *= 2; /* use exponential growth */
61d30ec846SAnthony Liguori 
62d30ec846SAnthony Liguori         qstring->string = qemu_realloc(qstring->string, qstring->capacity + 1);
63d30ec846SAnthony Liguori     }
646fe9565cSLuiz Capitulino }
65d30ec846SAnthony Liguori 
666fe9565cSLuiz Capitulino /* qstring_append(): Append a C string to a QString
676fe9565cSLuiz Capitulino  */
686fe9565cSLuiz Capitulino void qstring_append(QString *qstring, const char *str)
696fe9565cSLuiz Capitulino {
706fe9565cSLuiz Capitulino     size_t len = strlen(str);
716fe9565cSLuiz Capitulino 
726fe9565cSLuiz Capitulino     capacity_increase(qstring, len);
73d30ec846SAnthony Liguori     memcpy(qstring->string + qstring->length, str, len);
74d30ec846SAnthony Liguori     qstring->length += len;
75d30ec846SAnthony Liguori     qstring->string[qstring->length] = 0;
76d30ec846SAnthony Liguori }
77d30ec846SAnthony Liguori 
78*764c1caeSLuiz Capitulino void qstring_append_int(QString *qstring, int64_t value)
79*764c1caeSLuiz Capitulino {
80*764c1caeSLuiz Capitulino     char num[32];
81*764c1caeSLuiz Capitulino 
82*764c1caeSLuiz Capitulino     snprintf(num, sizeof(num), "%" PRId64, value);
83*764c1caeSLuiz Capitulino     qstring_append(qstring, num);
84*764c1caeSLuiz Capitulino }
85*764c1caeSLuiz Capitulino 
8666f70487SLuiz Capitulino /**
876fe9565cSLuiz Capitulino  * qstring_append_chr(): Append a C char to a QString
886fe9565cSLuiz Capitulino  */
896fe9565cSLuiz Capitulino void qstring_append_chr(QString *qstring, int c)
906fe9565cSLuiz Capitulino {
916fe9565cSLuiz Capitulino     capacity_increase(qstring, 1);
926fe9565cSLuiz Capitulino     qstring->string[qstring->length++] = c;
936fe9565cSLuiz Capitulino     qstring->string[qstring->length] = 0;
946fe9565cSLuiz Capitulino }
956fe9565cSLuiz Capitulino 
966fe9565cSLuiz Capitulino /**
9766f70487SLuiz Capitulino  * qobject_to_qstring(): Convert a QObject to a QString
9866f70487SLuiz Capitulino  */
9966f70487SLuiz Capitulino QString *qobject_to_qstring(const QObject *obj)
10066f70487SLuiz Capitulino {
10166f70487SLuiz Capitulino     if (qobject_type(obj) != QTYPE_QSTRING)
10266f70487SLuiz Capitulino         return NULL;
10366f70487SLuiz Capitulino 
10466f70487SLuiz Capitulino     return container_of(obj, QString, base);
10566f70487SLuiz Capitulino }
10666f70487SLuiz Capitulino 
10766f70487SLuiz Capitulino /**
10866f70487SLuiz Capitulino  * qstring_get_str(): Return a pointer to the stored string
10966f70487SLuiz Capitulino  *
11066f70487SLuiz Capitulino  * NOTE: Should be used with caution, if the object is deallocated
11166f70487SLuiz Capitulino  * this pointer becomes invalid.
11266f70487SLuiz Capitulino  */
11366f70487SLuiz Capitulino const char *qstring_get_str(const QString *qstring)
11466f70487SLuiz Capitulino {
11566f70487SLuiz Capitulino     return qstring->string;
11666f70487SLuiz Capitulino }
11766f70487SLuiz Capitulino 
11866f70487SLuiz Capitulino /**
11966f70487SLuiz Capitulino  * qstring_destroy_obj(): Free all memory allocated by a QString
12066f70487SLuiz Capitulino  * object
12166f70487SLuiz Capitulino  */
12266f70487SLuiz Capitulino static void qstring_destroy_obj(QObject *obj)
12366f70487SLuiz Capitulino {
12466f70487SLuiz Capitulino     QString *qs;
12566f70487SLuiz Capitulino 
12666f70487SLuiz Capitulino     assert(obj != NULL);
12766f70487SLuiz Capitulino     qs = qobject_to_qstring(obj);
12866f70487SLuiz Capitulino     qemu_free(qs->string);
12966f70487SLuiz Capitulino     qemu_free(qs);
13066f70487SLuiz Capitulino }
131