tiny-printf: Reorder code to support %p
authorSimon Glass <sjg@chromium.org>
Mon, 21 Oct 2019 23:26:45 +0000 (17:26 -0600)
committerSimon Glass <sjg@chromium.org>
Sun, 27 Oct 2019 16:56:51 +0000 (10:56 -0600)
With a bit of code reordering we can support %p using the existing code
for ulong.

Move the %p code up and adjust the logic accordingly.

Signed-off-by: Simon Glass <sjg@chromium.org>
lib/tiny-printf.c

index d46d206873fe0e0e37d6867a7583a9e619531e2c..4f7fc239ae9b7795e70ec3678b21469cdf4b6edc 100644 (file)
@@ -157,7 +157,8 @@ static void ip4_addr_string(struct printf_info *info, u8 *addr)
  *       decimal).
  */
 
-static void pointer(struct printf_info *info, const char *fmt, void *ptr)
+static void __maybe_unused pointer(struct printf_info *info, const char *fmt,
+                                  void *ptr)
 {
 #ifdef DEBUG
        unsigned long num = (uintptr_t)ptr;
@@ -266,6 +267,21 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
                                                div_out(info, &num, div);
                                }
                                break;
+                       case 'p':
+#ifdef DEBUG
+                               pointer(info, fmt, va_arg(va, void *));
+                               /*
+                                * Skip this because it pulls in _ctype which is
+                                * 256 bytes, and we don't generally implement
+                                * pointer anyway
+                                */
+                               while (isalnum(fmt[0]))
+                                       fmt++;
+                               break;
+#else
+                               islong = true;
+                               /* no break */
+#endif
                        case 'x':
                                if (islong) {
                                        num = va_arg(va, unsigned long);
@@ -287,18 +303,6 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
                        case 's':
                                p = va_arg(va, char*);
                                break;
-                       case 'p':
-                               pointer(info, fmt, va_arg(va, void *));
-                               /*
-                                * Skip this because it pulls in _ctype which is
-                                * 256 bytes, and we don't generally implement
-                                * pointer anyway
-                                */
-#ifdef DEBUG
-                               while (isalnum(fmt[0]))
-                                       fmt++;
-#endif
-                               break;
                        case '%':
                                out(info, '%');
                        default: