#include #include #include /* 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; }