efi_selftest: support printing leading zeroes

Allow specifying the precision when printing integers, e.g.

efi_st_printf("%.4u-%.2u-%.2u\n", year, month, day);

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lime2-spi
Heinrich Schuchardt 6 years ago committed by Alexander Graf
parent 49de24559d
commit 42e2b563f6
  1. 33
      lib/efi_selftest/efi_selftest_console.c

@ -70,11 +70,12 @@ static void pointer(void *pointer, u16 **buf)
/* /*
* Print an unsigned 32bit value as decimal number to an u16 string * Print an unsigned 32bit value as decimal number to an u16 string
* *
* @value: value to be printed * @value: value to be printed
* @buf: pointer to buffer address * @prec: minimum number of digits to display
* on return position of terminating zero word * @buf: pointer to buffer address
* on return position of terminating zero word
*/ */
static void uint2dec(u32 value, u16 **buf) static void uint2dec(u32 value, int prec, u16 **buf)
{ {
u16 *pos = *buf; u16 *pos = *buf;
int i; int i;
@ -93,7 +94,7 @@ static void uint2dec(u32 value, u16 **buf)
for (i = 0; i < 10; ++i) { for (i = 0; i < 10; ++i) {
/* Write current digit */ /* Write current digit */
c = f >> 60; c = f >> 60;
if (c || pos != *buf) if (c || pos != *buf || 10 - i <= prec)
*pos++ = c + '0'; *pos++ = c + '0';
/* Eliminate current digit */ /* Eliminate current digit */
f &= 0xfffffffffffffff; f &= 0xfffffffffffffff;
@ -109,11 +110,12 @@ static void uint2dec(u32 value, u16 **buf)
/* /*
* Print a signed 32bit value as decimal number to an u16 string * Print a signed 32bit value as decimal number to an u16 string
* *
* @value: value to be printed * @value: value to be printed
* @buf: pointer to buffer address * @prec: minimum number of digits to display
* @buf: pointer to buffer address
* on return position of terminating zero word * on return position of terminating zero word
*/ */
static void int2dec(s32 value, u16 **buf) static void int2dec(s32 value, int prec, u16 **buf)
{ {
u32 u; u32 u;
u16 *pos = *buf; u16 *pos = *buf;
@ -124,7 +126,7 @@ static void int2dec(s32 value, u16 **buf)
} else { } else {
u = value; u = value;
} }
uint2dec(u, &pos); uint2dec(u, prec, &pos);
*buf = pos; *buf = pos;
} }
@ -143,6 +145,7 @@ void efi_st_printc(int color, const char *fmt, ...)
u16 *pos = buf; u16 *pos = buf;
const char *s; const char *s;
u16 *u; u16 *u;
int prec;
va_start(args, fmt); va_start(args, fmt);
@ -172,12 +175,20 @@ void efi_st_printc(int color, const char *fmt, ...)
break; break;
case '%': case '%':
++c; ++c;
/* Parse precision */
if (*c == '.') {
++c;
prec = *c - '0';
++c;
} else {
prec = 0;
}
switch (*c) { switch (*c) {
case '\0': case '\0':
--c; --c;
break; break;
case 'd': case 'd':
int2dec(va_arg(args, s32), &pos); int2dec(va_arg(args, s32), prec, &pos);
break; break;
case 'p': case 'p':
++c; ++c;
@ -209,7 +220,7 @@ void efi_st_printc(int color, const char *fmt, ...)
*pos++ = *s; *pos++ = *s;
break; break;
case 'u': case 'u':
uint2dec(va_arg(args, u32), &pos); uint2dec(va_arg(args, u32), prec, &pos);
break; break;
default: default:
break; break;

Loading…
Cancel
Save