166f70487SLuiz Capitulino /* 266f70487SLuiz Capitulino * QString data type. 366f70487SLuiz Capitulino * 466f70487SLuiz Capitulino * Copyright (C) 2009 Red Hat Inc. 566f70487SLuiz Capitulino * 666f70487SLuiz Capitulino * Authors: 766f70487SLuiz Capitulino * Luiz Capitulino <lcapitulino@redhat.com> 866f70487SLuiz Capitulino * 966f70487SLuiz Capitulino * This work is licensed under the terms of the GNU GPL, version 2. See 1066f70487SLuiz Capitulino * the COPYING file in the top-level directory. 1166f70487SLuiz Capitulino */ 1266f70487SLuiz Capitulino #include "qobject.h" 1366f70487SLuiz Capitulino #include "qstring.h" 1466f70487SLuiz Capitulino #include "qemu-common.h" 1566f70487SLuiz Capitulino 16aa43d9ccSBlue Swirl static void qstring_destroy_obj(QObject *obj); 17aa43d9ccSBlue Swirl 18aa43d9ccSBlue Swirl static const QType qstring_type = { 19aa43d9ccSBlue Swirl .code = QTYPE_QSTRING, 20aa43d9ccSBlue Swirl .destroy = qstring_destroy_obj, 21aa43d9ccSBlue Swirl }; 2266f70487SLuiz Capitulino 2366f70487SLuiz Capitulino /** 24d30ec846SAnthony Liguori * qstring_new(): Create a new empty QString 25d30ec846SAnthony Liguori * 26d30ec846SAnthony Liguori * Return strong reference. 27d30ec846SAnthony Liguori */ 28d30ec846SAnthony Liguori QString *qstring_new(void) 29d30ec846SAnthony Liguori { 30d30ec846SAnthony Liguori return qstring_from_str(""); 31d30ec846SAnthony Liguori } 32d30ec846SAnthony Liguori 33d30ec846SAnthony Liguori /** 3466f70487SLuiz Capitulino * qstring_from_str(): Create a new QString from a regular C string 3566f70487SLuiz Capitulino * 3666f70487SLuiz Capitulino * Return strong reference. 3766f70487SLuiz Capitulino */ 3866f70487SLuiz Capitulino QString *qstring_from_str(const char *str) 3966f70487SLuiz Capitulino { 4066f70487SLuiz Capitulino QString *qstring; 4166f70487SLuiz Capitulino 4266f70487SLuiz Capitulino qstring = qemu_malloc(sizeof(*qstring)); 43d30ec846SAnthony Liguori 44d30ec846SAnthony Liguori qstring->length = strlen(str); 45d30ec846SAnthony Liguori qstring->capacity = qstring->length; 46d30ec846SAnthony Liguori 47d30ec846SAnthony Liguori qstring->string = qemu_malloc(qstring->capacity + 1); 48d30ec846SAnthony Liguori memcpy(qstring->string, str, qstring->length); 49d30ec846SAnthony Liguori qstring->string[qstring->length] = 0; 50d30ec846SAnthony Liguori 5166f70487SLuiz Capitulino QOBJECT_INIT(qstring, &qstring_type); 5266f70487SLuiz Capitulino 5366f70487SLuiz Capitulino return qstring; 5466f70487SLuiz Capitulino } 5566f70487SLuiz Capitulino 566fe9565cSLuiz Capitulino static void capacity_increase(QString *qstring, size_t len) 57d30ec846SAnthony Liguori { 58d30ec846SAnthony Liguori if (qstring->capacity < (qstring->length + len)) { 59d30ec846SAnthony Liguori qstring->capacity += len; 60d30ec846SAnthony Liguori qstring->capacity *= 2; /* use exponential growth */ 61d30ec846SAnthony Liguori 62d30ec846SAnthony Liguori qstring->string = qemu_realloc(qstring->string, qstring->capacity + 1); 63d30ec846SAnthony Liguori } 646fe9565cSLuiz Capitulino } 65d30ec846SAnthony Liguori 666fe9565cSLuiz Capitulino /* qstring_append(): Append a C string to a QString 676fe9565cSLuiz Capitulino */ 686fe9565cSLuiz Capitulino void qstring_append(QString *qstring, const char *str) 696fe9565cSLuiz Capitulino { 706fe9565cSLuiz Capitulino size_t len = strlen(str); 716fe9565cSLuiz Capitulino 726fe9565cSLuiz Capitulino capacity_increase(qstring, len); 73d30ec846SAnthony Liguori memcpy(qstring->string + qstring->length, str, len); 74d30ec846SAnthony Liguori qstring->length += len; 75d30ec846SAnthony Liguori qstring->string[qstring->length] = 0; 76d30ec846SAnthony Liguori } 77d30ec846SAnthony Liguori 78*764c1caeSLuiz Capitulino void qstring_append_int(QString *qstring, int64_t value) 79*764c1caeSLuiz Capitulino { 80*764c1caeSLuiz Capitulino char num[32]; 81*764c1caeSLuiz Capitulino 82*764c1caeSLuiz Capitulino snprintf(num, sizeof(num), "%" PRId64, value); 83*764c1caeSLuiz Capitulino qstring_append(qstring, num); 84*764c1caeSLuiz Capitulino } 85*764c1caeSLuiz Capitulino 8666f70487SLuiz Capitulino /** 876fe9565cSLuiz Capitulino * qstring_append_chr(): Append a C char to a QString 886fe9565cSLuiz Capitulino */ 896fe9565cSLuiz Capitulino void qstring_append_chr(QString *qstring, int c) 906fe9565cSLuiz Capitulino { 916fe9565cSLuiz Capitulino capacity_increase(qstring, 1); 926fe9565cSLuiz Capitulino qstring->string[qstring->length++] = c; 936fe9565cSLuiz Capitulino qstring->string[qstring->length] = 0; 946fe9565cSLuiz Capitulino } 956fe9565cSLuiz Capitulino 966fe9565cSLuiz Capitulino /** 9766f70487SLuiz Capitulino * qobject_to_qstring(): Convert a QObject to a QString 9866f70487SLuiz Capitulino */ 9966f70487SLuiz Capitulino QString *qobject_to_qstring(const QObject *obj) 10066f70487SLuiz Capitulino { 10166f70487SLuiz Capitulino if (qobject_type(obj) != QTYPE_QSTRING) 10266f70487SLuiz Capitulino return NULL; 10366f70487SLuiz Capitulino 10466f70487SLuiz Capitulino return container_of(obj, QString, base); 10566f70487SLuiz Capitulino } 10666f70487SLuiz Capitulino 10766f70487SLuiz Capitulino /** 10866f70487SLuiz Capitulino * qstring_get_str(): Return a pointer to the stored string 10966f70487SLuiz Capitulino * 11066f70487SLuiz Capitulino * NOTE: Should be used with caution, if the object is deallocated 11166f70487SLuiz Capitulino * this pointer becomes invalid. 11266f70487SLuiz Capitulino */ 11366f70487SLuiz Capitulino const char *qstring_get_str(const QString *qstring) 11466f70487SLuiz Capitulino { 11566f70487SLuiz Capitulino return qstring->string; 11666f70487SLuiz Capitulino } 11766f70487SLuiz Capitulino 11866f70487SLuiz Capitulino /** 11966f70487SLuiz Capitulino * qstring_destroy_obj(): Free all memory allocated by a QString 12066f70487SLuiz Capitulino * object 12166f70487SLuiz Capitulino */ 12266f70487SLuiz Capitulino static void qstring_destroy_obj(QObject *obj) 12366f70487SLuiz Capitulino { 12466f70487SLuiz Capitulino QString *qs; 12566f70487SLuiz Capitulino 12666f70487SLuiz Capitulino assert(obj != NULL); 12766f70487SLuiz Capitulino qs = qobject_to_qstring(obj); 12866f70487SLuiz Capitulino qemu_free(qs->string); 12966f70487SLuiz Capitulino qemu_free(qs); 13066f70487SLuiz Capitulino } 131