diff --git a/userspace/libc.c b/userspace/libc.c index ed2bc2a..5079314 100644 --- a/userspace/libc.c +++ b/userspace/libc.c @@ -536,7 +536,7 @@ char readc() return syscall0(SYSCALL_ID_READ); } -char readcBlock() +char getchar() { char c = 0; do { @@ -549,7 +549,7 @@ int readline(char *buf, int size) { int i = 0; for (; i < size - 1; i++) { - char key = readcBlock(); + char key = getchar(); if (key == '\n') break; @@ -570,3 +570,24 @@ void *brk(void *addr) { return (void *)syscall1(SYSCALL_ID_BRK, (unsigned int)addr); } + +void *malloc(size_t size) +{ + void *heapTop = 0; + static void *free = 0; + + if (heapTop == 0) { + heapTop = brk(0); + free = heapTop; + } else { + heapTop = brk(0); + } + + if (free + size > heapTop) { + if (brk(heapTop + size)) + return NULL; + } + + free += size; + return (free - size); +} diff --git a/userspace/libc.h b/userspace/libc.h index 0979557..411ac0e 100644 --- a/userspace/libc.h +++ b/userspace/libc.h @@ -10,6 +10,8 @@ (((c) == ' ') || ((c) == '\t') || ((c) == '\f') || ((c) == '\n') || ((c) == '\r') || \ ((c) == '\v')) #define isprint(c) ((' ' <= (c)) && ((c) <= '~')) +#define EOF (-1) + int memcmp(const void *s1, const void *s2, size_t n); void *memcpy(void *dest, const void *src, size_t n); @@ -43,6 +45,7 @@ void _exit(int status); void yolo(); int testSycall5(uint arg1, uint arg2, uint arg3, uint arg4, uint arg5); char readc(); -char readcBlock(); +char getchar(); int readline(char *buf, int size); void *brk(void *addr); +void *malloc(size_t size);