From 625a6af45936b6ee8eab02211e109a2c64acce26 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Mon, 7 Jun 2021 19:09:55 +0200 Subject: [PATCH] stdio: add asprintf and vasprintf --- CMakeLists.txt | 2 ++ include/stdio.h | 7 +++++++ src/libc/stdio/asprintf.c | 13 +++++++++++++ src/libc/stdio/vasprintf.c | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 src/libc/stdio/asprintf.c create mode 100644 src/libc/stdio/vasprintf.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b7b624f..50ffd8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,6 +114,7 @@ set(SOURCES src/libc/signal/signal.c src/libc/signal/raise.c # stdio + src/libc/stdio/asprintf.c src/libc/stdio/dprintf.c src/libc/stdio/fprintf.c src/libc/stdio/printf.c @@ -124,6 +125,7 @@ set(SOURCES src/libc/stdio/puts.c src/libc/stdio/snprintf.c src/libc/stdio/sprintf.c + src/libc/stdio/vasprintf.c src/libc/stdio/vdprintf.c src/libc/stdio/vfprintf.c src/libc/stdio/vprintf.c diff --git a/include/stdio.h b/include/stdio.h index d579222..a67048b 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -81,4 +81,11 @@ extern int dprintf(int __fd, char const * restrict __format, ...); /* Formatted print to file descriptor (variable argument list). */ extern int vdprintf(int __fd, char const * restrict __format, va_list __args); +/* Allocating sprintf(). */ +extern int asprintf(char ** restrict __str,char const * restrict __format,...); + +/* Allocating vsprintf(). */ +extern int vasprintf(char ** restrict __str, char const * restrict __format, + va_list __args); + #endif /*__STDIO_H__*/ diff --git a/src/libc/stdio/asprintf.c b/src/libc/stdio/asprintf.c new file mode 100644 index 0000000..dea61e6 --- /dev/null +++ b/src/libc/stdio/asprintf.c @@ -0,0 +1,13 @@ +#include + +int asprintf(char **strp, char const *format, ...) +{ + va_list args; + va_start(args, format); + + int count = vasprintf(strp, format, args); + + va_end(args); + return count; +} + diff --git a/src/libc/stdio/vasprintf.c b/src/libc/stdio/vasprintf.c new file mode 100644 index 0000000..101c975 --- /dev/null +++ b/src/libc/stdio/vasprintf.c @@ -0,0 +1,19 @@ +#include +#include + +int vasprintf(char **strp, char const *format, va_list args1) +{ + va_list args2; + va_copy(args2, args1); + + int count = vsnprintf(NULL, 0, format, args1); + va_end(args1); + + char *str = malloc(count + 1); + if(str) count = vsnprintf(str, count + 1, format, args2); + va_end(args2); + + if(!str) return -1; + *strp = str; + return count; +}