dyn_string.h
Raw
1#ifndef CUTILS_DYN_STRING_H
2#define CUTILS_DYN_STRING_H
3
4#define STRING_DEFAULT_SIZE 8
5
6#include <stdlib.h>
7#include <string.h>
8#include <cutils/common.h>
9#include <cutils/vector.h>
10
11typedef struct String
12{
13 char* chars;
14 size_t capacity;
15 size_t length;
16 bool null_terminated;
17} String;
18
19String* string_with_capacity(size_t capacity, bool null_terminated);
20void delete_string(void* string);
21
22HEDLEY_INLINE
23static char string_at(const String* string, size_t index)
24{
25 return string->chars[index];
26}
27
28char string_pop_at(String* string, size_t index);
29
30bool string_insert(String* string, size_t index, char character);
31
32HEDLEY_INLINE
33static void string_remove(String* string, size_t index)
34{
35 if(index < string->length)
36 {
37 memmove(string->chars+index, string->chars+index+1, (string->length-index-1+(string->null_terminated?1:0))*sizeof(*string->chars));
38 string->length--;
39 }
40}
41void string_remove_range(String* string, size_t index, size_t length);
42size_t string_strip(String* string, char character);
43
44bool string_grow(String* string, size_t add);
45bool string_adjust_size(String* string, size_t size);
46bool string_find_char(const String* haystack, char needle, size_t* pos);
47HEDLEY_INLINE
48static bool string_find_str(const String* haystack, const String* needle, size_t* pos)
49{
50 return cutil_memmem(haystack->chars, haystack->length, needle->chars, needle->length, pos);
51}
52int string_cmp(const String* s1, const String* s2);
53int string_cmp_cstr(const String* s1, const char* s2);
54size_t string_count(const String* string, char character);
55bool string_concat(String* string, const String* other);
56Vector* string_split(const String* string, const char* set, bool null_terminated);
57
58String* from_cstring(const char* cstring, bool null_terminated);
59String* from_cstring_reuse(char* cstring, size_t capacity, bool null_terminated);
60String* from_cstring_del(char* cstring, bool null_terminated);
61char* to_cstring(const String* string);
62char* to_cstring_del(String* string);
63void string_move(String* dest, String* src);
64
65#define new_string(null_terminated) string_with_capacity(STRING_DEFAULT_SIZE, null_terminated)
66#define string_pop(string) string_pop_at(string, ((String*)string)->length-1)
67#define string_push(string, character) string_insert(string, ((String*)string)->length, character)
68
69#endif /* CUTILS_DYN_STRING_H */
70