Add a few new string functions.

This commit is contained in:
Jonathan Schleifer 2012-09-30 03:46:16 +02:00
parent 377cdc9fa2
commit f97a687778
2 changed files with 89 additions and 2 deletions

View file

@ -168,7 +168,7 @@ copy(void *ptr)
return new;
}
const char*
char*
cfw_string_c(CFWString *str)
{
return str->data;
@ -232,6 +232,64 @@ cfw_string_append(CFWString *str, CFWString *append)
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
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;
}
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 = {
.name = "CFWString",
.size = sizeof(CFWString),