You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

fstring.c 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include <stdlib.h>
  2. #include "fstring.h"
  3. /*
  4. * Search first occurence of character in string
  5. */
  6. ssize_t
  7. fstrchr (f_str_t *src, char c)
  8. {
  9. register ssize_t cur = 0;
  10. while (cur < src->len) {
  11. if (*(src->begin + cur) == c) {
  12. return cur;
  13. }
  14. cur ++;
  15. }
  16. return -1;
  17. }
  18. /*
  19. * Search last occurence of character in string
  20. */
  21. ssize_t
  22. fstrrchr (f_str_t *src, char c)
  23. {
  24. register ssize_t cur = src->len;
  25. while (cur > 0) {
  26. if (*(src->begin + cur) == c) {
  27. return cur;
  28. }
  29. cur --;
  30. }
  31. return -1;
  32. }
  33. /*
  34. * Search for pattern in orig
  35. */
  36. ssize_t
  37. fstrstr (f_str_t *orig, f_str_t *pattern)
  38. {
  39. register ssize_t cur = 0, pcur = 0;
  40. if (pattern->len > orig->len) {
  41. return -1;
  42. }
  43. while (cur < orig->len) {
  44. if (*(orig->begin + cur) == *pattern->begin) {
  45. while (cur < orig->len && pcur < pattern->len) {
  46. if (*(orig->begin + cur) != *(pattern->begin + pcur)) {
  47. pcur = 0;
  48. break;
  49. }
  50. cur ++;
  51. pcur ++;
  52. }
  53. return cur - pattern->len;
  54. }
  55. cur ++;
  56. }
  57. return -1;
  58. }
  59. /*
  60. * Split string by tokens
  61. * word contains parsed word
  62. *
  63. * Return: -1 - no new words can be extracted
  64. * 1 - word was extracted and there are more words
  65. * 0 - last word extracted
  66. */
  67. int
  68. fstrtok (f_str_t *text, const char *sep, f_tok_t *state)
  69. {
  70. register size_t cur;
  71. const char *csep = sep;
  72. if (state->pos >= text->len) {
  73. return -1;
  74. }
  75. cur = state->pos;
  76. while (cur < text->len) {
  77. while (*csep) {
  78. if (*(text->begin + cur) == *csep) {
  79. state->word.begin = (text->begin + state->pos);
  80. state->word.len = cur - state->pos;
  81. state->pos = cur + 1;
  82. return 1;
  83. }
  84. csep ++;
  85. }
  86. csep = sep;
  87. cur ++;
  88. }
  89. /* Last word */
  90. state->word.begin = (text->begin + state->pos);
  91. state->word.len = cur - state->pos;
  92. state->pos = cur;
  93. return 0;
  94. }
  95. /*
  96. * Copy one string into other
  97. */
  98. size_t
  99. fstrcpy (f_str_t *dest, f_str_t *src)
  100. {
  101. register size_t cur = 0;
  102. if (dest->size < src->len) {
  103. return 0;
  104. }
  105. while (cur < src->len && cur < dest->size) {
  106. *(dest->begin + cur) = *(src->begin + cur);
  107. cur ++;
  108. }
  109. return cur;
  110. }
  111. /*
  112. * Concatenate two strings
  113. */
  114. size_t
  115. fstrcat (f_str_t *dest, f_str_t *src)
  116. {
  117. register size_t cur = src->len;
  118. if (dest->size < src->len + dest->len) {
  119. return 0;
  120. }
  121. while (cur < src->len && cur < dest->size) {
  122. *(dest->begin + cur) = *(src->begin + cur);
  123. cur ++;
  124. }
  125. dest->len += src->len;
  126. return cur;
  127. }
  128. /*
  129. * Push one character to fstr
  130. */
  131. int
  132. fstrpush (f_str_t *dest, char c)
  133. {
  134. if (dest->size < dest->len) {
  135. /* Need to reallocate string */
  136. return 0;
  137. }
  138. *(dest->begin + dest->len) = c;
  139. dest->len ++;
  140. return 1;
  141. }
  142. /*
  143. * Allocate memory for f_str_t
  144. */
  145. f_str_t*
  146. fstralloc (memory_pool_t *pool, size_t len)
  147. {
  148. f_str_t *res = memory_pool_alloc (pool, sizeof (f_str_t));
  149. if (res == NULL) {
  150. return NULL;
  151. }
  152. res->begin = memory_pool_alloc (pool, len);
  153. if (res->begin == NULL) {
  154. free (res);
  155. return NULL;
  156. }
  157. res->size = len;
  158. return res;
  159. }
  160. /*
  161. * Truncate string to its len
  162. */
  163. f_str_t*
  164. fstrtruncate (memory_pool_t *pool, f_str_t *orig)
  165. {
  166. f_str_t *res;
  167. if (orig == NULL || orig->len == 0 || orig->size <= orig->len) {
  168. return orig;
  169. }
  170. res = fstralloc (pool, orig->len);
  171. if (res == NULL) {
  172. return NULL;
  173. }
  174. fstrcpy (res, orig);
  175. return res;
  176. }
  177. /*
  178. * Enlarge string to new size
  179. */
  180. f_str_t*
  181. fstrgrow (memory_pool_t *pool, f_str_t *orig, size_t newlen)
  182. {
  183. f_str_t *res;
  184. if (orig == NULL || orig->len == 0 || orig->size >= newlen) {
  185. return orig;
  186. }
  187. res = fstralloc (pool, newlen);
  188. if (res == NULL) {
  189. return NULL;
  190. }
  191. fstrcpy (res, orig);
  192. return res;
  193. }