string.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <grass/dbmi.h>
  4. /*!
  5. \fn
  6. \brief
  7. \return
  8. \param
  9. */
  10. void
  11. db_init_string (dbString *x)
  12. {
  13. x->string = "";
  14. x->nalloc = 0;
  15. }
  16. /*!
  17. \fn
  18. \brief
  19. \return
  20. \param
  21. */
  22. /* db_set_string(dbString *x, char *s, int copy)
  23. * inserts 's' into 'x'
  24. * if 'copy' is true, then memory is allocated to copy into
  25. * else 'x' is made to point to 's'
  26. * returns DB_OK or DB_MEMORY_ERR
  27. */
  28. static int set_string(dbString *x, char *s, int copy);
  29. int
  30. db_set_string (dbString *x, const char *s)
  31. {
  32. return set_string (x, (char *) s, 1);
  33. }
  34. /*!
  35. \fn
  36. \brief
  37. \return
  38. \param
  39. */
  40. int
  41. db_set_string_no_copy (dbString *x, char *s)
  42. {
  43. return set_string (x, s, 0);
  44. }
  45. /*!
  46. \fn
  47. \brief
  48. \return
  49. \param
  50. */
  51. unsigned int
  52. db_sizeof_string (dbString *x)
  53. {
  54. if (x->nalloc < 0) return 0;
  55. return (unsigned int) x->nalloc;
  56. }
  57. /*!
  58. \fn
  59. \brief
  60. \return
  61. \param
  62. */
  63. void
  64. db_zero_string (dbString *x)
  65. {
  66. db_zero ((void *)db_get_string(x), db_sizeof_string(x));
  67. }
  68. /*!
  69. \fn
  70. \brief
  71. \return
  72. \param
  73. */
  74. static int
  75. set_string (dbString *x, char *s, int copy)
  76. {
  77. int len;
  78. int stat;
  79. if (s == NULL)
  80. {
  81. s = "";
  82. copy = 1;
  83. }
  84. len = strlen(s)+1;
  85. if (copy)
  86. {
  87. stat = db_enlarge_string (x, len);
  88. if (stat != DB_OK)
  89. return stat;
  90. strcpy (x->string, s);
  91. }
  92. else
  93. {
  94. db_free_string(x);
  95. x->string = s;
  96. x->nalloc = -1;
  97. }
  98. return DB_OK;
  99. }
  100. /*!
  101. \fn
  102. \brief
  103. \return
  104. \param
  105. */
  106. int
  107. db_enlarge_string (dbString *x, int len)
  108. {
  109. if (x->nalloc < len)
  110. {
  111. if (x->nalloc <= 0)
  112. x->string = db_store("");
  113. x->string = db_realloc ((void *)x->string, len);
  114. if (x->string == NULL)
  115. return DB_MEMORY_ERR;
  116. x->nalloc = len;
  117. }
  118. return DB_OK;
  119. }
  120. /*!
  121. \fn
  122. \brief
  123. \return
  124. \param
  125. */
  126. char *
  127. db_get_string (dbString *x)
  128. {
  129. return x->string;
  130. }
  131. /*!
  132. \fn
  133. \brief
  134. \return
  135. \param
  136. */
  137. void
  138. db_free_string (dbString *x)
  139. {
  140. if (x->nalloc > 0)
  141. free(x->string);
  142. db_init_string (x);
  143. }
  144. /*!
  145. \fn
  146. \brief
  147. \return
  148. \param
  149. */
  150. void
  151. db_free_string_array (dbString *a, int n)
  152. {
  153. int i;
  154. if (a)
  155. {
  156. for (i = 0; i<n; i++)
  157. db_free_string(&a[i]);
  158. free (a);
  159. }
  160. }
  161. /*!
  162. \fn
  163. \brief
  164. \return
  165. \param
  166. */
  167. dbString *
  168. db_alloc_string_array (int count)
  169. {
  170. int i;
  171. dbString *a;
  172. if (count < 0) count = 0;
  173. a = (dbString *) db_calloc (count, sizeof(dbString));
  174. if (a)
  175. {
  176. for (i = 0; i < count; i++)
  177. db_init_string(&a[i]);
  178. }
  179. return a;
  180. }
  181. /*!
  182. \fn
  183. \brief
  184. \return
  185. \param
  186. */
  187. int
  188. db_append_string (dbString *x, const char *s)
  189. {
  190. int len;
  191. int stat;
  192. len = strlen (db_get_string(x)) + strlen(s) + 1;
  193. stat = db_enlarge_string (x, len);
  194. if (stat != DB_OK)
  195. return stat;
  196. strcat (db_get_string(x), s);
  197. return DB_OK;
  198. }
  199. /*!
  200. \fn
  201. \brief
  202. \return
  203. \param
  204. */
  205. int
  206. db_copy_string (dbString *dst, dbString *src)
  207. {
  208. return db_set_string (dst, db_get_string(src));
  209. }
  210. /*!
  211. \fn
  212. \brief each ' is replaced by ''
  213. \return
  214. \param
  215. */
  216. void
  217. db_double_quote_string (dbString *src)
  218. {
  219. char *ptra, *ptrb, buf[2];
  220. dbString tmp;
  221. db_init_string (&tmp);
  222. buf[1] = 0;
  223. ptrb = db_get_string(src);
  224. while ( (ptra = strchr( ptrb, '\'') ) != NULL ) {
  225. for ( ; ptrb <= ptra; ptrb++ ) { buf[0] = ptrb[0]; db_append_string (&tmp, buf); }
  226. db_append_string (&tmp, "'");
  227. }
  228. db_append_string (&tmp, ptrb );
  229. db_set_string ( src, db_get_string(&tmp));
  230. db_free_string( &tmp );
  231. }