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 <[email protected]>
Cc: Simon Glass <[email protected]>
Cc: Tom Rini <[email protected]>
---
 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

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to