Files
net/exec/string.c
2025-12-20 18:49:21 -08:00

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;
}