qstring.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. * QString Module
  3. *
  4. * Copyright (C) 2009 Red Hat Inc.
  5. *
  6. * Authors:
  7. * Luiz Capitulino <lcapitulino@redhat.com>
  8. *
  9. * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
  10. * See the COPYING.LIB file in the top-level directory.
  11. */
  12. #include "qemu/osdep.h"
  13. #include "qapi/qmp/qstring.h"
  14. /**
  15. * qstring_new(): Create a new empty QString
  16. *
  17. * Return strong reference.
  18. */
  19. QString *qstring_new(void)
  20. {
  21. return qstring_from_str("");
  22. }
  23. /**
  24. * qstring_get_length(): Get the length of a QString
  25. */
  26. size_t qstring_get_length(const QString *qstring)
  27. {
  28. return qstring->length;
  29. }
  30. /**
  31. * qstring_from_substr(): Create a new QString from a C string substring
  32. *
  33. * Return string reference
  34. */
  35. QString *qstring_from_substr(const char *str, size_t start, size_t end)
  36. {
  37. QString *qstring;
  38. assert(start <= end);
  39. qstring = g_malloc(sizeof(*qstring));
  40. qobject_init(QOBJECT(qstring), QTYPE_QSTRING);
  41. qstring->length = end - start;
  42. qstring->capacity = qstring->length;
  43. assert(qstring->capacity < SIZE_MAX);
  44. qstring->string = g_malloc(qstring->capacity + 1);
  45. memcpy(qstring->string, str + start, qstring->length);
  46. qstring->string[qstring->length] = 0;
  47. return qstring;
  48. }
  49. /**
  50. * qstring_from_str(): Create a new QString from a regular C string
  51. *
  52. * Return strong reference.
  53. */
  54. QString *qstring_from_str(const char *str)
  55. {
  56. return qstring_from_substr(str, 0, strlen(str));
  57. }
  58. static void capacity_increase(QString *qstring, size_t len)
  59. {
  60. if (qstring->capacity < (qstring->length + len)) {
  61. assert(len <= SIZE_MAX - qstring->capacity);
  62. qstring->capacity += len;
  63. assert(qstring->capacity <= SIZE_MAX / 2);
  64. qstring->capacity *= 2; /* use exponential growth */
  65. qstring->string = g_realloc(qstring->string, qstring->capacity + 1);
  66. }
  67. }
  68. /* qstring_append(): Append a C string to a QString
  69. */
  70. void qstring_append(QString *qstring, const char *str)
  71. {
  72. size_t len = strlen(str);
  73. capacity_increase(qstring, len);
  74. memcpy(qstring->string + qstring->length, str, len);
  75. qstring->length += len;
  76. qstring->string[qstring->length] = 0;
  77. }
  78. void qstring_append_int(QString *qstring, int64_t value)
  79. {
  80. char num[32];
  81. snprintf(num, sizeof(num), "%" PRId64, value);
  82. qstring_append(qstring, num);
  83. }
  84. /**
  85. * qstring_append_chr(): Append a C char to a QString
  86. */
  87. void qstring_append_chr(QString *qstring, int c)
  88. {
  89. capacity_increase(qstring, 1);
  90. qstring->string[qstring->length++] = c;
  91. qstring->string[qstring->length] = 0;
  92. }
  93. /**
  94. * qstring_get_str(): Return a pointer to the stored string
  95. *
  96. * NOTE: Should be used with caution, if the object is deallocated
  97. * this pointer becomes invalid.
  98. */
  99. const char *qstring_get_str(const QString *qstring)
  100. {
  101. return qstring->string;
  102. }
  103. /**
  104. * qstring_get_try_str(): Return a pointer to the stored string
  105. *
  106. * NOTE: will return NULL if qstring is not provided.
  107. */
  108. const char *qstring_get_try_str(const QString *qstring)
  109. {
  110. return qstring ? qstring_get_str(qstring) : NULL;
  111. }
  112. /**
  113. * qobject_get_try_str(): Return a pointer to the corresponding string
  114. *
  115. * NOTE: the string will only be returned if the object is valid, and
  116. * its type is QString, otherwise NULL is returned.
  117. */
  118. const char *qobject_get_try_str(const QObject *qstring)
  119. {
  120. return qstring_get_try_str(qobject_to(QString, qstring));
  121. }
  122. /**
  123. * qstring_is_equal(): Test whether the two QStrings are equal
  124. */
  125. bool qstring_is_equal(const QObject *x, const QObject *y)
  126. {
  127. return !strcmp(qobject_to(QString, x)->string,
  128. qobject_to(QString, y)->string);
  129. }
  130. /**
  131. * qstring_free(): Free the memory allocated by a QString object
  132. *
  133. * Return: if @return_str, return the underlying string, to be
  134. * g_free(), otherwise NULL is returned.
  135. */
  136. char *qstring_free(QString *qstring, bool return_str)
  137. {
  138. char *rv = NULL;
  139. if (return_str) {
  140. rv = qstring->string;
  141. } else {
  142. g_free(qstring->string);
  143. }
  144. g_free(qstring);
  145. return rv;
  146. }
  147. /**
  148. * qstring_destroy_obj(): Free all memory allocated by a QString
  149. * object
  150. */
  151. void qstring_destroy_obj(QObject *obj)
  152. {
  153. assert(obj != NULL);
  154. qstring_free(qobject_to(QString, obj), FALSE);
  155. }