Add a few new string functions.
This commit is contained in:
parent
377cdc9fa2
commit
f97a687778
2 changed files with 89 additions and 2 deletions
83
src/string.c
83
src/string.c
|
@ -168,7 +168,7 @@ copy(void *ptr)
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char*
|
char*
|
||||||
cfw_string_c(CFWString *str)
|
cfw_string_c(CFWString *str)
|
||||||
{
|
{
|
||||||
return str->data;
|
return str->data;
|
||||||
|
@ -232,6 +232,64 @@ cfw_string_append(CFWString *str, CFWString *append)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
cfw_string_append_c(CFWString *str, const char *append)
|
||||||
|
{
|
||||||
|
size_t append_len = strlen(append);
|
||||||
|
char *new;
|
||||||
|
|
||||||
|
if ((new = realloc(str->data, str->len + append_len + 1)) == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
memcpy(new + str->len, append, append_len);
|
||||||
|
new[str->len + append_len] = 0;
|
||||||
|
|
||||||
|
str->data = new;
|
||||||
|
str->len += append_len;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
cfw_string_has_prefix(CFWString *str, CFWString *prefix)
|
||||||
|
{
|
||||||
|
if (prefix->len > str->len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !memcmp(str->data, prefix->data, prefix->len);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
cfw_string_has_prefix_c(CFWString *str, const char *prefix)
|
||||||
|
{
|
||||||
|
size_t prefix_len = strlen(prefix);
|
||||||
|
|
||||||
|
if (prefix_len > str->len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !memcmp(str->data, prefix, prefix_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
cfw_string_has_suffix(CFWString *str, CFWString *suffix)
|
||||||
|
{
|
||||||
|
if (suffix->len > str->len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !memcmp(str->data, suffix->data, suffix->len);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
cfw_string_has_suffix_c(CFWString *str, const char *suffix)
|
||||||
|
{
|
||||||
|
size_t suffix_len = strlen(suffix);
|
||||||
|
|
||||||
|
if (suffix_len > str->len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !memcmp(str->data, suffix, suffix_len);
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
cfw_string_find(CFWString *str, CFWString *substr, cfw_range_t range)
|
cfw_string_find(CFWString *str, CFWString *substr, cfw_range_t range)
|
||||||
{
|
{
|
||||||
|
@ -254,6 +312,29 @@ cfw_string_find(CFWString *str, CFWString *substr, cfw_range_t range)
|
||||||
return SIZE_MAX;
|
return SIZE_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
cfw_string_find_c(CFWString *str, const char *substr, cfw_range_t range)
|
||||||
|
{
|
||||||
|
size_t substr_len = strlen(substr);
|
||||||
|
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, substr_len))
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return SIZE_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
static CFWClass class = {
|
static CFWClass class = {
|
||||||
.name = "CFWString",
|
.name = "CFWString",
|
||||||
.size = sizeof(CFWString),
|
.size = sizeof(CFWString),
|
||||||
|
|
|
@ -35,11 +35,17 @@ extern CFWClass *cfw_string;
|
||||||
extern size_t cfw_strnlen(const char*, size_t);
|
extern size_t cfw_strnlen(const char*, size_t);
|
||||||
extern char* cfw_strdup(const char*);
|
extern char* cfw_strdup(const char*);
|
||||||
extern char* cfw_strndup(const char*, size_t);
|
extern char* cfw_strndup(const char*, size_t);
|
||||||
extern const char* cfw_string_c(CFWString*);
|
extern char* cfw_string_c(CFWString*);
|
||||||
extern size_t cfw_string_length(CFWString*);
|
extern size_t cfw_string_length(CFWString*);
|
||||||
extern bool cfw_string_set(CFWString*, const char*);
|
extern bool cfw_string_set(CFWString*, const char*);
|
||||||
extern void cfw_string_set_nocopy(CFWString*, char*, size_t);
|
extern void cfw_string_set_nocopy(CFWString*, char*, size_t);
|
||||||
extern bool cfw_string_append(CFWString*, CFWString*);
|
extern bool cfw_string_append(CFWString*, CFWString*);
|
||||||
|
extern bool cfw_string_append_c(CFWString*, const char*);
|
||||||
|
extern bool cfw_string_has_prefix(CFWString*, CFWString*);
|
||||||
|
extern bool cfw_string_has_prefix_c(CFWString*, const char*);
|
||||||
|
extern bool cfw_string_has_suffix(CFWString*, CFWString*);
|
||||||
|
extern bool cfw_string_has_suffix_c(CFWString*, const char*);
|
||||||
extern size_t cfw_string_find(CFWString*, CFWString*, cfw_range_t);
|
extern size_t cfw_string_find(CFWString*, CFWString*, cfw_range_t);
|
||||||
|
extern size_t cfw_string_find_c(CFWString*, const char*, cfw_range_t);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue