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 13f2ad72b3SPeter Maydell #include "qemu/osdep.h" 147b1b5d19SPaolo Bonzini #include "qapi/qmp/qstring.h" 1566f70487SLuiz Capitulino #include "qemu-common.h" 1666f70487SLuiz Capitulino 1766f70487SLuiz Capitulino /** 18d30ec846SAnthony Liguori * qstring_new(): Create a new empty QString 19d30ec846SAnthony Liguori * 20d30ec846SAnthony Liguori * Return strong reference. 21d30ec846SAnthony Liguori */ 22d30ec846SAnthony Liguori QString *qstring_new(void) 23d30ec846SAnthony Liguori { 24d30ec846SAnthony Liguori return qstring_from_str(""); 25d30ec846SAnthony Liguori } 26d30ec846SAnthony Liguori 27d30ec846SAnthony Liguori /** 2854d49ac9SLuiz Capitulino * qstring_get_length(): Get the length of a QString 2954d49ac9SLuiz Capitulino */ 3054d49ac9SLuiz Capitulino size_t qstring_get_length(const QString *qstring) 3154d49ac9SLuiz Capitulino { 3254d49ac9SLuiz Capitulino return qstring->length; 3354d49ac9SLuiz Capitulino } 3454d49ac9SLuiz Capitulino 3554d49ac9SLuiz Capitulino /** 364b5c5766SLuiz Capitulino * qstring_from_substr(): Create a new QString from a C string substring 374b5c5766SLuiz Capitulino * 384b5c5766SLuiz Capitulino * Return string reference 394b5c5766SLuiz Capitulino */ 404b5c5766SLuiz Capitulino QString *qstring_from_substr(const char *str, int start, int end) 414b5c5766SLuiz Capitulino { 424b5c5766SLuiz Capitulino QString *qstring; 434b5c5766SLuiz Capitulino 447267c094SAnthony Liguori qstring = g_malloc(sizeof(*qstring)); 4555e1819cSEric Blake qobject_init(QOBJECT(qstring), QTYPE_QSTRING); 464b5c5766SLuiz Capitulino 474b5c5766SLuiz Capitulino qstring->length = end - start + 1; 484b5c5766SLuiz Capitulino qstring->capacity = qstring->length; 494b5c5766SLuiz Capitulino 507267c094SAnthony Liguori qstring->string = g_malloc(qstring->capacity + 1); 514b5c5766SLuiz Capitulino memcpy(qstring->string, str + start, qstring->length); 524b5c5766SLuiz Capitulino qstring->string[qstring->length] = 0; 534b5c5766SLuiz Capitulino 544b5c5766SLuiz Capitulino 554b5c5766SLuiz Capitulino return qstring; 564b5c5766SLuiz Capitulino } 574b5c5766SLuiz Capitulino 584b5c5766SLuiz Capitulino /** 5966f70487SLuiz Capitulino * qstring_from_str(): Create a new QString from a regular C string 6066f70487SLuiz Capitulino * 6166f70487SLuiz Capitulino * Return strong reference. 6266f70487SLuiz Capitulino */ 6366f70487SLuiz Capitulino QString *qstring_from_str(const char *str) 6466f70487SLuiz Capitulino { 654b5c5766SLuiz Capitulino return qstring_from_substr(str, 0, strlen(str) - 1); 6666f70487SLuiz Capitulino } 6766f70487SLuiz Capitulino 686fe9565cSLuiz Capitulino static void capacity_increase(QString *qstring, size_t len) 69d30ec846SAnthony Liguori { 70d30ec846SAnthony Liguori if (qstring->capacity < (qstring->length + len)) { 71d30ec846SAnthony Liguori qstring->capacity += len; 72d30ec846SAnthony Liguori qstring->capacity *= 2; /* use exponential growth */ 73d30ec846SAnthony Liguori 747267c094SAnthony Liguori qstring->string = g_realloc(qstring->string, qstring->capacity + 1); 75d30ec846SAnthony Liguori } 766fe9565cSLuiz Capitulino } 77d30ec846SAnthony Liguori 786fe9565cSLuiz Capitulino /* qstring_append(): Append a C string to a QString 796fe9565cSLuiz Capitulino */ 806fe9565cSLuiz Capitulino void qstring_append(QString *qstring, const char *str) 816fe9565cSLuiz Capitulino { 826fe9565cSLuiz Capitulino size_t len = strlen(str); 836fe9565cSLuiz Capitulino 846fe9565cSLuiz Capitulino capacity_increase(qstring, len); 85d30ec846SAnthony Liguori memcpy(qstring->string + qstring->length, str, len); 86d30ec846SAnthony Liguori qstring->length += len; 87d30ec846SAnthony Liguori qstring->string[qstring->length] = 0; 88d30ec846SAnthony Liguori } 89d30ec846SAnthony Liguori 90764c1caeSLuiz Capitulino void qstring_append_int(QString *qstring, int64_t value) 91764c1caeSLuiz Capitulino { 92764c1caeSLuiz Capitulino char num[32]; 93764c1caeSLuiz Capitulino 94764c1caeSLuiz Capitulino snprintf(num, sizeof(num), "%" PRId64, value); 95764c1caeSLuiz Capitulino qstring_append(qstring, num); 96764c1caeSLuiz Capitulino } 97764c1caeSLuiz Capitulino 9866f70487SLuiz Capitulino /** 996fe9565cSLuiz Capitulino * qstring_append_chr(): Append a C char to a QString 1006fe9565cSLuiz Capitulino */ 1016fe9565cSLuiz Capitulino void qstring_append_chr(QString *qstring, int c) 1026fe9565cSLuiz Capitulino { 1036fe9565cSLuiz Capitulino capacity_increase(qstring, 1); 1046fe9565cSLuiz Capitulino qstring->string[qstring->length++] = c; 1056fe9565cSLuiz Capitulino qstring->string[qstring->length] = 0; 1066fe9565cSLuiz Capitulino } 1076fe9565cSLuiz Capitulino 1086fe9565cSLuiz Capitulino /** 10966f70487SLuiz Capitulino * qstring_get_str(): Return a pointer to the stored string 11066f70487SLuiz Capitulino * 11166f70487SLuiz Capitulino * NOTE: Should be used with caution, if the object is deallocated 11266f70487SLuiz Capitulino * this pointer becomes invalid. 11366f70487SLuiz Capitulino */ 11466f70487SLuiz Capitulino const char *qstring_get_str(const QString *qstring) 11566f70487SLuiz Capitulino { 11666f70487SLuiz Capitulino return qstring->string; 11766f70487SLuiz Capitulino } 11866f70487SLuiz Capitulino 11966f70487SLuiz Capitulino /** 12077593202SPeter Xu * qstring_get_try_str(): Return a pointer to the stored string 12177593202SPeter Xu * 12277593202SPeter Xu * NOTE: will return NULL if qstring is not provided. 12377593202SPeter Xu */ 12477593202SPeter Xu const char *qstring_get_try_str(const QString *qstring) 12577593202SPeter Xu { 12677593202SPeter Xu return qstring ? qstring_get_str(qstring) : NULL; 12777593202SPeter Xu } 12877593202SPeter Xu 12977593202SPeter Xu /** 130*b26ae1cbSPeter Xu * qobject_get_try_str(): Return a pointer to the corresponding string 131*b26ae1cbSPeter Xu * 132*b26ae1cbSPeter Xu * NOTE: the string will only be returned if the object is valid, and 133*b26ae1cbSPeter Xu * its type is QString, otherwise NULL is returned. 134*b26ae1cbSPeter Xu */ 135*b26ae1cbSPeter Xu const char *qobject_get_try_str(const QObject *qstring) 136*b26ae1cbSPeter Xu { 137*b26ae1cbSPeter Xu return qstring_get_try_str(qobject_to(QString, qstring)); 138*b26ae1cbSPeter Xu } 139*b26ae1cbSPeter Xu 140*b26ae1cbSPeter Xu /** 141b38dd678SMax Reitz * qstring_is_equal(): Test whether the two QStrings are equal 142b38dd678SMax Reitz */ 143b38dd678SMax Reitz bool qstring_is_equal(const QObject *x, const QObject *y) 144b38dd678SMax Reitz { 1457dc847ebSMax Reitz return !strcmp(qobject_to(QString, x)->string, 1467dc847ebSMax Reitz qobject_to(QString, y)->string); 147b38dd678SMax Reitz } 148b38dd678SMax Reitz 149b38dd678SMax Reitz /** 15066f70487SLuiz Capitulino * qstring_destroy_obj(): Free all memory allocated by a QString 15166f70487SLuiz Capitulino * object 15266f70487SLuiz Capitulino */ 15355e1819cSEric Blake void qstring_destroy_obj(QObject *obj) 15466f70487SLuiz Capitulino { 15566f70487SLuiz Capitulino QString *qs; 15666f70487SLuiz Capitulino 15766f70487SLuiz Capitulino assert(obj != NULL); 1587dc847ebSMax Reitz qs = qobject_to(QString, obj); 1597267c094SAnthony Liguori g_free(qs->string); 1607267c094SAnthony Liguori g_free(qs); 16166f70487SLuiz Capitulino } 162