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 */ 40ad63c549Sliujunjie QString *qstring_from_substr(const char *str, size_t start, size_t end) 414b5c5766SLuiz Capitulino { 424b5c5766SLuiz Capitulino QString *qstring; 434b5c5766SLuiz Capitulino 44*b65ab77bSMarkus Armbruster assert(start <= end + 1); 45*b65ab77bSMarkus Armbruster 467267c094SAnthony Liguori qstring = g_malloc(sizeof(*qstring)); 4755e1819cSEric Blake qobject_init(QOBJECT(qstring), QTYPE_QSTRING); 484b5c5766SLuiz Capitulino 494b5c5766SLuiz Capitulino qstring->length = end - start + 1; 504b5c5766SLuiz Capitulino qstring->capacity = qstring->length; 514b5c5766SLuiz Capitulino 52*b65ab77bSMarkus Armbruster assert(qstring->capacity < SIZE_MAX); 537267c094SAnthony Liguori qstring->string = g_malloc(qstring->capacity + 1); 544b5c5766SLuiz Capitulino memcpy(qstring->string, str + start, qstring->length); 554b5c5766SLuiz Capitulino qstring->string[qstring->length] = 0; 564b5c5766SLuiz Capitulino 574b5c5766SLuiz Capitulino return qstring; 584b5c5766SLuiz Capitulino } 594b5c5766SLuiz Capitulino 604b5c5766SLuiz Capitulino /** 6166f70487SLuiz Capitulino * qstring_from_str(): Create a new QString from a regular C string 6266f70487SLuiz Capitulino * 6366f70487SLuiz Capitulino * Return strong reference. 6466f70487SLuiz Capitulino */ 6566f70487SLuiz Capitulino QString *qstring_from_str(const char *str) 6666f70487SLuiz Capitulino { 674b5c5766SLuiz Capitulino return qstring_from_substr(str, 0, strlen(str) - 1); 6866f70487SLuiz Capitulino } 6966f70487SLuiz Capitulino 706fe9565cSLuiz Capitulino static void capacity_increase(QString *qstring, size_t len) 71d30ec846SAnthony Liguori { 72d30ec846SAnthony Liguori if (qstring->capacity < (qstring->length + len)) { 73*b65ab77bSMarkus Armbruster assert(len <= SIZE_MAX - qstring->capacity); 74d30ec846SAnthony Liguori qstring->capacity += len; 75*b65ab77bSMarkus Armbruster assert(qstring->capacity <= SIZE_MAX / 2); 76d30ec846SAnthony Liguori qstring->capacity *= 2; /* use exponential growth */ 77d30ec846SAnthony Liguori 787267c094SAnthony Liguori qstring->string = g_realloc(qstring->string, qstring->capacity + 1); 79d30ec846SAnthony Liguori } 806fe9565cSLuiz Capitulino } 81d30ec846SAnthony Liguori 826fe9565cSLuiz Capitulino /* qstring_append(): Append a C string to a QString 836fe9565cSLuiz Capitulino */ 846fe9565cSLuiz Capitulino void qstring_append(QString *qstring, const char *str) 856fe9565cSLuiz Capitulino { 866fe9565cSLuiz Capitulino size_t len = strlen(str); 876fe9565cSLuiz Capitulino 886fe9565cSLuiz Capitulino capacity_increase(qstring, len); 89d30ec846SAnthony Liguori memcpy(qstring->string + qstring->length, str, len); 90d30ec846SAnthony Liguori qstring->length += len; 91d30ec846SAnthony Liguori qstring->string[qstring->length] = 0; 92d30ec846SAnthony Liguori } 93d30ec846SAnthony Liguori 94764c1caeSLuiz Capitulino void qstring_append_int(QString *qstring, int64_t value) 95764c1caeSLuiz Capitulino { 96764c1caeSLuiz Capitulino char num[32]; 97764c1caeSLuiz Capitulino 98764c1caeSLuiz Capitulino snprintf(num, sizeof(num), "%" PRId64, value); 99764c1caeSLuiz Capitulino qstring_append(qstring, num); 100764c1caeSLuiz Capitulino } 101764c1caeSLuiz Capitulino 10266f70487SLuiz Capitulino /** 1036fe9565cSLuiz Capitulino * qstring_append_chr(): Append a C char to a QString 1046fe9565cSLuiz Capitulino */ 1056fe9565cSLuiz Capitulino void qstring_append_chr(QString *qstring, int c) 1066fe9565cSLuiz Capitulino { 1076fe9565cSLuiz Capitulino capacity_increase(qstring, 1); 1086fe9565cSLuiz Capitulino qstring->string[qstring->length++] = c; 1096fe9565cSLuiz Capitulino qstring->string[qstring->length] = 0; 1106fe9565cSLuiz Capitulino } 1116fe9565cSLuiz Capitulino 1126fe9565cSLuiz Capitulino /** 11366f70487SLuiz Capitulino * qstring_get_str(): Return a pointer to the stored string 11466f70487SLuiz Capitulino * 11566f70487SLuiz Capitulino * NOTE: Should be used with caution, if the object is deallocated 11666f70487SLuiz Capitulino * this pointer becomes invalid. 11766f70487SLuiz Capitulino */ 11866f70487SLuiz Capitulino const char *qstring_get_str(const QString *qstring) 11966f70487SLuiz Capitulino { 12066f70487SLuiz Capitulino return qstring->string; 12166f70487SLuiz Capitulino } 12266f70487SLuiz Capitulino 12366f70487SLuiz Capitulino /** 12477593202SPeter Xu * qstring_get_try_str(): Return a pointer to the stored string 12577593202SPeter Xu * 12677593202SPeter Xu * NOTE: will return NULL if qstring is not provided. 12777593202SPeter Xu */ 12877593202SPeter Xu const char *qstring_get_try_str(const QString *qstring) 12977593202SPeter Xu { 13077593202SPeter Xu return qstring ? qstring_get_str(qstring) : NULL; 13177593202SPeter Xu } 13277593202SPeter Xu 13377593202SPeter Xu /** 134b26ae1cbSPeter Xu * qobject_get_try_str(): Return a pointer to the corresponding string 135b26ae1cbSPeter Xu * 136b26ae1cbSPeter Xu * NOTE: the string will only be returned if the object is valid, and 137b26ae1cbSPeter Xu * its type is QString, otherwise NULL is returned. 138b26ae1cbSPeter Xu */ 139b26ae1cbSPeter Xu const char *qobject_get_try_str(const QObject *qstring) 140b26ae1cbSPeter Xu { 141b26ae1cbSPeter Xu return qstring_get_try_str(qobject_to(QString, qstring)); 142b26ae1cbSPeter Xu } 143b26ae1cbSPeter Xu 144b26ae1cbSPeter Xu /** 145b38dd678SMax Reitz * qstring_is_equal(): Test whether the two QStrings are equal 146b38dd678SMax Reitz */ 147b38dd678SMax Reitz bool qstring_is_equal(const QObject *x, const QObject *y) 148b38dd678SMax Reitz { 1497dc847ebSMax Reitz return !strcmp(qobject_to(QString, x)->string, 1507dc847ebSMax Reitz qobject_to(QString, y)->string); 151b38dd678SMax Reitz } 152b38dd678SMax Reitz 153b38dd678SMax Reitz /** 15466f70487SLuiz Capitulino * qstring_destroy_obj(): Free all memory allocated by a QString 15566f70487SLuiz Capitulino * object 15666f70487SLuiz Capitulino */ 15755e1819cSEric Blake void qstring_destroy_obj(QObject *obj) 15866f70487SLuiz Capitulino { 15966f70487SLuiz Capitulino QString *qs; 16066f70487SLuiz Capitulino 16166f70487SLuiz Capitulino assert(obj != NULL); 1627dc847ebSMax Reitz qs = qobject_to(QString, obj); 1637267c094SAnthony Liguori g_free(qs->string); 1647267c094SAnthony Liguori g_free(qs); 16566f70487SLuiz Capitulino } 166