summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-10-09 12:00:43 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-10-09 12:00:43 +0200
commitbf33df12725bbf2cb88596e5eaacc4e9d70ea619 (patch)
treee03984fa8d0d586d8e11b07e58f09677408d4828 /lib
parent4283b66a953a37eaa5e9643c5cd0c6c89f7eac69 (diff)
parent65e3be9af4434785adb87be87c9cafb6bfdbb65e (diff)
downloadbarebox-bf33df12725bbf2cb88596e5eaacc4e9d70ea619.tar.gz
barebox-bf33df12725bbf2cb88596e5eaacc4e9d70ea619.tar.xz
Merge branch 'for-next/ubifs'
Diffstat (limited to 'lib')
-rw-r--r--lib/vsprintf.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index fa9fb75800..6fe0283e84 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -302,6 +302,11 @@ char *address_val(char *buf, char *end, const void *addr,
* [0][1][2][3]-[4][5]-[6][7]-[8][9]-[10][11][12][13][14][15]
* little endian output byte order is:
* [3][2][1][0]-[5][4]-[7][6]-[8][9]-[10][11][12][13][14][15]
+ * - 'V' For a struct va_format which contains a format string * and va_list *,
+ * call vsnprintf(->format, *->va_list).
+ * Implements a "recursive vsnprintf".
+ * Do not use this feature without some mechanism to verify the
+ * correctness of the format string and va_list arguments.
* - 'a[pd]' For address types [p] phys_addr_t, [d] dma_addr_t and derivatives
* (default assumed to be phys_addr_t, passed by reference)
*
@@ -318,6 +323,16 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field
if (IS_ENABLED(CONFIG_PRINTF_UUID))
return uuid_string(buf, end, ptr, field_width, precision, flags, fmt);
break;
+ case 'V':
+ {
+ va_list va;
+
+ va_copy(va, *((struct va_format *)ptr)->va);
+ buf += vsnprintf(buf, end > buf ? end - buf : 0,
+ ((struct va_format *)ptr)->fmt, va);
+ va_end(va);
+ return buf;
+ }
case 'a':
return address_val(buf, end, ptr, field_width, precision, flags, fmt);
case 'I':