Luna/libs/libc/src/string.cpp

210 lines
5.3 KiB
C++
Raw Normal View History

2022-10-08 10:29:06 +00:00
#include <errno.h>
#include <stdlib.h>
#include <string.h>
extern "C"
{
void* memcpy(void* dest, const void* src, size_t n)
{
2022-10-07 16:19:06 +00:00
for (size_t i = 0; i < n; ++i) { *((char*)dest + i) = *((const char*)src + i); }
return dest;
}
void* memset(void* buf, int c, size_t n)
{
for (size_t i = 0; i < n; ++i) { *((char*)buf + i) = (char)c; }
return buf;
}
void* memchr(const void* buf, int c, size_t n)
{
const char* s = (const char*)buf;
for (; n && *s != (char)c; s++, n--)
;
if (n) return (void*)(const_cast<char*>(s));
return NULL;
}
int memcmp(const void* a, const void* b, size_t n)
{
const char* _a = (const char*)a;
const char* _b = (const char*)b;
for (; n && _a == _b; n--, _a++, _b++)
;
if (!n) return 0;
if (*_a > *_b) return 1;
return -1;
}
void* memmove(void* dest, const void* src, size_t n)
{
if (dest == src) return dest;
if (dest > src)
2022-10-15 10:33:36 +00:00
for (long i = n - 1; i >= 0; i++) { *((char*)dest + i) = *((const char*)src + i); }
else
2022-10-15 10:33:36 +00:00
for (long i = 0; i < (long)n; i++) { *((char*)dest + i) = *((const char*)src + i); }
return dest;
}
char* strdup(const char* str)
{
size_t len = strlen(str);
char* dest = (char*)malloc(len + 1);
if (!dest) return dest;
return (char*)memcpy(dest, str, len + 1);
}
size_t strlen(const char* str)
{
const char* i = str;
for (; *i; ++i)
;
return (i - str);
}
size_t strnlen(const char* str, size_t max)
{
char* p = (char*)memchr(str, 0, max);
return p ? p - str : max;
}
char* strcpy(char* dest, const char* src)
{
return (char*)memcpy(dest, src, strlen(src) + 1);
}
char* strncpy(char* dest, const char* src, size_t max)
{
size_t i;
for (i = 0; i < max && src[i] != 0; i++) dest[i] = src[i];
for (; i < max; i++) dest[i] = 0;
return dest;
}
size_t strlcpy(char* dest, const char* src, size_t size)
{
size_t len = strlen(src);
if (size == 0) return len;
if (len < (size - 1))
{
memcpy(dest, src, len);
dest[len] = 0;
}
else
{
memcpy(dest, src, size - 1);
dest[size - 1] = 0;
}
return len;
}
2022-10-15 10:30:49 +00:00
int strcmp(const char* a, const char* b)
{
while (*a && (*a == *b))
{
a++;
b++;
}
return *(const unsigned char*)a - *(const unsigned char*)b;
}
int strncmp(const char* a, const char* b, size_t max)
{
const char* base = a;
while (*a && (*a == *b) && (size_t)(a - base) < (max - 1))
{
a++;
b++;
}
return *(const unsigned char*)a - *(const unsigned char*)b;
}
char* strcat(char* dest, const char* src)
{
size_t dest_len = strlen(dest);
size_t i;
2022-10-07 16:19:06 +00:00
for (i = 0; *(src + i); i++) *(char*)(dest + dest_len + i) = *(const char*)(src + i);
*(char*)(dest + dest_len + i) = '\0';
return dest;
}
char* strncat(char* dest, const char* src, size_t max)
{
size_t dest_len = strlen(dest);
size_t i;
for (i = 0; i < max && *(src + i); i++) *(char*)(dest + dest_len + i) = *(const char*)(src + i);
*(char*)(dest + dest_len + i) = '\0';
return dest;
}
char* strchr(const char* str, int c)
{
while (*str && *str != (char)c) str++;
2022-10-11 17:50:18 +00:00
if (*str) return const_cast<char*>(str);
return NULL;
}
2022-10-02 17:13:33 +00:00
2022-10-15 13:16:19 +00:00
char* strrchr(const char* str, int c)
{
const char* s = str + strlen(str);
2022-10-15 14:06:41 +00:00
while (s != str && *s != (char)c) s--;
2022-10-15 13:16:19 +00:00
if (s != str) return const_cast<char*>(s);
2022-10-15 14:06:41 +00:00
if (*s == (char)c) return const_cast<char*>(s);
2022-10-15 13:16:19 +00:00
return NULL;
}
void* bzero(void* buf, size_t n)
2022-10-02 17:13:33 +00:00
{
return memset(buf, 0, n);
2022-10-02 17:13:33 +00:00
}
2022-10-08 10:29:06 +00:00
2022-10-15 10:33:36 +00:00
char* strstr(const char* haystack, const char* needle)
{
size_t needle_size = strlen(needle);
size_t haystack_size = strlen(haystack);
while (*haystack)
{
if (*haystack == *needle)
{
if (needle_size <= haystack_size)
{
if (!strncmp(haystack, needle, needle_size)) return const_cast<char*>(haystack);
}
else { return NULL; }
}
haystack++;
haystack_size--;
}
return NULL;
}
2022-10-08 10:29:06 +00:00
#pragma GCC push_options
#pragma GCC diagnostic ignored "-Wwrite-strings"
char* strerror(int err)
2022-10-08 10:29:06 +00:00
{
switch (err)
2022-10-08 10:29:06 +00:00
{
case EPERM: return "Operation not permitted";
case EINVAL: return "Invalid argument";
2022-10-12 10:01:18 +00:00
case ENOMEM: return "Cannot allocate memory";
case ENOSYS: return "Function not implemented";
case ENOENT: return "No such file or directory";
case EBADF: return "Bad file descriptor";
case EMFILE: return "Too many open files";
case EISDIR: return "Is a directory";
case ENOEXEC: return "Exec format error";
2022-10-12 17:25:35 +00:00
case EFAULT: return "Bad address";
case 0: return "Success";
default: return "Unknown error";
2022-10-08 10:29:06 +00:00
}
}
#pragma GCC pop_options
}