libs/libc/stdio/nano_libvsprintf.c: Added hh type modifier (without extending the flag variable).

This commit is contained in:
Johannes
2019-02-17 07:27:47 -06:00
committed by Gregory Nutt
parent 738be875eb
commit af75330012
+24 -5
View File
@@ -114,8 +114,8 @@
# define FL_PREC 0x0040 # define FL_PREC 0x0040
# define FL_LONG 0x0080 # define FL_LONG 0x0080
# define FL_LONGLONG 0x0100 # define FL_SHORT 0x0100
# define FL_SHORT 0x0200 # define FL_REPD_TYPE 0x0200
# define FL_NEGATIVE 0x0400 # define FL_NEGATIVE 0x0400
@@ -455,7 +455,7 @@ int lib_vsprintf(FAR struct lib_outstream_s *stream,
{ {
if ((flags & FL_LONG) != 0) if ((flags & FL_LONG) != 0)
{ {
flags |= FL_LONGLONG; flags |= FL_REPD_TYPE;
} }
flags |= FL_LONG; flags |= FL_LONG;
@@ -465,6 +465,11 @@ int lib_vsprintf(FAR struct lib_outstream_s *stream,
if (c == 'h') if (c == 'h')
{ {
if ((flags & FL_SHORT) != 0)
{
flags |= FL_REPD_TYPE;
}
flags |= FL_SHORT; flags |= FL_SHORT;
flags &= ~FL_LONG; flags &= ~FL_LONG;
continue; continue;
@@ -845,7 +850,7 @@ int lib_vsprintf(FAR struct lib_outstream_s *stream,
#else #else
long long x; long long x;
if ((flags & FL_LONGLONG) != 0) if ((flags & FL_LONG) != 0 && (flags & FL_REPD_TYPE) != 0)
{ {
x = va_arg(ap, long long); x = va_arg(ap, long long);
} }
@@ -859,9 +864,16 @@ int lib_vsprintf(FAR struct lib_outstream_s *stream,
{ {
x = va_arg(ap, int); x = va_arg(ap, int);
if ((flags & FL_SHORT) != 0) if ((flags & FL_SHORT) != 0)
{
if ((flags & FL_REPD_TYPE) == 0)
{ {
x = (short)x; x = (short)x;
} }
else
{
x = (signed char)x;
}
}
} }
flags &= ~(FL_NEGATIVE | FL_ALT); flags &= ~(FL_NEGATIVE | FL_ALT);
@@ -888,7 +900,7 @@ int lib_vsprintf(FAR struct lib_outstream_s *stream,
#else #else
unsigned long long x; unsigned long long x;
if ((flags & FL_LONGLONG) != 0) if ((flags & FL_LONG) != 0 && (flags & FL_REPD_TYPE) != 0)
{ {
x = va_arg(ap, unsigned long long); x = va_arg(ap, unsigned long long);
} }
@@ -902,9 +914,16 @@ int lib_vsprintf(FAR struct lib_outstream_s *stream,
{ {
x = va_arg(ap, unsigned int); x = va_arg(ap, unsigned int);
if ((flags & FL_SHORT) != 0) if ((flags & FL_SHORT) != 0)
{
if ((flags & FL_REPD_TYPE) == 0)
{ {
x = (unsigned short)x; x = (unsigned short)x;
} }
else
{
x = (unsigned char)x;
}
}
} }
flags &= ~(FL_PLUS | FL_SPACE); flags &= ~(FL_PLUS | FL_SPACE);