[U-Boot] [PATCH 1/2] [RFC] lib: Implement support for tiny sprintf()

Marek Vasut marex at denx.de
Thu May 26 18:00:24 CEST 2016


Tweak the tiny printf code to also provide similarly tiny sprintf()
implementation. This is not comformant with POSIX for sure, but it
keeps the size down while still behaving rather reasonably.

Signed-off-by: Marek Vasut <marex at denx.de>
Cc: Simon Glass <sjg at chromium.org>
Cc: Tom Rini <trini at konsulko.com>
---
 lib/tiny-printf.c | 38 +++++++++++++++++++++++++++++++++-----
 1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index a06abed..b9fba97 100644
--- a/lib/tiny-printf.c
+++ b/lib/tiny-printf.c
@@ -40,7 +40,17 @@ static void div_out(unsigned int *num, unsigned int div)
 		out_dgt(dgt);
 }
 
-int vprintf(const char *fmt, va_list va)
+#ifdef CONFIG_USE_TINY_SPRINTF
+#define local_putc(pbuf, ch)			\
+	if (pbuf)				\
+		*(pbuf)++ = (ch);		\
+	else					\
+		putc(ch);
+#else
+	#define local_putc(pbuf, ch)	putc(ch)
+#endif
+
+static int local_xprintf(char *pbuf, const char *fmt, va_list va)
 {
 	char ch;
 	char *p;
@@ -50,7 +60,7 @@ int vprintf(const char *fmt, va_list va)
 
 	while ((ch = *(fmt++))) {
 		if (ch != '%') {
-			putc(ch);
+			local_putc(pbuf, ch);
 		} else {
 			char lz = 0;
 			char w = 0;
@@ -115,10 +125,10 @@ int vprintf(const char *fmt, va_list va)
 			while (*bf++ && w > 0)
 				w--;
 			while (w-- > 0)
-				putc(lz ? '0' : ' ');
+				local_putc(pbuf, lz ? '0' : ' ');
 			if (p) {
 				while ((ch = *p++))
-					putc(ch);
+					local_putc(pbuf, ch);
 			}
 		}
 	}
@@ -127,13 +137,31 @@ abort:
 	return 0;
 }
 
+
+int vprintf(const char *fmt, va_list va)
+{
+	return local_xprintf(NULL, fmt, va);
+}
+
 int printf(const char *fmt, ...)
 {
 	va_list va;
 	int ret;
 
 	va_start(va, fmt);
-	ret = vprintf(fmt, va);
+	ret = local_xprintf(NULL, fmt, va);
+	va_end(va);
+
+	return ret;
+}
+
+int sprintf(char *buf, const char *fmt, ...)
+{
+	va_list va;
+	int ret;
+
+	va_start(va, fmt);
+	ret = local_xprintf(buf, fmt, va);
 	va_end(va);
 
 	return ret;
-- 
2.7.0



More information about the U-Boot mailing list