diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/include/stdio.h | 2 | ||||
-rw-r--r-- | lib/libc/src/hyra/spawn.c | 7 | ||||
-rw-r--r-- | lib/libc/src/main.c | 7 | ||||
-rw-r--r-- | lib/libc/src/stdio/snprintf.c | 15 | ||||
-rw-r--r-- | lib/libc/src/stdio/vsnprintf.c | 6 |
5 files changed, 34 insertions, 3 deletions
diff --git a/lib/libc/include/stdio.h b/lib/libc/include/stdio.h index d94990b..88e66f6 100644 --- a/lib/libc/include/stdio.h +++ b/lib/libc/include/stdio.h @@ -77,6 +77,8 @@ size_t fwrite(const void *__restrict ptr, size_t size, size_t n, FILE *__restric int vsnprintf(char *s, size_t size, const char *fmt, va_list ap); int snprintf(char *s, size_t size, const char *fmt, ...); + +int printf(const char *__restrict fmt, ...); int fputc(int c, FILE *stream); int putchar(int c); diff --git a/lib/libc/src/hyra/spawn.c b/lib/libc/src/hyra/spawn.c index 227d8f7..b4c92ef 100644 --- a/lib/libc/src/hyra/spawn.c +++ b/lib/libc/src/hyra/spawn.c @@ -35,10 +35,13 @@ * Spawn a process * * @pathname: Path to executable. + * @argv: Argument vector + * @envp: Environment vector * @flags: Spawn flags. */ pid_t -spawn(const char *pathname, int flags) +spawn(const char *pathname, char **argv, char **envp, int flags) { - return syscall(SYS_spawn, (uintptr_t)pathname, flags); + return syscall(SYS_spawn, (uintptr_t)pathname, (uintptr_t)argv, + (uintptr_t)envp, flags); } diff --git a/lib/libc/src/main.c b/lib/libc/src/main.c index d16b93e..16e27ad 100644 --- a/lib/libc/src/main.c +++ b/lib/libc/src/main.c @@ -38,10 +38,15 @@ int __libc_entry(uint64_t *ctx) { int status; + uint64_t argc; + char **argv; + + argc = *(ctx++); + argv = (char **)((ctx++)); if ((status = __libc_stdio_init()) != 0) { return status; } - return main(0, NULL); + return main(argc, argv); } diff --git a/lib/libc/src/stdio/snprintf.c b/lib/libc/src/stdio/snprintf.c index e343b77..2387950 100644 --- a/lib/libc/src/stdio/snprintf.c +++ b/lib/libc/src/stdio/snprintf.c @@ -30,6 +30,7 @@ #include <sys/types.h> #include <stdio.h> #include <stddef.h> +#include <unistd.h> /* TODO FIXME: Use stdarg.h */ #define __va_start(ap, fmt) __builtin_va_start(ap, fmt) @@ -46,3 +47,17 @@ snprintf(char *s, size_t size, const char *fmt, ...) __va_end(ap); return ret; } + +int +printf(const char *__restrict fmt, ...) +{ + char buf[512]; + va_list ap; + int ret; + + __va_start(ap, fmt); + ret = vsnprintf(buf, sizeof(buf), fmt, ap); + write(stdout->fd, buf, ret); + __va_end(ap); + return ret; +} diff --git a/lib/libc/src/stdio/vsnprintf.c b/lib/libc/src/stdio/vsnprintf.c index 0e29600..24b2df6 100644 --- a/lib/libc/src/stdio/vsnprintf.c +++ b/lib/libc/src/stdio/vsnprintf.c @@ -123,6 +123,12 @@ vsnprintf(char *s, size_t size, const char *fmt, va_list ap) num = __va_arg(ap, uint64_t); itoa(num, num_buf, 16); tmp_len = strlen(num_buf); + if (pad_width > 0) { + num_len = strlen(num_buf); + for (size_t i = num_len; i < pad_width; ++i) + printc(s, size, &off, '0'); + pad_width = 0; + } printstr(s, size, &off, num_buf + 2); break; case 's': |