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