From 8f7938a1e5144c6c0d44a3ac29c2d21d398e1d8d Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Wed, 12 Feb 2025 02:47:45 +0200 Subject: [PATCH] userspace/libc: implement vfprintf function Signed-off-by: EnderIce2 --- Userspace/libc/include/stdio.h | 2 +- Userspace/libc/src/std/stdio.c | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Userspace/libc/include/stdio.h b/Userspace/libc/include/stdio.h index 0ebab822..1fa695f4 100644 --- a/Userspace/libc/include/stdio.h +++ b/Userspace/libc/include/stdio.h @@ -141,7 +141,7 @@ extern "C" char *tmpnam(char *); int ungetc(int, FILE *); int vdprintf(int, const char *restrict, va_list); - int vfprintf(FILE *restrict, const char *restrict, va_list); + int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap); int vfscanf(FILE *restrict, const char *restrict, va_list); int vprintf(const char *restrict, va_list); int vscanf(const char *restrict, va_list); diff --git a/Userspace/libc/src/std/stdio.c b/Userspace/libc/src/std/stdio.c index 59a5d731..4b4e0a21 100644 --- a/Userspace/libc/src/std/stdio.c +++ b/Userspace/libc/src/std/stdio.c @@ -412,7 +412,32 @@ export FILE *tmpfile(void); export char *tmpnam(char *); export int ungetc(int, FILE *); export int vdprintf(int, const char *restrict, va_list); -export int vfprintf(FILE *restrict, const char *restrict, va_list); + +export int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap) +{ + if (!stream || !(stream->flags & _i_WRITE)) + return EOF; + + int ret = vprintf_(format, ap); + if (ret < 0) + { + stream->error = 1; + return EOF; + } + + const char *p = format; + while (*p) + { + if (fputc(*p++, stream) == EOF) + { + stream->error = 1; + return EOF; + } + } + + return ret; +} + export int vfscanf(FILE *restrict, const char *restrict, va_list); export int vprintf(const char *restrict, va_list); export int vscanf(const char *restrict, va_list);