mirror of
https://github.com/torvalds/linux.git
synced 2024-12-13 14:43:03 +00:00
efi/printf: Factor out flags parsing and handle '%' earlier
Move flags parsing code out into a helper function. The '%%' case can be handled up front: it is not allowed to have flags, width etc. Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu> Link: https://lore.kernel.org/r/20200518190716.751506-9-nivedita@alum.mit.edu Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
ce5e3f909f
commit
3b8350959c
@ -202,6 +202,35 @@ static char *number(char *str, long long num, int base, int size, int precision,
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int get_flags(const char **fmt)
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
switch (**fmt) {
|
||||||
|
case '-':
|
||||||
|
flags |= LEFT;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
flags |= PLUS;
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
flags |= SPACE;
|
||||||
|
break;
|
||||||
|
case '#':
|
||||||
|
flags |= SPECIAL;
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
flags |= ZEROPAD;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
++(*fmt);
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
|
||||||
int vsprintf(char *buf, const char *fmt, va_list args)
|
int vsprintf(char *buf, const char *fmt, va_list args)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
@ -218,32 +247,13 @@ int vsprintf(char *buf, const char *fmt, va_list args)
|
|||||||
int qualifier; /* 'h', 'hh', 'l' or 'll' for integer fields */
|
int qualifier; /* 'h', 'hh', 'l' or 'll' for integer fields */
|
||||||
|
|
||||||
for (str = buf; *fmt; ++fmt) {
|
for (str = buf; *fmt; ++fmt) {
|
||||||
if (*fmt != '%') {
|
if (*fmt != '%' || *++fmt == '%') {
|
||||||
*str++ = *fmt;
|
*str++ = *fmt;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* process flags */
|
/* process flags */
|
||||||
flags = 0;
|
flags = get_flags(&fmt);
|
||||||
repeat:
|
|
||||||
++fmt; /* this also skips first '%' */
|
|
||||||
switch (*fmt) {
|
|
||||||
case '-':
|
|
||||||
flags |= LEFT;
|
|
||||||
goto repeat;
|
|
||||||
case '+':
|
|
||||||
flags |= PLUS;
|
|
||||||
goto repeat;
|
|
||||||
case ' ':
|
|
||||||
flags |= SPACE;
|
|
||||||
goto repeat;
|
|
||||||
case '#':
|
|
||||||
flags |= SPECIAL;
|
|
||||||
goto repeat;
|
|
||||||
case '0':
|
|
||||||
flags |= ZEROPAD;
|
|
||||||
goto repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get field width */
|
/* get field width */
|
||||||
field_width = -1;
|
field_width = -1;
|
||||||
@ -321,10 +331,6 @@ int vsprintf(char *buf, const char *fmt, va_list args)
|
|||||||
field_width, precision, flags);
|
field_width, precision, flags);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case '%':
|
|
||||||
*str++ = '%';
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* integer number formats - set up the flags and "break" */
|
/* integer number formats - set up the flags and "break" */
|
||||||
case 'o':
|
case 'o':
|
||||||
base = 8;
|
base = 8;
|
||||||
|
Loading…
Reference in New Issue
Block a user