Add cfw_string_find().
This commit is contained in:
parent
e3a666226b
commit
6f0f55365b
3 changed files with 29 additions and 0 deletions
23
src/string.c
23
src/string.c
|
@ -25,6 +25,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "object.h"
|
#include "object.h"
|
||||||
|
@ -148,6 +149,28 @@ cfw_string_append(CFWString *str, CFWString *append)
|
||||||
return true;
|
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 = {
|
static CFWClass class = {
|
||||||
.name = "CFWString",
|
.name = "CFWString",
|
||||||
.size = sizeof(CFWString),
|
.size = sizeof(CFWString),
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#define __COREFW_STRING_H__
|
#define __COREFW_STRING_H__
|
||||||
|
|
||||||
#include "class.h"
|
#include "class.h"
|
||||||
|
#include "range.h"
|
||||||
|
|
||||||
typedef struct CFWString CFWString;
|
typedef struct CFWString CFWString;
|
||||||
extern CFWClass *cfw_string;
|
extern CFWClass *cfw_string;
|
||||||
|
@ -35,5 +36,6 @@ extern const char* cfw_string_c(CFWString*);
|
||||||
extern size_t cfw_string_len(CFWString*);
|
extern size_t cfw_string_len(CFWString*);
|
||||||
extern bool cfw_string_set(CFWString*, const char*);
|
extern bool cfw_string_set(CFWString*, const char*);
|
||||||
extern bool cfw_string_append(CFWString*, CFWString*);
|
extern bool cfw_string_append(CFWString*, CFWString*);
|
||||||
|
extern size_t cfw_string_find(CFWString*, CFWString*, cfw_range_t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -56,6 +56,10 @@ main()
|
||||||
|
|
||||||
puts(cfw_string_c(s[0]));
|
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]);
|
cfw_unref(s[0]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue