From ad560cff0fe4677db98561e499449dbe06e20c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Hickersberger?= Date: Sat, 24 Jun 2023 11:50:54 +0200 Subject: [PATCH] LibC: Implement `vdprintf` and `dprintf` These functions work just like `vfprintf` and `fprintf`, except that they take a file descriptor as their first argument instead of a FILE*. --- Userland/Libraries/LibC/stdio.cpp | 17 +++++++++++++++++ Userland/Libraries/LibC/stdio.h | 2 ++ 2 files changed, 19 insertions(+) diff --git a/Userland/Libraries/LibC/stdio.cpp b/Userland/Libraries/LibC/stdio.cpp index 4546a533c6..a146ffba4d 100644 --- a/Userland/Libraries/LibC/stdio.cpp +++ b/Userland/Libraries/LibC/stdio.cpp @@ -907,6 +907,23 @@ int fprintf(FILE* stream, char const* fmt, ...) return ret; } +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/vdprintf.html +int vdprintf(int fd, char const* fmt, va_list ap) +{ + // FIXME: Implement buffering so that we don't issue one write syscall for every character. + return printf_internal([fd](auto, char ch) { write(fd, &ch, 1); }, nullptr, fmt, ap); +} + +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/dprintf.html +int dprintf(int fd, char const* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int ret = vdprintf(fd, fmt, ap); + va_end(ap); + return ret; +} + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/vprintf.html int vprintf(char const* fmt, va_list ap) { diff --git a/Userland/Libraries/LibC/stdio.h b/Userland/Libraries/LibC/stdio.h index 97c58799dd..df01c1f742 100644 --- a/Userland/Libraries/LibC/stdio.h +++ b/Userland/Libraries/LibC/stdio.h @@ -79,6 +79,8 @@ int vfprintf(FILE*, char const* fmt, va_list) __attribute__((format(printf, 2, 0 int vasprintf(char** strp, char const* fmt, va_list) __attribute__((format(printf, 2, 0))); int vsprintf(char* buffer, char const* fmt, va_list) __attribute__((format(printf, 2, 0))); int vsnprintf(char* buffer, size_t, char const* fmt, va_list) __attribute__((format(printf, 3, 0))); +int vdprintf(int, char const* fmt, va_list) __attribute__((format(printf, 2, 0))); +int dprintf(int, char const* fmt, ...) __attribute__((format(printf, 2, 3))); int fprintf(FILE*, char const* fmt, ...) __attribute__((format(printf, 2, 3))); int printf(char const* fmt, ...) __attribute__((format(printf, 1, 2))); void dbgputstr(char const*, size_t);