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);