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