lib: Support printing an error string
authorSimon Glass <sjg@chromium.org>
Tue, 17 Jan 2023 17:47:30 +0000 (10:47 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 23 Jan 2023 23:11:39 +0000 (18:11 -0500)
It is often useful to show an error code to give the user a clue as to
what went wrong. When error strings are compiled into U-Boot it is
possible to show a message as well.

But at present it is not very convenient, since code must check if the
error strings are present, then obtain the error string and use it in
a printf() string.

Add a %dE option which shows an error code along with an error string,
if available. This makes it easy to show one or both.

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

index 530d808..8de3882 100644 (file)
@@ -145,6 +145,7 @@ static noinline char *put_dec(char *buf, uint64_t num)
 #define LEFT   16              /* left justified */
 #define SMALL  32              /* Must be 32 == 0x20 */
 #define SPECIAL        64              /* 0x */
+#define ERRSTR 128             /* %dE showing error string if enabled */
 
 /*
  * Macro to add a new character to our output string, but only if it will
@@ -678,6 +679,8 @@ repeat:
                        break;
 
                case 'd':
+                       if (fmt[1] == 'E')
+                               flags |= ERRSTR;
                case 'i':
                        flags |= SIGN;
                case 'u':
@@ -712,6 +715,15 @@ repeat:
                }
                str = number(str, end, num, base, field_width, precision,
                             flags);
+               if (IS_ENABLED(CONFIG_ERRNO_STR) && (flags & ERRSTR)) {
+                       const char *p;
+
+                       ADDCH(str, ':');
+                       ADDCH(str, ' ');
+                       for (p = errno_str(num); *p; p++)
+                               ADDCH(str, *p);
+                       fmt++;
+               }
        }
 
        if (size > 0) {