104 lines
2.2 KiB
C++
104 lines
2.2 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* s1, const char* s2)
|
|
{
|
|
while (*s1 && (*s1 == *s2))
|
|
{
|
|
s1++;
|
|
s2++;
|
|
}
|
|
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
|
|
}
|
|
|
|
int strncmp(const char* s1, const char* s2, size_t n)
|
|
{
|
|
const char* base = s1;
|
|
while (*s1 && (*s1 == *s2) && (size_t)(s1 - base) < (n - 1))
|
|
{
|
|
s1++;
|
|
s2++;
|
|
}
|
|
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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_uchar = (const char*)a;
|
|
const char* b_uchar = (const char*)b;
|
|
for (; n && a_uchar == b_uchar; n--, a_uchar++, b_uchar++)
|
|
;
|
|
if (!n) return 0;
|
|
if (*a_uchar > *b_uchar) 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;
|
|
} |