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 13*f2ad72b3SPeter Maydell #include "qemu/osdep.h" 147b1b5d19SPaolo Bonzini #include "qapi/qmp/qobject.h" 157b1b5d19SPaolo Bonzini #include "qapi/qmp/qstring.h" 1666f70487SLuiz Capitulino #include "qemu-common.h" 1766f70487SLuiz Capitulino 1866f70487SLuiz Capitulino /** 19d30ec846SAnthony Liguori * qstring_new(): Create a new empty QString 20d30ec846SAnthony Liguori * 21d30ec846SAnthony Liguori * Return strong reference. 22d30ec846SAnthony Liguori */ 23d30ec846SAnthony Liguori QString *qstring_new(void) 24d30ec846SAnthony Liguori { 25d30ec846SAnthony Liguori return qstring_from_str(""); 26d30ec846SAnthony Liguori } 27d30ec846SAnthony Liguori 28d30ec846SAnthony Liguori /** 2954d49ac9SLuiz Capitulino * qstring_get_length(): Get the length of a QString 3054d49ac9SLuiz Capitulino */ 3154d49ac9SLuiz Capitulino size_t qstring_get_length(const QString *qstring) 3254d49ac9SLuiz Capitulino { 3354d49ac9SLuiz Capitulino return qstring->length; 3454d49ac9SLuiz Capitulino } 3554d49ac9SLuiz Capitulino 3654d49ac9SLuiz Capitulino /** 374b5c5766SLuiz Capitulino * qstring_from_substr(): Create a new QString from a C string substring 384b5c5766SLuiz Capitulino * 394b5c5766SLuiz Capitulino * Return string reference 404b5c5766SLuiz Capitulino */ 414b5c5766SLuiz Capitulino QString *qstring_from_substr(const char *str, int start, int end) 424b5c5766SLuiz Capitulino { 434b5c5766SLuiz Capitulino QString *qstring; 444b5c5766SLuiz Capitulino 457267c094SAnthony Liguori qstring = g_malloc(sizeof(*qstring)); 4655e1819cSEric Blake qobject_init(QOBJECT(qstring), QTYPE_QSTRING); 474b5c5766SLuiz Capitulino 484b5c5766SLuiz Capitulino qstring->length = end - start + 1; 494b5c5766SLuiz Capitulino qstring->capacity = qstring->length; 504b5c5766SLuiz Capitulino 517267c094SAnthony Liguori qstring->string = g_malloc(qstring->capacity + 1); 524b5c5766SLuiz Capitulino memcpy(qstring->string, str + start, qstring->length); 534b5c5766SLuiz Capitulino qstring->string[qstring->length] = 0; 544b5c5766SLuiz Capitulino 554b5c5766SLuiz Capitulino 564b5c5766SLuiz Capitulino return qstring; 574b5c5766SLuiz Capitulino } 584b5c5766SLuiz Capitulino 594b5c5766SLuiz Capitulino /** 6066f70487SLuiz Capitulino * qstring_from_str(): Create a new QString from a regular C string 6166f70487SLuiz Capitulino * 6266f70487SLuiz Capitulino * Return strong reference. 6366f70487SLuiz Capitulino */ 6466f70487SLuiz Capitulino QString *qstring_from_str(const char *str) 6566f70487SLuiz Capitulino { 664b5c5766SLuiz Capitulino return qstring_from_substr(str, 0, strlen(str) - 1); 6766f70487SLuiz Capitulino } 6866f70487SLuiz Capitulino 696fe9565cSLuiz Capitulino static void capacity_increase(QString *qstring, size_t len) 70d30ec846SAnthony Liguori { 71d30ec846SAnthony Liguori if (qstring->capacity < (qstring->length + len)) { 72d30ec846SAnthony Liguori qstring->capacity += len; 73d30ec846SAnthony Liguori qstring->capacity *= 2; /* use exponential growth */ 74d30ec846SAnthony Liguori 757267c094SAnthony Liguori qstring->string = g_realloc(qstring->string, qstring->capacity + 1); 76d30ec846SAnthony Liguori } 776fe9565cSLuiz Capitulino } 78d30ec846SAnthony Liguori 796fe9565cSLuiz Capitulino /* qstring_append(): Append a C string to a QString 806fe9565cSLuiz Capitulino */ 816fe9565cSLuiz Capitulino void qstring_append(QString *qstring, const char *str) 826fe9565cSLuiz Capitulino { 836fe9565cSLuiz Capitulino size_t len = strlen(str); 846fe9565cSLuiz Capitulino 856fe9565cSLuiz Capitulino capacity_increase(qstring, len); 86d30ec846SAnthony Liguori memcpy(qstring->string + qstring->length, str, len); 87d30ec846SAnthony Liguori qstring->length += len; 88d30ec846SAnthony Liguori qstring->string[qstring->length] = 0; 89d30ec846SAnthony Liguori } 90d30ec846SAnthony Liguori 91764c1caeSLuiz Capitulino void qstring_append_int(QString *qstring, int64_t value) 92764c1caeSLuiz Capitulino { 93764c1caeSLuiz Capitulino char num[32]; 94764c1caeSLuiz Capitulino 95764c1caeSLuiz Capitulino snprintf(num, sizeof(num), "%" PRId64, value); 96764c1caeSLuiz Capitulino qstring_append(qstring, num); 97764c1caeSLuiz Capitulino } 98764c1caeSLuiz Capitulino 9966f70487SLuiz Capitulino /** 1006fe9565cSLuiz Capitulino * qstring_append_chr(): Append a C char to a QString 1016fe9565cSLuiz Capitulino */ 1026fe9565cSLuiz Capitulino void qstring_append_chr(QString *qstring, int c) 1036fe9565cSLuiz Capitulino { 1046fe9565cSLuiz Capitulino capacity_increase(qstring, 1); 1056fe9565cSLuiz Capitulino qstring->string[qstring->length++] = c; 1066fe9565cSLuiz Capitulino qstring->string[qstring->length] = 0; 1076fe9565cSLuiz Capitulino } 1086fe9565cSLuiz Capitulino 1096fe9565cSLuiz Capitulino /** 11066f70487SLuiz Capitulino * qobject_to_qstring(): Convert a QObject to a QString 11166f70487SLuiz Capitulino */ 11266f70487SLuiz Capitulino QString *qobject_to_qstring(const QObject *obj) 11366f70487SLuiz Capitulino { 1147f027843SMarkus Armbruster if (!obj || qobject_type(obj) != QTYPE_QSTRING) { 11566f70487SLuiz Capitulino return NULL; 1167f027843SMarkus Armbruster } 11766f70487SLuiz Capitulino return container_of(obj, QString, base); 11866f70487SLuiz Capitulino } 11966f70487SLuiz Capitulino 12066f70487SLuiz Capitulino /** 12166f70487SLuiz Capitulino * qstring_get_str(): Return a pointer to the stored string 12266f70487SLuiz Capitulino * 12366f70487SLuiz Capitulino * NOTE: Should be used with caution, if the object is deallocated 12466f70487SLuiz Capitulino * this pointer becomes invalid. 12566f70487SLuiz Capitulino */ 12666f70487SLuiz Capitulino const char *qstring_get_str(const QString *qstring) 12766f70487SLuiz Capitulino { 12866f70487SLuiz Capitulino return qstring->string; 12966f70487SLuiz Capitulino } 13066f70487SLuiz Capitulino 13166f70487SLuiz Capitulino /** 13266f70487SLuiz Capitulino * qstring_destroy_obj(): Free all memory allocated by a QString 13366f70487SLuiz Capitulino * object 13466f70487SLuiz Capitulino */ 13555e1819cSEric Blake void qstring_destroy_obj(QObject *obj) 13666f70487SLuiz Capitulino { 13766f70487SLuiz Capitulino QString *qs; 13866f70487SLuiz Capitulino 13966f70487SLuiz Capitulino assert(obj != NULL); 14066f70487SLuiz Capitulino qs = qobject_to_qstring(obj); 1417267c094SAnthony Liguori g_free(qs->string); 1427267c094SAnthony Liguori g_free(qs); 14366f70487SLuiz Capitulino } 144