CString: Add strnlen() and strndup()

This commit is contained in:
apio 2023-01-22 11:27:37 +01:00
parent 944d32de36
commit 12d2039f68
Signed by: apio
GPG Key ID: B8A7D06E42258954
2 changed files with 26 additions and 2 deletions

View File

@ -7,12 +7,16 @@ extern "C"
void* memset(void* buf, int c, usize n);
int memcmp(const void* a, const void* b, usize n);
void* memmove(void* dest, const void* src, usize n);
usize strlen(const char* str);
usize strnlen(const char* str, usize max);
int strcmp(const char* a, const char* b);
usize wcslen(const wchar_t* str);
char* strdup(const char* str);
char* strndup(const char* str, usize max);
// Copies len bytes from src into dest and adds a null terminator.
// FIXME: Replace this invented function with strlcpy().

View File

@ -46,6 +46,14 @@ extern "C"
return (usize)(i - str);
}
usize strnlen(const char* str, usize max)
{
const char* i = str;
for (; max, *i; ++i, --max)
;
return (usize)(i - str);
}
int strcmp(const char* a, const char* b)
{
while (*a && (*a == *b))
@ -68,10 +76,22 @@ extern "C"
{
const usize len = strlen(str);
char* dest = (char*)malloc_impl(len + 1).value_or(nullptr);
char* dest = (char*)calloc_impl(len + 1, 1).value_or(nullptr);
if (!dest) return nullptr;
memcpy(dest, str, len + 1);
memcpy(dest, str, len);
return dest;
}
char* strndup(const char* str, usize max)
{
const usize len = strnlen(str, max);
char* dest = (char*)calloc_impl(len + 1, 1).value_or(nullptr);
if (!dest) return nullptr;
memcpy(dest, str, len);
return dest;
}