added from_cstring_reuse(), added string_cmp(), string_move() + tests
Minclude/cutils/dyn_string.h
| @@ -49,15 +49,21 @@ static bool string_find_str(const String* haystack, const String* needle, size_t | |||
|---|---|---|---|
| 49 | 49 | { | |
| 50 | 50 | return cutil_memmem(haystack->chars, haystack->length, needle->chars, needle->length, pos); | |
| 51 | 51 | } | |
| 52 | + | HEDLEY_INLINE | |
| 53 | + | static int string_cmp(const String* s1, const String* s2) | |
| 54 | + | { | |
| 55 | + | return memcmp(s1->chars, s2->chars, s1->length); | |
| 56 | + | } | |
| 52 | 57 | ||
| 53 | 58 | size_t string_count(const String* string, char character); | |
| 54 | 59 | ||
| 55 | 60 | bool string_concat(String* string, const String* other); | |
| 56 | 61 | ||
| 57 | 62 | String* from_cstring(const char* cstring); | |
| 63 | + | String* from_cstring_reuse(char* cstring, size_t capacity); | |
| 58 | 64 | String* from_cstring_del(char* cstring); | |
| 59 | 65 | char* to_cstring(const String* string); | |
| 60 | 66 | char* to_cstring_del(String* string); | |
| 61 | - | ||
| 67 | + | void string_move(String* dest, String* src); | |
| 62 | 68 | ||
| 63 | 69 | #endif /* CUTILS_DYN_STRING_H */ | |
Msrc/bitfuncs.c
| @@ -13,6 +13,8 @@ char* _bitstring(size_t size, uintmax_t value) | |||
|---|---|---|---|
| 13 | 13 | { | |
| 14 | 14 | leading_zero = false; | |
| 15 | 15 | ret = malloc(size-i); | |
| 16 | + | if(!ret) | |
| 17 | + | return NULL; | |
| 16 | 18 | ret[size-i-1] = '\0'; | |
| 17 | 19 | } | |
| 18 | 20 | if(!leading_zero) | |
Msrc/dyn_string.c
| @@ -142,7 +142,23 @@ String* from_cstring(const char* cstring) | |||
|---|---|---|---|
| 142 | 142 | string->length = strlen(cstring); | |
| 143 | 143 | return string; | |
| 144 | 144 | } | |
| 145 | + | } | |
| 146 | + | ||
| 147 | + | String* from_cstring_reuse(char* cstring, size_t capacity) | |
| 148 | + | { | |
| 149 | + | String* string; | |
| 150 | + | ||
| 151 | + | if(cstring) | |
| 152 | + | return NULL; | |
| 153 | + | ||
| 154 | + | string = malloc(sizeof(*string)); | |
| 155 | + | if(!string) | |
| 156 | + | return NULL; | |
| 157 | + | ||
| 158 | + | string->length = strlen(cstring); | |
| 159 | + | string->capacity = capacity; | |
| 145 | 160 | ||
| 161 | + | return string; | |
| 146 | 162 | } | |
| 147 | 163 | ||
| 148 | 164 | String* from_cstring_del(char* cstring) | |
| @@ -167,3 +183,10 @@ char* to_cstring_del(String* string) | |||
|---|---|---|---|
| 167 | 183 | delete_string(string); | |
| 168 | 184 | return ret; | |
| 169 | 185 | } | |
| 186 | + | ||
| 187 | + | void string_move(String* dest, String* src) | |
| 188 | + | { | |
| 189 | + | free(dest->chars); | |
| 190 | + | dest->chars = src->chars; | |
| 191 | + | free(src); | |
| 192 | + | } | |
Msrc/test.c
| @@ -125,6 +125,13 @@ static void test_string(void) | |||
|---|---|---|---|
| 125 | 125 | ||
| 126 | 126 | cstring = to_cstring_del(string); | |
| 127 | 127 | free(cstring); | |
| 128 | + | ||
| 129 | + | ||
| 130 | + | string = from_cstring("asdyx782"); | |
| 131 | + | string2 = from_cstring("asdyx782"); | |
| 132 | + | assert(string_cmp(string, string2) == 0); | |
| 133 | + | delete_string(string2); | |
| 134 | + | delete_string(string); | |
| 128 | 135 | } | |
| 129 | 136 | ||
| 130 | 137 | static void test_bytearray(void) | |