added memmem to extensions

AuthorKonata <konata@posteo.jp>
Date
Commit1d1ce8b8af0c691b1f0a2405dba5b005e6b845dc
Parent82eaa7a
6 files changed, 38 insertions(+), 30 deletions(-)
Minclude/cutils/dyn_string.h
@@ -43,10 +43,13 @@ void string_remove_range(String* string, size_t index, size_t length);
4343 size_t string_strip(String* string, char character);
4444
4545 bool string_adjust_size(String* string, size_t size);
46-/* TODO: rework find functions to take extra argument of result count
47- * and then find that many and return them in a vector/linked list */
4846 bool string_find_char(const String* haystack, const char needle, size_t* pos);
49-bool string_find_str(const String* haystack, const String* needle, size_t* pos);
47+HEDLEY_INLINE
48+static 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+}
52+
5053 size_t string_count(const String* string, char character);
5154
5255 bool string_concat(String* string, const String* other);
Minclude/cutils/extensions.h
@@ -9,6 +9,7 @@
99 #include <ctype.h>
1010 #include <stdarg.h>
1111 #include <stdio.h>
12+#include <cutils/common.h>
1213
1314 int cutil_strcasecmp(const char* s1, const char* s2);
1415 int cutil_strncasecmp(const char* s1, const char* s2, size_t n);
@@ -18,6 +19,8 @@ size_t cutil_strnlen(const char *s, size_t maxlen);
1819 char* cutil_strdup(const char *s);
1920 char* cutil_strndup(const char *s, size_t n);
2021
22+bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos);
23+
2124 #if __STDC_VERSION__ >= 199901L
2225 int cutil_asprintf(char** strp, const char* format, ...);
2326 #endif
Msrc/dyn_string.c
@@ -97,26 +97,6 @@ bool string_find_char(const String* haystack, const char needle, size_t* pos)
9797 return false;
9898 }
9999
100-bool string_find_str(const String* haystack, const String* needle, size_t* pos)
101-{
102- size_t i, j, tmp;
103-
104- for(i = 0; i < haystack->length; i++)
105- {
106- for(j = 0, tmp = i; j < needle->length && i < haystack->length; j++, i++)
107- {
108- if(haystack->chars[i] != needle->chars[j])
109- {
110- break;
111- } else if(j == needle->length-1){
112- *pos = tmp;
113- return true;
114- }
115- }
116- }
117- return false;
118-}
119-
120100 size_t string_count(const String* string, char character)
121101 {
122102 size_t i, ret = 0;
Msrc/extensions.c
@@ -75,6 +75,33 @@ char* cutil_strndup(const char *s, size_t n)
7575 return ret;
7676 }
7777
78+bool cutil_memmem(const void* haystack, size_t haystacklen, const void* needle, size_t needlelen, size_t* pos)
79+{
80+ size_t i, j, tmp;
81+ const byte* haystackb = haystack;
82+ const byte* needleb = needle;
83+
84+
85+ if (haystacklen == 0 || needlelen == 0)
86+ return false;
87+
88+ for(i = 0; i < haystacklen; i++)
89+ {
90+ for(j = 0, tmp = i; j < needlelen && i < haystacklen; j++, i++)
91+ {
92+ if(haystackb[i] != needleb[j])
93+ {
94+ break;
95+ } else if(j == needlelen-1){
96+ *pos = tmp;
97+ return true;
98+ }
99+ }
100+ }
101+
102+ return false;
103+}
104+
78105 #if __STDC_VERSION__ >= 199901L
79106 int cutil_asprintf(char** strp, const char* format, ...)
80107 {
Msrc/linked-list.c
@@ -306,7 +306,6 @@ void sll_swap(LinkedList* ll, size_t item1, size_t item2)
306306 {
307307 size_t i, first_index, second_index;
308308 SLnode *first, *second;
309- void* tmp;
310309
311310 first_index = item1 <= item2 ? item1 : item2;
312311 second_index = item1 <= item2 ? item2 : item1;
@@ -324,11 +323,7 @@ void sll_swap(LinkedList* ll, size_t item1, size_t item2)
324323 if(!first)
325324 first = second;
326325
327- tmp = first->item;
328- first->item = second->item;
329- second->item = tmp;
330-
331- /*memswap(&first->item, &second->item, sizeof(first->item));*/
326+ memswap(&first->item, &second->item, sizeof(first->item));
332327 }
333328
334329 void dll_swap(LinkedList* ll, size_t item1, size_t item2)
Msrc/test.c
@@ -107,7 +107,7 @@ static void test_string(void)
107107
108108 string = from_cstring("abcd");
109109 string2 = from_cstring("cd");
110- string_find_str(string, string2, &tmp);
110+ assert(string_find_str(string, string2, &tmp));
111111 assert(tmp == 2);
112112
113113 delete_string(string2);