]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - lib/vsprintf.c
net: hifemac_mdio: use log_msg_ret() correctly, report error by dev_err()
[thirdparty/u-boot.git] / lib / vsprintf.c
index e634bd70b667999a57660b3801c269688cd5067e..27ea9c907a32cbc936481d19b3dc8a66c994a92e 100644 (file)
@@ -13,7 +13,6 @@
  * from hush: simple_itoa() was lifted from boa-0.93.15
  */
 
-#include <common.h>
 #include <charset.h>
 #include <efi_loader.h>
 #include <div64.h>
@@ -145,6 +144,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
@@ -255,7 +255,7 @@ static char *number(char *buf, char *end, u64 num,
        return buf;
 }
 
-static char *string(char *buf, char *end, char *s, int field_width,
+static char *string(char *buf, char *end, const char *s, int field_width,
                int precision, int flags)
 {
        int len, i;
@@ -276,25 +276,34 @@ static char *string(char *buf, char *end, char *s, int field_width,
 }
 
 /* U-Boot uses UTF-16 strings in the EFI context only. */
-#if CONFIG_IS_ENABLED(EFI_LOADER) && !defined(API_BUILD)
-static char *string16(char *buf, char *end, u16 *s, int field_width,
-               int precision, int flags)
+static __maybe_unused char *string16(char *buf, char *end, u16 *s,
+                                    int field_width, int precision, int flags)
 {
-       const u16 *str = s ? s : L"<NULL>";
+       const u16 *str = s ? s : u"<NULL>";
        ssize_t i, len = utf16_strnlen(str, precision);
 
        if (!(flags & LEFT))
                for (; len < field_width; --field_width)
                        ADDCH(buf, ' ');
-       for (i = 0; i < len && buf + utf16_utf8_strnlen(str, 1) <= end; ++i) {
+       if (buf < end)
+               *buf = 0;
+       for (i = 0; i < len; ++i) {
+               int slen = utf16_utf8_strnlen(str, 1);
                s32 s = utf16_get(&str);
 
                if (s < 0)
                        s = '?';
-               utf8_put(s, &buf);
+               if (buf + slen < end) {
+                       utf8_put(s, &buf);
+                       if (buf < end)
+                               *buf = 0;
+               } else {
+                       buf += slen;
+               }
        }
        for (; len < field_width; --field_width)
                ADDCH(buf, ' ');
+
        return buf;
 }
 
@@ -317,7 +326,6 @@ static char *device_path_string(char *buf, char *end, void *dp, int field_width,
        return buf;
 }
 #endif
-#endif
 
 static char *mac_address_string(char *buf, char *end, u8 *addr, int field_width,
                                int precision, int flags)
@@ -389,12 +397,14 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width,
  *   %pUB:   01020304-0506-0708-090A-0B0C0D0E0F10
  *   %pUl:   04030201-0605-0807-090a-0b0c0d0e0f10
  *   %pUL:   04030201-0605-0807-090A-0B0C0D0E0F10
+ *   %pUs:   GUID text representation if known or fallback to %pUl
  */
 static char *uuid_string(char *buf, char *end, u8 *addr, int field_width,
                         int precision, int flags, const char *fmt)
 {
        char uuid[UUID_STR_LEN + 1];
        int str_format;
+       const char *str;
 
        switch (*(++fmt)) {
        case 'L':
@@ -406,6 +416,13 @@ static char *uuid_string(char *buf, char *end, u8 *addr, int field_width,
        case 'B':
                str_format = UUID_STR_FORMAT_STD | UUID_STR_UPPER_CASE;
                break;
+       case 's':
+               str = uuid_guid_get_str(addr);
+               if (str)
+                       return string(buf, end, str,
+                                     field_width, precision, flags);
+               str_format = UUID_STR_FORMAT_GUID;
+               break;
        default:
                str_format = UUID_STR_FORMAT_STD;
                break;
@@ -433,10 +450,6 @@ static char *uuid_string(char *buf, char *end, u8 *addr, int field_width,
  *       decimal for v4 and colon separated network-order 16 bit hex for v6)
  * - 'i' [46] for 'raw' IPv4/IPv6 addresses, IPv6 omits the colons, IPv4 is
  *       currently the same
- *
- * Note: IPv6 support is currently if(0)'ed out. If you ever need
- * %pI6, please add an IPV6 Kconfig knob, make your code select or
- * depend on that, and change the 0 below to CONFIG_IS_ENABLED(IPV6).
  */
 static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                int field_width, int precision, int flags)
@@ -481,8 +494,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                flags |= SPECIAL;
                /* Fallthrough */
        case 'I':
-               /* %pI6 currently unused */
-               if (0 && fmt[1] == '6')
+               if (IS_ENABLED(CONFIG_IPV6) && fmt[1] == '6')
                        return ip6_addr_string(buf, end, ptr, field_width,
                                               precision, flags);
                if (fmt[1] == '4')
@@ -616,7 +628,8 @@ repeat:
 
                case 's':
 /* U-Boot uses UTF-16 strings in the EFI context only. */
-#if CONFIG_IS_ENABLED(EFI_LOADER) && !defined(API_BUILD)
+#if (CONFIG_IS_ENABLED(EFI_LOADER) || IS_ENABLED(CONFIG_EFI_APP)) && \
+       !defined(API_BUILD)
                        if (qualifier == 'l') {
                                str = string16(str, end, va_arg(args, u16 *),
                                               field_width, precision, flags);
@@ -660,13 +673,20 @@ repeat:
 
                case 'x':
                        flags |= SMALL;
+               /* fallthrough */
                case 'X':
                        base = 16;
                        break;
 
                case 'd':
+                       if (fmt[1] == 'E') {
+                               flags |= ERRSTR;
+                               fmt++;
+                       }
+               /* fallthrough */
                case 'i':
                        flags |= SIGN;
+               /* fallthrough */
                case 'u':
                        break;
 
@@ -699,6 +719,14 @@ 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);
+               }
        }
 
        if (size > 0) {