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