string.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. #include "string.h"
  2. #include <m-string.h>
  3. struct FuriString {
  4. string_t string;
  5. };
  6. #undef furi_string_alloc_set
  7. #undef furi_string_set
  8. #undef furi_string_cmp
  9. #undef furi_string_cmpi
  10. #undef furi_string_search
  11. #undef furi_string_search_str
  12. #undef furi_string_equal
  13. #undef furi_string_replace
  14. #undef furi_string_replace_str
  15. #undef furi_string_replace_all
  16. #undef furi_string_start_with
  17. #undef furi_string_end_with
  18. #undef furi_string_search_char
  19. #undef furi_string_search_rchar
  20. #undef furi_string_trim
  21. #undef furi_string_cat
  22. FuriString* furi_string_alloc() {
  23. FuriString* string = malloc(sizeof(FuriString));
  24. string_init(string->string);
  25. return string;
  26. }
  27. FuriString* furi_string_alloc_set(const FuriString* s) {
  28. FuriString* string = malloc(sizeof(FuriString)); //-V799
  29. string_init_set(string->string, s->string);
  30. return string;
  31. } //-V773
  32. FuriString* furi_string_alloc_set_str(const char cstr[]) {
  33. FuriString* string = malloc(sizeof(FuriString)); //-V799
  34. string_init_set(string->string, cstr);
  35. return string;
  36. } //-V773
  37. FuriString* furi_string_alloc_printf(const char format[], ...) {
  38. va_list args;
  39. va_start(args, format);
  40. FuriString* string = furi_string_alloc_vprintf(format, args);
  41. va_end(args);
  42. return string;
  43. }
  44. FuriString* furi_string_alloc_vprintf(const char format[], va_list args) {
  45. FuriString* string = malloc(sizeof(FuriString));
  46. string_init_vprintf(string->string, format, args);
  47. return string;
  48. }
  49. FuriString* furi_string_alloc_move(FuriString* s) {
  50. FuriString* string = malloc(sizeof(FuriString));
  51. string_init_move(string->string, s->string);
  52. free(s);
  53. return string;
  54. }
  55. void furi_string_free(FuriString* s) {
  56. string_clear(s->string);
  57. free(s);
  58. }
  59. void furi_string_reserve(FuriString* s, size_t alloc) {
  60. string_reserve(s->string, alloc);
  61. }
  62. void furi_string_reset(FuriString* s) {
  63. string_reset(s->string);
  64. }
  65. void furi_string_swap(FuriString* v1, FuriString* v2) {
  66. string_swap(v1->string, v2->string);
  67. }
  68. void furi_string_move(FuriString* v1, FuriString* v2) {
  69. string_clear(v1->string);
  70. string_init_move(v1->string, v2->string);
  71. free(v2);
  72. }
  73. size_t furi_string_hash(const FuriString* v) {
  74. return string_hash(v->string);
  75. }
  76. char furi_string_get_char(const FuriString* v, size_t index) {
  77. return string_get_char(v->string, index);
  78. }
  79. const char* furi_string_get_cstr(const FuriString* s) {
  80. return string_get_cstr(s->string);
  81. }
  82. void furi_string_set(FuriString* s, FuriString* source) {
  83. string_set(s->string, source->string);
  84. }
  85. void furi_string_set_str(FuriString* s, const char cstr[]) {
  86. string_set(s->string, cstr);
  87. }
  88. void furi_string_set_strn(FuriString* s, const char str[], size_t n) {
  89. string_set_strn(s->string, str, n);
  90. }
  91. void furi_string_set_char(FuriString* s, size_t index, const char c) {
  92. string_set_char(s->string, index, c);
  93. }
  94. int furi_string_cmp(const FuriString* s1, const FuriString* s2) {
  95. return string_cmp(s1->string, s2->string);
  96. }
  97. int furi_string_cmp_str(const FuriString* s1, const char str[]) {
  98. return string_cmp(s1->string, str);
  99. }
  100. int furi_string_cmpi(const FuriString* v1, const FuriString* v2) {
  101. return string_cmpi(v1->string, v2->string);
  102. }
  103. int furi_string_cmpi_str(const FuriString* v1, const char p2[]) {
  104. return string_cmpi_str(v1->string, p2);
  105. }
  106. size_t furi_string_search(const FuriString* v, const FuriString* needle, size_t start) {
  107. return string_search(v->string, needle->string, start);
  108. }
  109. size_t furi_string_search_str(const FuriString* v, const char needle[], size_t start) {
  110. return string_search(v->string, needle, start);
  111. }
  112. bool furi_string_equal(const FuriString* v1, const FuriString* v2) {
  113. return string_equal_p(v1->string, v2->string);
  114. }
  115. bool furi_string_equal_str(const FuriString* v1, const char v2[]) {
  116. return string_equal_p(v1->string, v2);
  117. }
  118. void furi_string_push_back(FuriString* v, char c) {
  119. string_push_back(v->string, c);
  120. }
  121. size_t furi_string_size(const FuriString* s) {
  122. return string_size(s->string);
  123. }
  124. int furi_string_printf(FuriString* v, const char format[], ...) {
  125. va_list args;
  126. va_start(args, format);
  127. int result = furi_string_vprintf(v, format, args);
  128. va_end(args);
  129. return result;
  130. }
  131. int furi_string_vprintf(FuriString* v, const char format[], va_list args) {
  132. return string_vprintf(v->string, format, args);
  133. }
  134. int furi_string_cat_printf(FuriString* v, const char format[], ...) {
  135. va_list args;
  136. va_start(args, format);
  137. int result = furi_string_cat_vprintf(v, format, args);
  138. va_end(args);
  139. return result;
  140. }
  141. int furi_string_cat_vprintf(FuriString* v, const char format[], va_list args) {
  142. FuriString* string = furi_string_alloc();
  143. int ret = furi_string_vprintf(string, format, args);
  144. furi_string_cat(v, string);
  145. furi_string_free(string);
  146. return ret;
  147. }
  148. bool furi_string_empty(const FuriString* v) {
  149. return string_empty_p(v->string);
  150. }
  151. void furi_string_replace_at(FuriString* v, size_t pos, size_t len, const char str2[]) {
  152. string_replace_at(v->string, pos, len, str2);
  153. }
  154. size_t
  155. furi_string_replace(FuriString* string, FuriString* needle, FuriString* replace, size_t start) {
  156. return string_replace(string->string, needle->string, replace->string, start);
  157. }
  158. size_t furi_string_replace_str(FuriString* v, const char str1[], const char str2[], size_t start) {
  159. return string_replace_str(v->string, str1, str2, start);
  160. }
  161. void furi_string_replace_all_str(FuriString* v, const char str1[], const char str2[]) {
  162. string_replace_all_str(v->string, str1, str2);
  163. }
  164. void furi_string_replace_all(FuriString* v, const FuriString* str1, const FuriString* str2) {
  165. string_replace_all(v->string, str1->string, str2->string);
  166. }
  167. bool furi_string_start_with(const FuriString* v, const FuriString* v2) {
  168. return string_start_with_string_p(v->string, v2->string);
  169. }
  170. bool furi_string_start_with_str(const FuriString* v, const char str[]) {
  171. return string_start_with_str_p(v->string, str);
  172. }
  173. bool furi_string_end_with(const FuriString* v, const FuriString* v2) {
  174. return string_end_with_string_p(v->string, v2->string);
  175. }
  176. bool furi_string_end_with_str(const FuriString* v, const char str[]) {
  177. return string_end_with_str_p(v->string, str);
  178. }
  179. size_t furi_string_search_char(const FuriString* v, char c, size_t start) {
  180. return string_search_char(v->string, c, start);
  181. }
  182. size_t furi_string_search_rchar(const FuriString* v, char c, size_t start) {
  183. return string_search_rchar(v->string, c, start);
  184. }
  185. void furi_string_left(FuriString* v, size_t index) {
  186. string_left(v->string, index);
  187. }
  188. void furi_string_right(FuriString* v, size_t index) {
  189. string_right(v->string, index);
  190. }
  191. void furi_string_mid(FuriString* v, size_t index, size_t size) {
  192. string_mid(v->string, index, size);
  193. }
  194. void furi_string_trim(FuriString* v, const char charac[]) {
  195. string_strim(v->string, charac);
  196. }
  197. void furi_string_cat(FuriString* v, const FuriString* v2) {
  198. string_cat(v->string, v2->string);
  199. }
  200. void furi_string_cat_str(FuriString* v, const char str[]) {
  201. string_cat(v->string, str);
  202. }
  203. void furi_string_set_n(FuriString* v, const FuriString* ref, size_t offset, size_t length) {
  204. string_set_n(v->string, ref->string, offset, length);
  205. }
  206. size_t furi_string_utf8_length(FuriString* str) {
  207. return string_length_u(str->string);
  208. }
  209. void furi_string_utf8_push(FuriString* str, FuriStringUnicodeValue u) {
  210. string_push_u(str->string, u);
  211. }
  212. static m_str1ng_utf8_state_e furi_state_to_state(FuriStringUTF8State state) {
  213. switch(state) {
  214. case FuriStringUTF8StateStarting:
  215. return M_STRING_UTF8_STARTING;
  216. case FuriStringUTF8StateDecoding1:
  217. return M_STRING_UTF8_DECODING_1;
  218. case FuriStringUTF8StateDecoding2:
  219. return M_STRING_UTF8_DECODING_2;
  220. case FuriStringUTF8StateDecoding3:
  221. return M_STRING_UTF8_DOCODING_3;
  222. default:
  223. return M_STRING_UTF8_ERROR;
  224. }
  225. }
  226. static FuriStringUTF8State state_to_furi_state(m_str1ng_utf8_state_e state) {
  227. switch(state) {
  228. case M_STRING_UTF8_STARTING:
  229. return FuriStringUTF8StateStarting;
  230. case M_STRING_UTF8_DECODING_1:
  231. return FuriStringUTF8StateDecoding1;
  232. case M_STRING_UTF8_DECODING_2:
  233. return FuriStringUTF8StateDecoding2;
  234. case M_STRING_UTF8_DOCODING_3:
  235. return FuriStringUTF8StateDecoding3;
  236. default:
  237. return FuriStringUTF8StateError;
  238. }
  239. }
  240. void furi_string_utf8_decode(char c, FuriStringUTF8State* state, FuriStringUnicodeValue* unicode) {
  241. m_str1ng_utf8_state_e m_state = furi_state_to_state(*state);
  242. m_str1ng_utf8_decode(c, &m_state, unicode);
  243. *state = state_to_furi_state(m_state);
  244. }