// See LICENSE for license details. #include #include #include "string.h" void* memcpy(void* dest, const void* src, size_t len) { const char* s = src; char* d = dest; if ((((uintptr_t)dest | (uintptr_t)src) & (sizeof(uintptr_t) - 1)) == 0) { while ((void*)d < (dest + len - (sizeof(uintptr_t) - 1))) { *(uintptr_t*)d = *(const uintptr_t*)s; d += sizeof(uintptr_t); s += sizeof(uintptr_t); } } while (d < (char*)(dest + len)) *d++ = *s++; return dest; } void* memset(void* dest, int byte, size_t len) { if ((((uintptr_t)dest | len) & (sizeof(uintptr_t) - 1)) == 0) { uintptr_t word = byte & 0xFF; word |= word << 8; word |= word << 16; word |= word << 16 << 16; uintptr_t* d = dest; while (d < (uintptr_t*)(dest + len)) *d++ = word; } else { char* d = dest; while (d < (char*)(dest + len)) *d++ = byte; } return dest; } size_t strlen(const char* s) { const char* p = s; while (*p) p++; return p - s; } int strcmp(const char* s1, const char* s2) { unsigned char c1, c2; do { c1 = *s1++; c2 = *s2++; } while (c1 != 0 && c1 == c2); return c1 - c2; } char* strcpy(char* dest, const char* src) { char* d = dest; while ((*d++ = *src++)) ; return dest; } long atol(const char* str) { long res = 0; int sign = 0; while (*str == ' ') str++; if (*str == '-' || *str == '+') { sign = *str == '-'; str++; } while (*str) { res *= 10; res += *str++ - '0'; } return sign ? -res : res; } void* memmove(void* dst, const void* src, size_t n) { const char* s; char* d; s = src; d = dst; if (s < d && s + n > d) { s += n; d += n; while (n-- > 0) *--d = *--s; } else while (n-- > 0) *d++ = *s++; return dst; } // Like strncpy but guaranteed to NUL-terminate. char* safestrcpy(char* s, const char* t, int n) { char* os; os = s; if (n <= 0) return os; while (--n > 0 && (*s++ = *t++) != 0) ; *s = 0; return os; }