public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/2] [RFC] lib: Implement support for tiny sprintf()
@ 2016-05-26 16:00 Marek Vasut
  2016-05-26 16:00 ` [U-Boot] [PATCH 2/2] [RFC] ARM: omap: Enable tiny printf/sprintf on omap3_logic Marek Vasut
  2016-05-30 17:55 ` [U-Boot] [PATCH 1/2] [RFC] lib: Implement support for tiny sprintf() Tom Rini
  0 siblings, 2 replies; 9+ messages in thread
From: Marek Vasut @ 2016-05-26 16:00 UTC (permalink / raw)
  To: u-boot

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@denx.de>
Cc: Simon Glass <sjg@chromium.org>
Cc: Tom Rini <trini@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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-05-31 19:51 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-26 16:00 [U-Boot] [PATCH 1/2] [RFC] lib: Implement support for tiny sprintf() Marek Vasut
2016-05-26 16:00 ` [U-Boot] [PATCH 2/2] [RFC] ARM: omap: Enable tiny printf/sprintf on omap3_logic Marek Vasut
2016-05-30 17:55   ` Tom Rini
2016-05-30 23:31     ` Marek Vasut
2016-05-30 17:55 ` [U-Boot] [PATCH 1/2] [RFC] lib: Implement support for tiny sprintf() Tom Rini
2016-05-30 23:30   ` Marek Vasut
2016-05-31 18:19   ` Simon Glass
2016-05-31 19:36     ` Marek Vasut
2016-05-31 19:51       ` Simon Glass

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox