197 lines
4.0 KiB
C
197 lines
4.0 KiB
C
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
/* VSCode gets upset if these aren't undef'd */
|
|
#undef memcpy
|
|
#undef memset
|
|
#undef memmove
|
|
#undef strcpy
|
|
#undef strncpy
|
|
#undef strcat
|
|
#undef strncpy
|
|
#undef strncat
|
|
|
|
int strcmp(const char *s1, const char *s2) {
|
|
while (*s1 && (*s1 == *s2)) {
|
|
s1++;
|
|
s2++;
|
|
}
|
|
return *(unsigned char *)s1 - *(unsigned char *)s2;
|
|
}
|
|
|
|
void *memcpy(void *dest, const void *src, size_t n) {
|
|
unsigned char *d = (unsigned char *)dest;
|
|
const unsigned char *s = (const unsigned char *)src;
|
|
for (size_t i = 0; i < n; i++) {
|
|
d[i] = s[i];
|
|
}
|
|
return dest;
|
|
}
|
|
|
|
void *memset(void *s, int c, size_t n) {
|
|
unsigned char *p = (unsigned char *)s;
|
|
for (size_t i = 0; i < n; i++) {
|
|
p[i] = (unsigned char)c;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
void *memset32(uint32_t *s, uint32_t c, size_t n) {
|
|
for (size_t i = 0; i < n; i++) {
|
|
s[i] = c;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
void *memmove(void *dest, const void *src, size_t n) {
|
|
unsigned char *d = (unsigned char *)dest;
|
|
const unsigned char *s = (const unsigned char *)src;
|
|
if (d < s) {
|
|
for (size_t i = 0; i < n; i++) {
|
|
d[i] = s[i];
|
|
}
|
|
} else if (d > s) {
|
|
for (size_t i = n; i > 0; i--) {
|
|
d[i - 1] = s[i - 1];
|
|
}
|
|
}
|
|
return dest;
|
|
}
|
|
|
|
size_t strlen(const char *s) {
|
|
size_t len = 0;
|
|
while (s[len]) {
|
|
len++;
|
|
}
|
|
return len;
|
|
}
|
|
|
|
char *strcpy(char *dest, const char *src) {
|
|
char *d = dest;
|
|
while ((*d++ = *src++));
|
|
return dest;
|
|
}
|
|
|
|
char *strncpy(char *dest, const char *src, size_t n) {
|
|
char *d = dest;
|
|
size_t i;
|
|
for (i = 0; i < n && src[i]; i++) {
|
|
d[i] = src[i];
|
|
}
|
|
for (; i < n; i++) {
|
|
d[i] = '\0';
|
|
}
|
|
return dest;
|
|
}
|
|
|
|
char *strcat(char *dest, const char *src) {
|
|
char *d = dest;
|
|
while (*d) {
|
|
d++;
|
|
}
|
|
while ((*d++ = *src++));
|
|
return dest;
|
|
}
|
|
|
|
char *strchr(const char *s, int c) {
|
|
while (*s) {
|
|
if (*s == (char)c) {
|
|
return (char *)s;
|
|
}
|
|
s++;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
char *strrchr(const char *s, int c) {
|
|
const char *last = NULL;
|
|
while (*s) {
|
|
if (*s == (char)c) {
|
|
last = s;
|
|
}
|
|
s++;
|
|
}
|
|
return (char *)last;
|
|
}
|
|
|
|
int strncmp(const char *s1, const char *s2, size_t n) {
|
|
for (size_t i = 0; i < n; i++) {
|
|
if (s1[i] != s2[i]) {
|
|
return (unsigned char)s1[i] - (unsigned char)s2[i];
|
|
}
|
|
if (s1[i] == '\0') {
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
char *strncat(char *dest, const char *src, size_t n) {
|
|
char *d = dest;
|
|
while (*d) {
|
|
d++;
|
|
}
|
|
for (size_t i = 0; i < n && src[i]; i++) {
|
|
*d++ = src[i];
|
|
}
|
|
*d = '\0';
|
|
return dest;
|
|
}
|
|
|
|
size_t strnlen(const char *s, size_t maxlen) {
|
|
size_t len = 0;
|
|
while (len < maxlen && s[len]) {
|
|
len++;
|
|
}
|
|
return len;
|
|
}
|
|
|
|
char *strstr(const char *haystack, const char *needle) {
|
|
if (!*needle) {
|
|
return (char *)haystack;
|
|
}
|
|
for (; *haystack; haystack++) {
|
|
const char *h = haystack;
|
|
const char *n = needle;
|
|
while (*h && *n && (*h == *n)) {
|
|
h++;
|
|
n++;
|
|
}
|
|
if (!*n) {
|
|
return (char *)haystack;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void *memchr(const void *s, int c, size_t n) {
|
|
const unsigned char *p = (const unsigned char *)s;
|
|
for (size_t i = 0; i < n; i++) {
|
|
if (p[i] == (unsigned char)c) {
|
|
return (void *)(p + i);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int memcmp(const void *s1, const void *s2, size_t n) {
|
|
const unsigned char *p1 = (const unsigned char *)s1;
|
|
const unsigned char *p2 = (const unsigned char *)s2;
|
|
for (size_t i = 0; i < n; i++) {
|
|
if (p1[i] != p2[i]) {
|
|
return p1[i] - p2[i];
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void *memrchr(const void *s, int c, size_t n) {
|
|
const unsigned char *p = (const unsigned char *)s;
|
|
for (size_t i = n; i > 0; i--) {
|
|
if (p[i - 1] == (unsigned char)c) {
|
|
return (void *)(p + i - 1);
|
|
}
|
|
}
|
|
return NULL;
|
|
} |