Luna/kernel/src/std/string.cpp

124 lines
2.6 KiB
C++

#include <string.h>
size_t strlen(const char* __s)
{
const char* i = __s;
for (; *i; ++i)
;
return (i - __s);
}
char* strcpy(char* dest, const char* src)
{
memcpy(dest, src, strlen(src) + 1);
return dest;
}
char* strncpy(char* dest, const char* src, size_t n)
{
size_t src_len = strlen(src) + 1; // NULL byte
memcpy(dest, src, src_len > n ? n : src_len);
return dest;
}
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 n)
{
const char* base = a;
while (*a && (*a == *b) && (size_t)(a - base) < (n - 1))
{
a++;
b++;
}
return *(const unsigned char*)a - *(const unsigned char*)b;
}
char* strncat(char* dest, const char* src, size_t n)
{
size_t dest_len = strlen(dest);
size_t i;
for (i = 0; i < n && *(src + i); i++) *(char*)(dest + dest_len + i) = *(char*)(src + i);
*(char*)(dest + dest_len + i) = '\0';
return dest;
}
char* strcat(char* dest, const char* src)
{
size_t dest_len = strlen(dest);
size_t i;
for (i = 0; *(src + i); i++) *(char*)(dest + dest_len + i) = *(char*)(src + i);
*(char*)(dest + dest_len + i) = '\0';
return dest;
}
char* strstr(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 haystack;
}
else { return NULL; }
}
haystack++;
haystack_size--;
}
return NULL;
}
void* memcpy(void* dest, const void* src, size_t n)
{
for (size_t i = 0; i < n; ++i) { *((char*)dest + i) = *((char*)src + i); }
return dest;
}
void* memset(void* dest, int c, size_t n)
{
for (size_t i = 0; i < n; ++i) { *((char*)dest + i) = (char)c; }
return dest;
}
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, void* src, size_t n)
{
if (dest == src) return dest;
if (dest > src)
{
for (long i = n - 1; i >= 0; i++) { *((char*)dest + i) = *((char*)src + i); }
}
else
{
for (long i = 0; i < (long)n; i++) { *((char*)dest + i) = *((char*)src + i); }
}
return dest;
}