112771Sqtt2@cornell.edu#include <string.h> 212771Sqtt2@cornell.edu#include <stdint.h> 312771Sqtt2@cornell.edu#include <ctype.h> 412771Sqtt2@cornell.edu 512771Sqtt2@cornell.eduvoid* memcpy(void* dest, const void* src, size_t len) 612771Sqtt2@cornell.edu{ 712771Sqtt2@cornell.edu if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { 812771Sqtt2@cornell.edu const uintptr_t* s = src; 912771Sqtt2@cornell.edu uintptr_t *d = dest; 1012771Sqtt2@cornell.edu while (d < (uintptr_t*)(dest + len)) 1112771Sqtt2@cornell.edu *d++ = *s++; 1212771Sqtt2@cornell.edu } else { 1312771Sqtt2@cornell.edu const char* s = src; 1412771Sqtt2@cornell.edu char *d = dest; 1512771Sqtt2@cornell.edu while (d < (char*)(dest + len)) 1612771Sqtt2@cornell.edu *d++ = *s++; 1712771Sqtt2@cornell.edu } 1812771Sqtt2@cornell.edu return dest; 1912771Sqtt2@cornell.edu} 2012771Sqtt2@cornell.edu 2112771Sqtt2@cornell.eduvoid* memset(void* dest, int byte, size_t len) 2212771Sqtt2@cornell.edu{ 2312771Sqtt2@cornell.edu if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { 2412771Sqtt2@cornell.edu uintptr_t word = byte & 0xFF; 2512771Sqtt2@cornell.edu word |= word << 8; 2612771Sqtt2@cornell.edu word |= word << 16; 2712771Sqtt2@cornell.edu word |= word << 16 << 16; 2812771Sqtt2@cornell.edu 2912771Sqtt2@cornell.edu uintptr_t *d = dest; 3012771Sqtt2@cornell.edu while (d < (uintptr_t*)(dest + len)) 3112771Sqtt2@cornell.edu *d++ = word; 3212771Sqtt2@cornell.edu } else { 3312771Sqtt2@cornell.edu char *d = dest; 3412771Sqtt2@cornell.edu while (d < (char*)(dest + len)) 3512771Sqtt2@cornell.edu *d++ = byte; 3612771Sqtt2@cornell.edu } 3712771Sqtt2@cornell.edu return dest; 3812771Sqtt2@cornell.edu} 3912771Sqtt2@cornell.edu 4012771Sqtt2@cornell.edusize_t strlen(const char *s) 4112771Sqtt2@cornell.edu{ 4212771Sqtt2@cornell.edu const char *p = s; 4312771Sqtt2@cornell.edu while (*p) 4412771Sqtt2@cornell.edu p++; 4512771Sqtt2@cornell.edu return p - s; 4612771Sqtt2@cornell.edu} 4712771Sqtt2@cornell.edu 4812771Sqtt2@cornell.eduint strcmp(const char* s1, const char* s2) 4912771Sqtt2@cornell.edu{ 5012771Sqtt2@cornell.edu unsigned char c1, c2; 5112771Sqtt2@cornell.edu 5212771Sqtt2@cornell.edu do { 5312771Sqtt2@cornell.edu c1 = *s1++; 5412771Sqtt2@cornell.edu c2 = *s2++; 5512771Sqtt2@cornell.edu } while (c1 != 0 && c1 == c2); 5612771Sqtt2@cornell.edu 5712771Sqtt2@cornell.edu return c1 - c2; 5812771Sqtt2@cornell.edu} 5912771Sqtt2@cornell.edu 6012771Sqtt2@cornell.eduint memcmp(const void* s1, const void* s2, size_t n) 6112771Sqtt2@cornell.edu{ 6212771Sqtt2@cornell.edu if ((((uintptr_t)s1 | (uintptr_t)s2) & (sizeof(uintptr_t)-1)) == 0) { 6312771Sqtt2@cornell.edu const uintptr_t* u1 = s1; 6412771Sqtt2@cornell.edu const uintptr_t* u2 = s2; 6512771Sqtt2@cornell.edu const uintptr_t* end = u1 + (n / sizeof(uintptr_t)); 6612771Sqtt2@cornell.edu while (u1 < end) { 6712771Sqtt2@cornell.edu if (*u1 != *u2) 6812771Sqtt2@cornell.edu break; 6912771Sqtt2@cornell.edu u1++; 7012771Sqtt2@cornell.edu u2++; 7112771Sqtt2@cornell.edu } 7212771Sqtt2@cornell.edu n -= (const void*)u1 - s1; 7312771Sqtt2@cornell.edu s1 = u1; 7412771Sqtt2@cornell.edu s2 = u2; 7512771Sqtt2@cornell.edu } 7612771Sqtt2@cornell.edu 7712771Sqtt2@cornell.edu while (n--) { 7812771Sqtt2@cornell.edu unsigned char c1 = *(const unsigned char*)s1++; 7912771Sqtt2@cornell.edu unsigned char c2 = *(const unsigned char*)s2++; 8012771Sqtt2@cornell.edu if (c1 != c2) 8112771Sqtt2@cornell.edu return c1 - c2; 8212771Sqtt2@cornell.edu } 8312771Sqtt2@cornell.edu 8412771Sqtt2@cornell.edu return 0; 8512771Sqtt2@cornell.edu} 8612771Sqtt2@cornell.edu 8712771Sqtt2@cornell.educhar* strcpy(char* dest, const char* src) 8812771Sqtt2@cornell.edu{ 8912771Sqtt2@cornell.edu char* d = dest; 9012771Sqtt2@cornell.edu while ((*d++ = *src++)) 9112771Sqtt2@cornell.edu ; 9212771Sqtt2@cornell.edu return dest; 9312771Sqtt2@cornell.edu} 9412771Sqtt2@cornell.edu 9512771Sqtt2@cornell.edulong atol(const char* str) 9612771Sqtt2@cornell.edu{ 9712771Sqtt2@cornell.edu long res = 0; 9812771Sqtt2@cornell.edu int sign = 0; 9912771Sqtt2@cornell.edu 10012771Sqtt2@cornell.edu while (*str == ' ') 10112771Sqtt2@cornell.edu str++; 10212771Sqtt2@cornell.edu 10312771Sqtt2@cornell.edu if (*str == '-' || *str == '+') { 10412771Sqtt2@cornell.edu sign = *str == '-'; 10512771Sqtt2@cornell.edu str++; 10612771Sqtt2@cornell.edu } 10712771Sqtt2@cornell.edu 10812771Sqtt2@cornell.edu while (*str) { 10912771Sqtt2@cornell.edu res *= 10; 11012771Sqtt2@cornell.edu res += *str++ - '0'; 11112771Sqtt2@cornell.edu } 11212771Sqtt2@cornell.edu 11312771Sqtt2@cornell.edu return sign ? -res : res; 11412771Sqtt2@cornell.edu} 115