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