diff --git a/LibC/stdio.cpp b/LibC/stdio.cpp index b108896643..f4a34a8d07 100644 --- a/LibC/stdio.cpp +++ b/LibC/stdio.cpp @@ -296,6 +296,33 @@ int sprintf(char* buffer, const char* fmt, ...) return ret; } +static size_t __vsnprintf_space_remaining; +static void sized_buffer_putch(char*& bufptr, char ch) +{ + if (__vsnprintf_space_remaining) { + *bufptr++ = ch; + --__vsnprintf_space_remaining; + } +} + +int vsnprintf(char* buffer, size_t size, const char* fmt, va_list ap) +{ + __vsnprintf_space_remaining = size; + int ret = printfInternal(sized_buffer_putch, buffer, fmt, ap); + buffer[ret] = '\0'; + return ret; +} + +int snprintf(char* buffer, size_t size, const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int ret = vsnprintf(buffer, size, fmt, ap); + buffer[ret] = '\0'; + va_end(ap); + return ret; +} + void perror(const char* s) { fprintf(stderr, "%s: %s\n", s, strerror(errno)); diff --git a/LibC/stdio.h b/LibC/stdio.h index f44e37fed0..f9c5ca0611 100644 --- a/LibC/stdio.h +++ b/LibC/stdio.h @@ -52,10 +52,12 @@ size_t fread(void* ptr, size_t size, size_t nmemb, FILE*); size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE*); int vfprintf(FILE*, const char* fmt, va_list); int vsprintf(char* buffer, const char* fmt, va_list); +int vsnprintf(char* buffer, size_t, const char* fmt, va_list); int fprintf(FILE*, const char* fmt, ...); int printf(const char* fmt, ...); int dbgprintf(const char* fmt, ...); int sprintf(char* buffer, const char* fmt, ...); +int snprintf(char* buffer, size_t, const char* fmt, ...); int putchar(int ch); int putc(int ch, FILE*); int puts(const char*); diff --git a/LibC/stdlib.cpp b/LibC/stdlib.cpp index 2c11843ef7..4be45c7d2f 100644 --- a/LibC/stdlib.cpp +++ b/LibC/stdlib.cpp @@ -244,4 +244,9 @@ void srand(unsigned seed) s_next_rand = seed; } +int abs(int i) +{ + return i < 0 ? -i : i; +} + } diff --git a/LibC/stdlib.h b/LibC/stdlib.h index 696d5c0a43..7af51814ae 100644 --- a/LibC/stdlib.h +++ b/LibC/stdlib.h @@ -20,6 +20,7 @@ void exit(int status) __NORETURN; void abort() __NORETURN; char* ptsname(int fd); int ptsname_r(int fd, char* buffer, size_t); +int abs(int); #define RAND_MAX 32767 int rand(); diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp index d685d7db0c..284d61901e 100644 --- a/LibC/unistd.cpp +++ b/LibC/unistd.cpp @@ -24,6 +24,11 @@ int execve(const char* filename, const char** argv, const char** envp) __RETURN_WITH_ERRNO(rc, rc, -1); } +int execvp(const char* filename, const char** argv) +{ + return execve(filename, argv, nullptr); +} + uid_t getuid() { return syscall(SC_getuid); diff --git a/LibC/unistd.h b/LibC/unistd.h index 22a7979d5c..a6e371ea95 100644 --- a/LibC/unistd.h +++ b/LibC/unistd.h @@ -11,6 +11,7 @@ extern char** environ; inline int getpagesize() { return 4096; } pid_t fork(); int execve(const char* filename, const char** argv, const char** envp); +int execvp(const char* filename, const char** argv); void sync(); void _exit(int status); pid_t getsid(pid_t);