string.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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. x->string = NULL;
  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. if (db_get_string(x) && x->nalloc > 0)
  64. db_zero((void *)db_get_string(x), x->nalloc);
  65. }
  66. static int set_string(dbString * x, char *s, int copy)
  67. {
  68. int len;
  69. int stat;
  70. if (s == NULL) {
  71. s = "";
  72. copy = 1;
  73. }
  74. len = strlen(s) + 1;
  75. if (copy) {
  76. stat = db_enlarge_string(x, len);
  77. if (stat != DB_OK)
  78. return stat;
  79. strcpy(x->string, s);
  80. }
  81. else {
  82. db_free_string(x);
  83. x->string = s;
  84. x->nalloc = -1;
  85. }
  86. return DB_OK;
  87. }
  88. /*!
  89. \brief Enlarge dbString
  90. \param x pointer to dbString
  91. \param len requested string size
  92. \return DB_OK on success
  93. \return DB_MEMORY_ERR on error
  94. */
  95. int db_enlarge_string(dbString * x, int len)
  96. {
  97. if (x->nalloc < len) {
  98. if (x->nalloc < 0)
  99. x->string = NULL;
  100. x->string = db_realloc((void *)x->string, len);
  101. if (x->string == NULL)
  102. return DB_MEMORY_ERR;
  103. x->nalloc = len;
  104. }
  105. return DB_OK;
  106. }
  107. /*!
  108. \brief Get string
  109. \param x pointer to dbString
  110. \return pointer to buffer containg string
  111. */
  112. char *db_get_string(const dbString * x)
  113. {
  114. return x->string;
  115. }
  116. /*!
  117. \brief Free allocated space
  118. \param x poiter to dbString
  119. */
  120. void db_free_string(dbString * x)
  121. {
  122. if (x->nalloc > 0)
  123. db_free(x->string);
  124. db_init_string(x);
  125. }
  126. /*!
  127. \brief Free allocated dbString array
  128. \param a pointer to 1st dbString in the array
  129. \param n number of items in array
  130. */
  131. void db_free_string_array(dbString *a, int n)
  132. {
  133. int i;
  134. if (a) {
  135. for (i = 0; i < n; i++)
  136. db_free_string(&a[i]);
  137. db_free(a);
  138. }
  139. }
  140. /*!
  141. \brief Allocate dbString array
  142. \param count number of items to be allocated
  143. \return pointer to 1st dbString in the array
  144. */
  145. dbString *db_alloc_string_array(int count)
  146. {
  147. int i;
  148. dbString *a;
  149. if (count < 0)
  150. count = 0;
  151. a = (dbString *) db_calloc(count, sizeof(dbString));
  152. if (a) {
  153. for (i = 0; i < count; i++)
  154. db_init_string(&a[i]);
  155. }
  156. return a;
  157. }
  158. /*!
  159. \brief Append string to dbString
  160. \param x pointer to dbString
  161. \param s string to be appended
  162. \return DB_OK on success
  163. \return otherwise error code is returned
  164. */
  165. int db_append_string(dbString * x, const char *s)
  166. {
  167. int len;
  168. int stat;
  169. if (!db_get_string(x))
  170. return db_set_string(x, s);
  171. len = strlen(db_get_string(x)) + strlen(s) + 1;
  172. stat = db_enlarge_string(x, len);
  173. if (stat != DB_OK)
  174. return stat;
  175. strcat(db_get_string(x), s);
  176. return DB_OK;
  177. }
  178. /*!
  179. \brief Copy dbString
  180. \param dst destination dbString
  181. \param src source dbString
  182. \return DB_OK on success
  183. \return DB_ERR code on error
  184. */
  185. int db_copy_string(dbString * dst, const dbString * src)
  186. {
  187. return db_set_string(dst, db_get_string(src));
  188. }
  189. /*!
  190. \brief Replace each ' is replaced by ''
  191. \param src pointer to dbString
  192. */
  193. void db_double_quote_string(dbString * src)
  194. {
  195. char *ptra, *ptrb, buf[2];
  196. dbString tmp;
  197. db_init_string(&tmp);
  198. buf[1] = 0;
  199. ptrb = db_get_string(src);
  200. while ((ptra = strchr(ptrb, '\'')) != NULL) {
  201. for (; ptrb <= ptra; ptrb++) {
  202. buf[0] = ptrb[0];
  203. db_append_string(&tmp, buf);
  204. }
  205. db_append_string(&tmp, "'");
  206. }
  207. db_append_string(&tmp, ptrb);
  208. db_set_string(src, db_get_string(&tmp));
  209. db_free_string(&tmp);
  210. }