All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.