mirror of
https://github.com/bkaradzic/bx.git
synced 2026-02-19 05:23:00 +01:00
printf: Fixed parsing invalid format specifier.
This commit is contained in:
@@ -940,16 +940,18 @@ namespace bx
|
||||
else if ('%' == ch)
|
||||
{
|
||||
// %[flags][width][.precision][length sub-specifier]specifier
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
|
||||
Param param;
|
||||
|
||||
// flags
|
||||
while (' ' == ch
|
||||
while (err.isOk()
|
||||
&& ( ' ' == ch
|
||||
|| '-' == ch
|
||||
|| '+' == ch
|
||||
|| '0' == ch
|
||||
|| '#' == ch)
|
||||
)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
@@ -961,7 +963,7 @@ namespace bx
|
||||
case '#': param.spec = true; break;
|
||||
}
|
||||
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
}
|
||||
|
||||
if (param.left)
|
||||
@@ -972,7 +974,7 @@ namespace bx
|
||||
// width
|
||||
if ('*' == ch)
|
||||
{
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
param.width = va_arg(_argList, int32_t);
|
||||
|
||||
if (0 > param.width)
|
||||
@@ -984,41 +986,45 @@ namespace bx
|
||||
}
|
||||
else
|
||||
{
|
||||
while (isNumeric(ch) )
|
||||
while (err.isOk()
|
||||
&& isNumeric(ch) )
|
||||
{
|
||||
param.width = param.width * 10 + ch - '0';
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
}
|
||||
}
|
||||
|
||||
// .precision
|
||||
if ('.' == ch)
|
||||
{
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
|
||||
if ('*' == ch)
|
||||
{
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
param.prec = va_arg(_argList, int32_t);
|
||||
}
|
||||
else
|
||||
{
|
||||
param.prec = 0;
|
||||
while (isNumeric(ch) )
|
||||
while (err.isOk()
|
||||
&& isNumeric(ch) )
|
||||
{
|
||||
param.prec = param.prec * 10 + ch - '0';
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// length sub-specifier
|
||||
while ('h' == ch
|
||||
while (err.isOk()
|
||||
&& ( 'h' == ch
|
||||
|| 'I' == ch
|
||||
|| 'l' == ch
|
||||
|| 'j' == ch
|
||||
|| 't' == ch
|
||||
|| 'z' == ch)
|
||||
)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
@@ -1036,14 +1042,14 @@ namespace bx
|
||||
default: break;
|
||||
}
|
||||
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
switch (ch)
|
||||
{
|
||||
case 'h': param.bits = sizeof(signed char )*8; break;
|
||||
case 'l': param.bits = sizeof(long long int)*8; break;
|
||||
case '3':
|
||||
case '6':
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
switch (ch)
|
||||
{
|
||||
case '2': param.bits = sizeof(int32_t)*8; break;
|
||||
@@ -1057,7 +1063,12 @@ namespace bx
|
||||
break;
|
||||
}
|
||||
|
||||
read(&reader, ch);
|
||||
read(&reader, ch, &err);
|
||||
}
|
||||
|
||||
if (!err.isOk() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// specifier
|
||||
|
||||
Reference in New Issue
Block a user