From f35d131b0a82cca736f9670528a1e948f783852d Mon Sep 17 00:00:00 2001 From: Jerome Forissier Date: Tue, 21 Jul 2020 10:54:51 +0200 Subject: libutils: add sprintf() Preparing for C++ support in TAs. Implement sprintf() in libutils. Signed-off-by: Jerome Forissier Acked-by: Etienne Carriere Reviewed-by: Jens Wiklander --- lib/libutils/ext/include/printk.h | 2 ++ lib/libutils/ext/snprintk.c | 5 +++++ lib/libutils/isoc/include/stdio.h | 4 ++++ lib/libutils/isoc/sprintf.c | 19 +++++++++++++++++++ lib/libutils/isoc/sub.mk | 1 + 5 files changed, 31 insertions(+) create mode 100644 lib/libutils/isoc/sprintf.c diff --git a/lib/libutils/ext/include/printk.h b/lib/libutils/ext/include/printk.h index 0a5e1034..4f21b25c 100644 --- a/lib/libutils/ext/include/printk.h +++ b/lib/libutils/ext/include/printk.h @@ -22,5 +22,7 @@ int vsnprintk(char *str, size_t size, const char *fmt, va_list ap) int __vsnprintf(char *str, size_t size, const char *fmt, va_list ap, bool ext) __attribute__((__format__(__printf__, 3, 0))); +int __vsprintf(char *bf, const char *fmt, va_list ap) + __attribute__((__format__(__printf__, 2, 0))); #endif /* PRINTK_H */ diff --git a/lib/libutils/ext/snprintk.c b/lib/libutils/ext/snprintk.c index b6bb2807..8d1744ee 100644 --- a/lib/libutils/ext/snprintk.c +++ b/lib/libutils/ext/snprintk.c @@ -150,6 +150,11 @@ __vsnprintf(char *bf, size_t size, const char *fmt, va_list ap, return retval; } +int __vsprintf(char *bf, const char *fmt, va_list ap) +{ + return kprintf(fmt, TOBUFONLY, NULL, bf, ap, false); +} + /* * kprintf: scaled down version of printf(3). * diff --git a/lib/libutils/isoc/include/stdio.h b/lib/libutils/isoc/include/stdio.h index ae41dc4f..ec545207 100644 --- a/lib/libutils/isoc/include/stdio.h +++ b/lib/libutils/isoc/include/stdio.h @@ -12,6 +12,10 @@ typedef struct _FILE FILE; int printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2))); +/* sprintf() is unsafe and should not be used. Prefer snprintf(). */ +int sprintf(char *str, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))) + __attribute__ ((deprecated)); int snprintf(char *str, size_t size, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); int vsnprintf (char *str, size_t size, const char *fmt, va_list ap) diff --git a/lib/libutils/isoc/sprintf.c b/lib/libutils/isoc/sprintf.c new file mode 100644 index 00000000..663956ec --- /dev/null +++ b/lib/libutils/isoc/sprintf.c @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: BSD-2-Clause +/* + * Copyright (c) 2020, Huawei Technologies Co., Ltd + */ + +#include +#include + +int sprintf(char *str, const char *fmt, ...) +{ + int retval; + va_list ap; + + va_start(ap, fmt); + retval = __vsprintf(str, fmt, ap); + va_end(ap); + + return retval; +} diff --git a/lib/libutils/isoc/sub.mk b/lib/libutils/isoc/sub.mk index 4a092683..3811b916 100644 --- a/lib/libutils/isoc/sub.mk +++ b/lib/libutils/isoc/sub.mk @@ -11,6 +11,7 @@ srcs-y += isxdigit.c srcs-y += qsort.c cflags-qsort.c-y += -Wno-inline cflags-remove-qsort.c-y += -Wcast-align +srcs-y += sprintf.c srcs-y += snprintf.c srcs-y += stack_check.c srcs-y += strdup.c -- cgit v1.2.3