text: #include "kernel/types.h"
  #include "kernel/stat.h"
  #include "kernel/fcntl.h"
  #include "user/user.h"
  
  char*
  strcpy(char *s, const char *t)
  {
    char *os;
  
    os = s;
    while((*s++ = *t++) != 0)
      ;
    return os;
  }
  
  int
  strcmp(const char *p, const char *q)
  {
    while(*p && *p == *q)
      p++, q++;
    return (uchar)*p - (uchar)*q;
  }
  
  uint
  strlen(const char *s)
  {
    int n;
  
    for(n = 0; s[n]; n++)
      ;
    return n;
  }
  
  void*
  memset(void *dst, int c, uint n)
  {
    char *cdst = (char *) dst;
    int i;
    for(i = 0; i < n; i++){
      cdst[i] = c;
    }
    return dst;
  }
  
  char*
  strchr(const char *s, char c)
  {
    for(; *s; s++)
      if(*s == c)
        return (char*)s;
    return 0;
  }
  
  char*
  gets(char *buf, int max)
  {
    int i, cc;
    char c;
  
    for(i=0; i+1 < max; ){
      cc = read(0, &c, 1);
      if(cc < 1)
        break;
      buf[i++] = c;
      if(c == '\n' || c == '\r')
        break;
    }
    buf[i] = '\0';
    return buf;
  }
  
  int
  stat(const char *n, struct stat *st)
  {
    int fd;
    int r;
  
    fd = open(n, O_RDONLY);
    if(fd < 0)
      return -1;
    r = fstat(fd, st);
    close(fd);
    return r;
  }
  
  int
  atoi(const char *s)
  {
    int n;
  
    n = 0;
    while('0' <= *s && *s <= '9')
      n = n*10 + *s++ - '0';
    return n;
  }
  
  void*
  memmove(void *vdst, const void *vsrc, int n)
  {
    char *dst;
    const char *src;
  
    dst = vdst;
    src = vsrc;
    if (src > dst) {
      while(n-- > 0)
        *dst++ = *src++;
    } else {
      dst += n;
      src += n;
      while(n-- > 0)
        *--dst = *--src;
    }
    return vdst;
  }
  
  int
  memcmp(const void *s1, const void *s2, uint n)
  {
    const char *p1 = s1, *p2 = s2;
    while (n-- > 0) {
      if (*p1 != *p2) {
        return *p1 - *p2;
      }
      p1++;
      p2++;
    }
    return 0;
  }
  
  void *
  memcpy(void *dst, const void *src, uint n)
  {
    return memmove(dst, src, n);
  }