user/ulib.c

161 lines
1#include "kernel/types.h"2#include "kernel/stat.h"3#include "kernel/fcntl.h"4#include "kernel/riscv.h"5#include "kernel/vm.h"6#include "user/user.h"78//9// wrapper so that it's OK if main() does not call exit().10//11void12start(int argc, char **argv)13{14  int r;15  extern int main(int argc, char **argv);16  r = main(argc, argv);17  exit(r);18}1920char*21strcpy(char *s, const char *t)22{23  char *os;2425  os = s;26  while((*s++ = *t++) != 0)27    ;28  return os;29}3031int32strcmp(const char *p, const char *q)33{34  while(*p && *p == *q)35    p++, q++;36  return (uchar)*p - (uchar)*q;37}3839uint40strlen(const char *s)41{42  int n;4344  for(n = 0; s[n]; n++)45    ;46  return n;47}4849void*50memset(void *dst, int c, uint n)51{52  char *cdst = (char *) dst;53  int i;54  for(i = 0; i < n; i++){55    cdst[i] = c;56  }57  return dst;58}5960char*61strchr(const char *s, char c)62{63  for(; *s; s++)64    if(*s == c)65      return (char*)s;66  return 0;67}6869char*70gets(char *buf, int max)71{72  int i, cc;73  char c;7475  for(i=0; i+1 < max; ){76    cc = read(0, &c, 1);77    if(cc < 1)78      break;79    buf[i++] = c;80    if(c == '\n' || c == '\r')81      break;82  }83  buf[i] = '\0';84  return buf;85}8687int88stat(const char *n, struct stat *st)89{90  int fd;91  int r;9293  fd = open(n, O_RDONLY);94  if(fd < 0)95    return -1;96  r = fstat(fd, st);97  close(fd);98  return r;99}100101int102atoi(const char *s)103{104  int n;105106  n = 0;107  while('0' <= *s && *s <= '9')108    n = n*10 + *s++ - '0';109  return n;110}111112void*113memmove(void *vdst, const void *vsrc, int n)114{115  char *dst;116  const char *src;117118  dst = vdst;119  src = vsrc;120  if (src > dst) {121    while(n-- > 0)122      *dst++ = *src++;123  } else {124    dst += n;125    src += n;126    while(n-- > 0)127      *--dst = *--src;128  }129  return vdst;130}131132int133memcmp(const void *s1, const void *s2, uint n)134{135  const char *p1 = s1, *p2 = s2;136  while (n-- > 0) {137    if (*p1 != *p2) {138      return *p1 - *p2;139    }140    p1++;141    p2++;142  }143  return 0;144}145146void *147memcpy(void *dst, const void *src, uint n)148{149  return memmove(dst, src, n);150}151152char *153sbrk(int n) {154  return sys_sbrk(n, SBRK_EAGER);155}156157char *158sbrklazy(int n) {159  return sys_sbrk(n, SBRK_LAZY);160}161162