aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Forissier <jerome@forissier.org>2020-07-21 10:54:51 +0200
committerJérôme Forissier <jerome@forissier.org>2020-08-06 11:10:44 +0200
commitf35d131b0a82cca736f9670528a1e948f783852d (patch)
treec610e1671f75c9bf40eab20d50c6bdf7ffc4d92e
parent9784c6557744c727126f29a5c63e7dc2d4432300 (diff)
libutils: add sprintf()
Preparing for C++ support in TAs. Implement sprintf() in libutils. Signed-off-by: Jerome Forissier <jerome@forissier.org> Acked-by: Etienne Carriere <etienne.carriere@linaro.org> Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
-rw-r--r--lib/libutils/ext/include/printk.h2
-rw-r--r--lib/libutils/ext/snprintk.c5
-rw-r--r--lib/libutils/isoc/include/stdio.h4
-rw-r--r--lib/libutils/isoc/sprintf.c19
-rw-r--r--lib/libutils/isoc/sub.mk1
5 files changed, 31 insertions, 0 deletions
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 <printk.h>
+#include <stdio.h>
+
+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