Add cfw_string_find().

This commit is contained in:
Jonathan Schleifer 2012-04-08 23:10:39 +02:00
parent e3a666226b
commit 6f0f55365b
3 changed files with 29 additions and 0 deletions

View file

@ -25,6 +25,7 @@
*/
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#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),

View file

@ -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

View file

@ -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;