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