diff --git a/src/string.c b/src/string.c index 5683920..407ea89 100644 --- a/src/string.c +++ b/src/string.c @@ -25,6 +25,7 @@ */ #include +#include #include #include "object.h" @@ -148,6 +149,28 @@ cfw_string_append(CFWString *str, CFWString *append) return true; } +size_t +cfw_string_find(CFWString *str, CFWString *substr, cfw_range_t range) +{ + size_t i; + + if (range.start > str->len) + return SIZE_MAX; + + if (range.length == SIZE_MAX) + range.length = str->len - range.start; + + if (range.start + range.length > str->len || substr->len > range.length) + return SIZE_MAX; + + for (i = range.start; i <= range.start + range.length - substr->len; + i++) + if (!memcmp(str->data + i, substr->data, substr->len)) + return i; + + return SIZE_MAX; +} + static CFWClass class = { .name = "CFWString", .size = sizeof(CFWString), diff --git a/src/string.h b/src/string.h index c53a7db..22c4ef4 100644 --- a/src/string.h +++ b/src/string.h @@ -28,6 +28,7 @@ #define __COREFW_STRING_H__ #include "class.h" +#include "range.h" typedef struct CFWString CFWString; extern CFWClass *cfw_string; @@ -35,5 +36,6 @@ extern const char* cfw_string_c(CFWString*); extern size_t cfw_string_len(CFWString*); extern bool cfw_string_set(CFWString*, const char*); extern bool cfw_string_append(CFWString*, CFWString*); +extern size_t cfw_string_find(CFWString*, CFWString*, cfw_range_t); #endif diff --git a/tests/tests.c b/tests/tests.c index 8717477..9853353 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -56,6 +56,10 @@ main() puts(cfw_string_c(s[0])); + s[1] = cfw_new(cfw_string, "ll"); + printf("%zd\n", cfw_string_find(s[0], s[1], cfw_range_all)); + cfw_unref(s[1]); + cfw_unref(s[0]); return 0;