string.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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[in,out] x pointer to dbString
  17. */
  18. void db_init_string(dbString * x)
  19. {
  20. x->string = "";
  21. x->nalloc = 0;
  22. }
  23. static int set_string(dbString * x, char *s, int copy);
  24. /*!
  25. \brief Inserts string to dbString (enlarge string)
  26. \param[in,out] x pointer to dbString
  27. \param s string to be inserted
  28. \return DB_OK on success
  29. \return DB_MEMORY_ERR on error
  30. */
  31. int db_set_string(dbString * x, const char *s)
  32. {
  33. return set_string(x, (char *)s, 1);
  34. }
  35. /*!
  36. \brief Inserts string to dbString (overwrite current value)
  37. \param[in,out] x pointer to dbString
  38. \param s string to be inserted
  39. \return DB_OK on success
  40. \return DB_MEMORY_ERR on error
  41. */
  42. int db_set_string_no_copy(dbString * x, char *s)
  43. {
  44. return set_string(x, s, 0);
  45. }
  46. /*!
  47. \brief Get string size
  48. \param x pointer to dbString
  49. \return string size
  50. */
  51. unsigned int db_sizeof_string(const dbString * x)
  52. {
  53. if (x->nalloc < 0)
  54. return 0;
  55. return (unsigned int)x->nalloc;
  56. }
  57. /*!
  58. \brief Zero string
  59. \param x pointer to dbString
  60. */
  61. void db_zero_string(dbString * x)
  62. {
  63. db_zero((void *)db_get_string(x), db_sizeof_string(x));
  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 = db_store("");
  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 containg string
  110. */
  111. char *db_get_string(const dbString * x)
  112. {
  113. return x->string;
  114. }
  115. /*!
  116. \brief Free allocated space
  117. \param x poiter to dbString
  118. */
  119. void db_free_string(dbString * x)
  120. {
  121. if (x->nalloc > 0)
  122. G_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. G_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. len = strlen(db_get_string(x)) + strlen(s) + 1;
  169. stat = db_enlarge_string(x, len);
  170. if (stat != DB_OK)
  171. return stat;
  172. strcat(db_get_string(x), s);
  173. return DB_OK;
  174. }
  175. /*!
  176. \brief Copy dbString
  177. \param dst destination dbString
  178. \param src source dbString
  179. \return DB_OK on success
  180. \return DB_ERR code on error
  181. */
  182. int db_copy_string(dbString * dst, const dbString * src)
  183. {
  184. return db_set_string(dst, db_get_string(src));
  185. }
  186. /*!
  187. \brief Replace each ' is replaced by ''
  188. \param src pointer to dbString
  189. */
  190. void db_double_quote_string(dbString * src)
  191. {
  192. char *ptra, *ptrb, buf[2];
  193. dbString tmp;
  194. db_init_string(&tmp);
  195. buf[1] = 0;
  196. ptrb = db_get_string(src);
  197. while ((ptra = strchr(ptrb, '\'')) != NULL) {
  198. for (; ptrb <= ptra; ptrb++) {
  199. buf[0] = ptrb[0];
  200. db_append_string(&tmp, buf);
  201. }
  202. db_append_string(&tmp, "'");
  203. }
  204. db_append_string(&tmp, ptrb);
  205. db_set_string(src, db_get_string(&tmp));
  206. db_free_string(&tmp);
  207. }