string.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*!
  2. \file db/dbmi_base/string.c
  3. \brief DBMI Library (base) - string management
  4. (C) 1999-2009 by the GRASS Development Team
  5. This program is free software under the GNU General Public License
  6. (>=v2). Read the file COPYING that comes with GRASS for details.
  7. \author Joel Jones (CERL/UIUC)
  8. \author Upgraded to GRASS 5.7 by Radim Blazek
  9. */
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <grass/gis.h>
  13. #include <grass/dbmi.h>
  14. /*!
  15. \brief Initialize dbString
  16. \param[out] x pointer to dbString
  17. */
  18. void db_init_string(dbString *x)
  19. {
  20. G_zero(x, sizeof(dbString));
  21. }
  22. static int set_string(dbString * x, char *s, int copy);
  23. /*!
  24. \brief Inserts string to dbString (enlarge string)
  25. \param[in,out] x pointer to dbString
  26. \param s string to be inserted
  27. \return DB_OK on success
  28. \return DB_MEMORY_ERR on error
  29. */
  30. int db_set_string(dbString * x, const char *s)
  31. {
  32. return set_string(x, (char *)s, 1);
  33. }
  34. /*!
  35. \brief Inserts string to dbString (overwrite current value)
  36. \param[in,out] x pointer to dbString
  37. \param s string to be inserted
  38. \return DB_OK on success
  39. \return DB_MEMORY_ERR on error
  40. */
  41. int db_set_string_no_copy(dbString * x, char *s)
  42. {
  43. return set_string(x, s, 0);
  44. }
  45. /*!
  46. \brief Get string size
  47. \param x pointer to dbString
  48. \return string size
  49. */
  50. unsigned int db_sizeof_string(const dbString * x)
  51. {
  52. if (x->nalloc < 0)
  53. return 0;
  54. return (unsigned int)x->nalloc;
  55. }
  56. /*!
  57. \brief Zero string
  58. \param x pointer to dbString
  59. */
  60. void db_zero_string(dbString * x)
  61. {
  62. if (db_get_string(x) && x->nalloc > 0)
  63. db_zero((void *)db_get_string(x), x->nalloc);
  64. }
  65. static int set_string(dbString * x, char *s, int copy)
  66. {
  67. int len;
  68. int stat;
  69. if (s == NULL) {
  70. s = "";
  71. copy = 1;
  72. }
  73. len = strlen(s) + 1;
  74. if (copy) {
  75. stat = db_enlarge_string(x, len);
  76. if (stat != DB_OK)
  77. return stat;
  78. strcpy(x->string, s);
  79. }
  80. else {
  81. db_free_string(x);
  82. x->string = s;
  83. x->nalloc = -1;
  84. }
  85. return DB_OK;
  86. }
  87. /*!
  88. \brief Enlarge dbString
  89. \param x pointer to dbString
  90. \param len requested string size
  91. \return DB_OK on success
  92. \return DB_MEMORY_ERR on error
  93. */
  94. int db_enlarge_string(dbString * x, int len)
  95. {
  96. if (x->nalloc < len) {
  97. if (x->nalloc < 0)
  98. x->string = NULL;
  99. x->string = db_realloc((void *)x->string, len);
  100. if (x->string == NULL)
  101. return DB_MEMORY_ERR;
  102. x->nalloc = len;
  103. }
  104. return DB_OK;
  105. }
  106. /*!
  107. \brief Get string
  108. \param x pointer to dbString
  109. \return pointer to buffer containing string
  110. */
  111. char *db_get_string(const dbString * x)
  112. {
  113. return x->string;
  114. }
  115. /*!
  116. \brief Free allocated space for dbString
  117. \param x pointer to dbString
  118. */
  119. void db_free_string(dbString *x)
  120. {
  121. if (x->nalloc > 0)
  122. db_free(x->string);
  123. db_init_string(x);
  124. }
  125. /*!
  126. \brief Free allocated dbString array
  127. \param a pointer to 1st dbString in the array
  128. \param n number of items in array
  129. */
  130. void db_free_string_array(dbString *a, int n)
  131. {
  132. int i;
  133. if (a) {
  134. for (i = 0; i < n; i++)
  135. db_free_string(&a[i]);
  136. db_free(a);
  137. }
  138. }
  139. /*!
  140. \brief Allocate dbString array
  141. \param count number of items to be allocated
  142. \return pointer to 1st dbString in the array
  143. */
  144. dbString *db_alloc_string_array(int count)
  145. {
  146. int i;
  147. dbString *a;
  148. if (count < 0)
  149. count = 0;
  150. a = (dbString *) db_calloc(count, sizeof(dbString));
  151. if (a) {
  152. for (i = 0; i < count; i++)
  153. db_init_string(&a[i]);
  154. }
  155. return a;
  156. }
  157. /*!
  158. \brief Append string to dbString
  159. \param x pointer to dbString
  160. \param s string to be appended
  161. \return DB_OK on success
  162. \return otherwise error code is returned
  163. */
  164. int db_append_string(dbString * x, const char *s)
  165. {
  166. int len;
  167. int stat;
  168. if (!db_get_string(x))
  169. return db_set_string(x, s);
  170. len = strlen(db_get_string(x)) + strlen(s) + 1;
  171. stat = db_enlarge_string(x, len);
  172. if (stat != DB_OK)
  173. return stat;
  174. strcat(db_get_string(x), s);
  175. return DB_OK;
  176. }
  177. /*!
  178. \brief Copy dbString
  179. \param dst destination dbString
  180. \param src source dbString
  181. \return DB_OK on success
  182. \return DB_ERR code on error
  183. */
  184. int db_copy_string(dbString * dst, const dbString * src)
  185. {
  186. return db_set_string(dst, db_get_string(src));
  187. }
  188. /*!
  189. \brief Replace each ' is replaced by ''
  190. \param src pointer to dbString
  191. */
  192. void db_double_quote_string(dbString * src)
  193. {
  194. char *ptra, *ptrb, buf[2];
  195. dbString tmp;
  196. db_init_string(&tmp);
  197. buf[1] = 0;
  198. ptrb = db_get_string(src);
  199. while ((ptra = strchr(ptrb, '\'')) != NULL) {
  200. for (; ptrb <= ptra; ptrb++) {
  201. buf[0] = ptrb[0];
  202. db_append_string(&tmp, buf);
  203. }
  204. db_append_string(&tmp, "'");
  205. }
  206. db_append_string(&tmp, ptrb);
  207. db_set_string(src, db_get_string(&tmp));
  208. db_free_string(&tmp);
  209. }