string.c revision 12771
110448Snilay@cs.wisc.edu#include <string.h> 210448Snilay@cs.wisc.edu#include <stdint.h> 310448Snilay@cs.wisc.edu#include <ctype.h> 410448Snilay@cs.wisc.edu 510448Snilay@cs.wisc.eduvoid* memcpy(void* dest, const void* src, size_t len) 610448Snilay@cs.wisc.edu{ 710448Snilay@cs.wisc.edu if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { 810448Snilay@cs.wisc.edu const uintptr_t* s = src; 910448Snilay@cs.wisc.edu uintptr_t *d = dest; 1010448Snilay@cs.wisc.edu while (d < (uintptr_t*)(dest + len)) 1110448Snilay@cs.wisc.edu *d++ = *s++; 1210448Snilay@cs.wisc.edu } else { 1310448Snilay@cs.wisc.edu const char* s = src; 1410448Snilay@cs.wisc.edu char *d = dest; 1510448Snilay@cs.wisc.edu while (d < (char*)(dest + len)) 1610448Snilay@cs.wisc.edu *d++ = *s++; 1710448Snilay@cs.wisc.edu } 1810448Snilay@cs.wisc.edu return dest; 1910448Snilay@cs.wisc.edu} 2010448Snilay@cs.wisc.edu 2110448Snilay@cs.wisc.eduvoid* memset(void* dest, int byte, size_t len) 2210447Snilay@cs.wisc.edu{ 2310447Snilay@cs.wisc.edu if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { 2410447Snilay@cs.wisc.edu uintptr_t word = byte & 0xFF; 2510447Snilay@cs.wisc.edu word |= word << 8; 2610447Snilay@cs.wisc.edu word |= word << 16; 2710447Snilay@cs.wisc.edu word |= word << 16 << 16; 2810447Snilay@cs.wisc.edu 2910447Snilay@cs.wisc.edu uintptr_t *d = dest; 3010447Snilay@cs.wisc.edu while (d < (uintptr_t*)(dest + len)) 3110447Snilay@cs.wisc.edu *d++ = word; 3210447Snilay@cs.wisc.edu } else { 3310447Snilay@cs.wisc.edu char *d = dest; 3410447Snilay@cs.wisc.edu while (d < (char*)(dest + len)) 3510447Snilay@cs.wisc.edu *d++ = byte; 3610447Snilay@cs.wisc.edu } 3710447Snilay@cs.wisc.edu return dest; 3810447Snilay@cs.wisc.edu} 3910447Snilay@cs.wisc.edu 4010447Snilay@cs.wisc.edusize_t strlen(const char *s) 4110447Snilay@cs.wisc.edu{ 4210447Snilay@cs.wisc.edu const char *p = s; 4310447Snilay@cs.wisc.edu while (*p) 4410447Snilay@cs.wisc.edu p++; 4510447Snilay@cs.wisc.edu return p - s; 4610447Snilay@cs.wisc.edu} 4710447Snilay@cs.wisc.edu 4810447Snilay@cs.wisc.eduint strcmp(const char* s1, const char* s2) 4910447Snilay@cs.wisc.edu{ 5010447Snilay@cs.wisc.edu unsigned char c1, c2; 5110447Snilay@cs.wisc.edu 5210447Snilay@cs.wisc.edu do { 5310447Snilay@cs.wisc.edu c1 = *s1++; 5410447Snilay@cs.wisc.edu c2 = *s2++; 5510447Snilay@cs.wisc.edu } while (c1 != 0 && c1 == c2); 5610447Snilay@cs.wisc.edu 5710447Snilay@cs.wisc.edu return c1 - c2; 5810447Snilay@cs.wisc.edu} 5910447Snilay@cs.wisc.edu 6010447Snilay@cs.wisc.eduint memcmp(const void* s1, const void* s2, size_t n) 6110447Snilay@cs.wisc.edu{ 6210447Snilay@cs.wisc.edu if ((((uintptr_t)s1 | (uintptr_t)s2) & (sizeof(uintptr_t)-1)) == 0) { 6310447Snilay@cs.wisc.edu const uintptr_t* u1 = s1; 6410447Snilay@cs.wisc.edu const uintptr_t* u2 = s2; 6510447Snilay@cs.wisc.edu const uintptr_t* end = u1 + (n / sizeof(uintptr_t)); 6610447Snilay@cs.wisc.edu while (u1 < end) { 6710447Snilay@cs.wisc.edu if (*u1 != *u2) 6810447Snilay@cs.wisc.edu break; 6910447Snilay@cs.wisc.edu u1++; 7010447Snilay@cs.wisc.edu u2++; 7110447Snilay@cs.wisc.edu } 7210447Snilay@cs.wisc.edu n -= (const void*)u1 - s1; 7310447Snilay@cs.wisc.edu s1 = u1; 7410447Snilay@cs.wisc.edu s2 = u2; 7510447Snilay@cs.wisc.edu } 7610447Snilay@cs.wisc.edu 7710447Snilay@cs.wisc.edu while (n--) { 7810447Snilay@cs.wisc.edu unsigned char c1 = *(const unsigned char*)s1++; 7910447Snilay@cs.wisc.edu unsigned char c2 = *(const unsigned char*)s2++; 8010447Snilay@cs.wisc.edu if (c1 != c2) 8110447Snilay@cs.wisc.edu return c1 - c2; 8210447Snilay@cs.wisc.edu } 8310447Snilay@cs.wisc.edu 8410447Snilay@cs.wisc.edu return 0; 8510447Snilay@cs.wisc.edu} 8610447Snilay@cs.wisc.edu 8710447Snilay@cs.wisc.educhar* strcpy(char* dest, const char* src) 8810447Snilay@cs.wisc.edu{ 8910447Snilay@cs.wisc.edu char* d = dest; 9010447Snilay@cs.wisc.edu while ((*d++ = *src++)) 9110447Snilay@cs.wisc.edu ; 9210447Snilay@cs.wisc.edu return dest; 9310447Snilay@cs.wisc.edu} 9410447Snilay@cs.wisc.edu 9510447Snilay@cs.wisc.edulong atol(const char* str) 9610447Snilay@cs.wisc.edu{ 9710447Snilay@cs.wisc.edu long res = 0; 9810447Snilay@cs.wisc.edu int sign = 0; 9910447Snilay@cs.wisc.edu 10010447Snilay@cs.wisc.edu while (*str == ' ') 10110447Snilay@cs.wisc.edu str++; 10210447Snilay@cs.wisc.edu 10310447Snilay@cs.wisc.edu if (*str == '-' || *str == '+') { 10410447Snilay@cs.wisc.edu sign = *str == '-'; 10510447Snilay@cs.wisc.edu str++; 10610447Snilay@cs.wisc.edu } 10710447Snilay@cs.wisc.edu 10810447Snilay@cs.wisc.edu while (*str) { 10910447Snilay@cs.wisc.edu res *= 10; 11010447Snilay@cs.wisc.edu res += *str++ - '0'; 11110447Snilay@cs.wisc.edu } 11210447Snilay@cs.wisc.edu 11310447Snilay@cs.wisc.edu return sign ? -res : res; 11410447Snilay@cs.wisc.edu} 11510447Snilay@cs.wisc.edu