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