changed signature of delete_string() (for easier usage as rmv function)

added string_cmp_cstr()
added string_split() + tests
added casts to macros
changed name of ntoh32() to nethost32() (because it works both ways)
removed bounds check in insert functions
fixed bugs in string_concat() and from_cstring_reuse()
AuthorKonata <konata@posteo.jp>
Date
Commit1be90feadc584b8017b410735aaf8207e4e23ff4
Parent6fb96ec
9 files changed, 88 insertions(+), 18 deletions(-)
Minclude/cutils/byte_array.h
@@ -50,8 +50,8 @@ HEDLEY_NON_NULL(3)
5050 size_t* bytearray_find(const Bytearray* haystack, const void* needle, int (*cmp)(const void*, const void*));
5151
5252 #define new_bytearray(element_size) bytearray_with_capacity(BYTEARRAY_DEFAULT_SIZE, element_size)
53-#define bytearray_pop(bytearray, retptr) bytearray_pop_at(bytearray, bytearray->length-1, retptr)
54-#define bytearray_push(bytearray, item) bytearray_insert(bytearray, bytearray->length, item)
53+#define bytearray_pop(bytearray, retptr) bytearray_pop_at(bytearray, ((Vector*)vector)->length-1, retptr)
54+#define bytearray_push(bytearray, item) bytearray_insert(bytearray, ((Vector*)vector)->length, item)
5555
5656 #endif /* CUTILS_BYTE_ARRAY_H */
5757
Minclude/cutils/dyn_string.h
@@ -6,6 +6,7 @@
66 #include <stdlib.h>
77 #include <string.h>
88 #include <cutils/common.h>
9+#include <cutils/vector.h>
910
1011 typedef struct String
1112 {
@@ -16,7 +17,7 @@ typedef struct String
1617 } String;
1718
1819 String* string_with_capacity(size_t capacity, bool null_terminated);
19-void delete_string(String* string);
20+void delete_string(void* string);
2021
2122 HEDLEY_INLINE
2223 static char string_at(const String* string, size_t index)
@@ -49,10 +50,10 @@ static bool string_find_str(const String* haystack, const String* needle, size_t
4950 return cutil_memmem(haystack->chars, haystack->length, needle->chars, needle->length, pos);
5051 }
5152 int string_cmp(const String* s1, const String* s2);
52-
53+int string_cmp_cstr(const String* s1, const char* s2);
5354 size_t string_count(const String* string, char character);
54-
5555 bool string_concat(String* string, const String* other);
56+Vector* string_split(const String* string, const char* set, bool null_terminated);
5657
5758 String* from_cstring(const char* cstring, bool null_terminated);
5859 String* from_cstring_reuse(char* cstring, size_t capacity, bool null_terminated);
@@ -62,7 +63,7 @@ char* to_cstring_del(String* string);
6263 void string_move(String* dest, String* src);
6364
6465 #define new_string(null_terminated) string_with_capacity(STRING_DEFAULT_SIZE, null_terminated)
65-#define string_pop(string) string_pop_at(string, string->length-1)
66-#define string_push(string, character) string_insert(string, string->length, character)
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)
6768
6869 #endif /* CUTILS_DYN_STRING_H */
Minclude/cutils/misc.h
@@ -31,7 +31,7 @@ typedef unsigned long long ullong;
3131
3232 #if __STDC_VERSION__ >= 199901L
3333 #ifdef UINT32_MAX
34- uint32_t ntoh32(uint32_t const net);
34+ uint32_t nethost32(uint32_t const net);
3535 #endif
3636 HEDLEY_INLINE
3737 static void memqswap_stack(void* item1, void* item2, size_t length)
Minclude/cutils/vector.h
@@ -46,7 +46,7 @@ HEDLEY_NON_NULL(3)
4646 size_t* vector_find(const Vector* haystack, const void* needle, int (*cmp)(const void*, const void*));
4747
4848 #define new_vector() vector_with_capacity(VECTOR_DEFAULT_SIZE)
49-#define vector_pop(vector) vector_pop_at(vector, vector->length-1)
50-#define vector_push(vector, item) vector_insert(vector, vector->length, item)
49+#define vector_pop(vector) vector_pop_at(vector, ((Vector*)vector)->length-1)
50+#define vector_push(vector, item) vector_insert(vector, ((Vector*)vector)->length, item)
5151
5252 #endif /* CUTILS_VECTOR_H */
Msrc/byte_array.c
@@ -75,7 +75,7 @@ bool bytearray_insert(Bytearray* bytearray, size_t index, const void* item)
7575 size_t length = bytearray->length;
7676 size_t size = bytearray->element_size;
7777
78- if(index > length || !bytearray_grow(bytearray, 1))
78+ if(!bytearray_grow(bytearray, 1))
7979 return false;
8080
8181 memmove(bytearray->items+index*size+1*size, bytearray->items+index*size, (length*size-index*size)*sizeof(*bytearray->items));
Msrc/dyn_string.c
@@ -55,7 +55,7 @@ size_t string_strip(String* string, char character)
5555
5656 bool string_insert(String* string, size_t index, char character)
5757 {
58- if(index > string->length || !string_grow(string, 1))
58+ if(!string_grow(string, 1))
5959 return false;
6060
6161 memmove(string->chars+index+1, string->chars+index, (string->length-index+(string->null_terminated?1:0))*sizeof(*string->chars));
@@ -75,11 +75,12 @@ bool string_concat(String* string, const String* other)
7575 {
7676 if(other->length == 0)
7777 return true;
78- if(!string_grow(string, other->length-1))
78+ if(!string_grow(string, other->length))
7979 return false;
8080 memcpy(string->chars+string->length,other->chars,other->length);
8181 string->length += other->length;
82- string->chars[string->length] = '\0';
82+ if(string->null_terminated)
83+ string->chars[string->length] = '\0';
8384 return true;
8485 }
8586
@@ -104,6 +105,15 @@ int string_cmp(const String* s1, const String* s2)
104105 return ret;
105106 }
106107
108+int string_cmp_cstr(const String* s1, const char* s2)
109+{
110+ int ret = memcmp(s1->chars, s2, s1->length < strlen(s2) ? s1->length : strlen(s2));
111+ if(ret == 0 && s1->length != strlen(s2))
112+ return s1->length < strlen(s2) ? -1 : 1;
113+ else
114+ return ret;
115+}
116+
107117
108118 size_t string_count(const String* string, char character)
109119 {
@@ -116,6 +126,51 @@ size_t string_count(const String* string, char character)
116126 return ret;
117127 }
118128
129+Vector* string_split(const String* string, const char* set, bool null_terminated)
130+{
131+ #define CHECKRESULT(x) if(!x){delete_vector(ret, delete_string);return NULL;}
132+ size_t i, currentvec = 0, currentlen = 0;
133+ char c;
134+ const char* orig = set;
135+ String* tmp;
136+ Vector* ret = new_vector();
137+ bool is_delimiter = true;
138+
139+ if(!ret)
140+ return NULL;
141+
142+ for(i = 0; i < string->length; i++)
143+ {
144+ for(c = *set++; c != '\0'; c = *set++)
145+ {
146+ if(string_at(string, i) == c)
147+ {
148+ is_delimiter = true;
149+ currentlen = 0;
150+ break;
151+ } else {
152+ is_delimiter = false;
153+ }
154+ }
155+ if(!is_delimiter)
156+ {
157+ if(currentlen == 0)
158+ {
159+ tmp = new_string(null_terminated);
160+ CHECKRESULT(tmp);
161+ CHECKRESULT(vector_push(ret, tmp));
162+ currentvec++;
163+ }
164+ currentlen++;
165+ CHECKRESULT(string_push(vector_at(ret, currentvec-1), string_at(string, i)));
166+ }
167+ set = orig;
168+ }
169+
170+ return ret;
171+ #undef CHECKRESULT
172+}
173+
119174 bool string_grow(String* string, size_t add)
120175 {
121176 if(string->length+add < string->length)
@@ -143,9 +198,9 @@ bool string_adjust_size(String* string, size_t size)
143198 }
144199
145200
146-void delete_string(String* string)
201+void delete_string(void* string)
147202 {
148- free(string->chars);
203+ free(((String*)string)->chars);
149204 free(string);
150205 }
151206
@@ -178,6 +233,7 @@ String* from_cstring_reuse(char* cstring, size_t capacity, bool null_terminated)
178233 string->chars = cstring;
179234 string->length = strlen(cstring);
180235 string->capacity = capacity;
236+ string->null_terminated = null_terminated;
181237
182238 return string;
183239 }
Msrc/misc.c
@@ -12,7 +12,7 @@ void sleep_ms(unsigned int milliseconds)
1212
1313 #if __STDC_VERSION__ >= 199901L
1414 #ifdef UINT32_MAX
15-uint32_t ntoh32(uint32_t const net)
15+uint32_t nethost32(uint32_t const net)
1616 {
1717 uint8_t data[4];
1818 memcpy(&data, &net, sizeof(data));
Msrc/test.c
@@ -72,6 +72,7 @@ static void test_string(void)
7272 char* cstring;
7373 size_t tmp;
7474 int truth;
75+ Vector* vec;
7576
7677 for(truth = false; truth == false || truth == true; truth++)
7778 {
@@ -160,6 +161,18 @@ static void test_string(void)
160161 free(string);
161162 free(string2);
162163
164+ string = from_cstring(" -hi1 hi2 hello3 ; hi4!-!hi5- ", false);
165+ vec = string_split(string, " ;-", true);
166+ assert(vec->length == 5);
167+ assert(string_cmp_cstr(vector_at(vec,0), "hi1") == 0);
168+ assert(string_cmp_cstr(vector_at(vec,1), "hi2") == 0);
169+ assert(string_cmp_cstr(vector_at(vec,2), "hello3") == 0);
170+ assert(string_cmp_cstr(vector_at(vec,3), "hi4!") == 0);
171+ assert(string_cmp_cstr(vector_at(vec,4), "!hi5") == 0);
172+
173+ delete_string(string);
174+ delete_vector(vec, delete_string);
175+
163176 }
164177
165178 static void test_bytearray(void)
Msrc/vector.c
@@ -61,7 +61,7 @@ size_t* vector_find(const Vector* haystack, const void* needle, int (*cmp)(const
6161
6262 bool vector_insert(Vector* vector, size_t index, void* item)
6363 {
64- if(index > vector->length || !vector_grow(vector, 1))
64+ if(!vector_grow(vector, 1))
6565 return false;
6666
6767 memmove(vector->items+index+1, vector->items+index, (vector->length-index)*sizeof(*vector->items));