Skip to content

Commit dace194

Browse files
CYFS3Rbb666
authored andcommitted
[klibc] Fix tiny vsnprintf long long formatting
1 parent 08cad4e commit dace194

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

‎src/klibc/rt_vsnprintf_tiny.c‎

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,15 @@ static char *print_number(char *buf,
109109
num = (rt_uint16_t)-num;
110110
}
111111
break;
112+
#ifdef RT_KLIBC_USING_VSNPRINTF_LONGLONG
112113
case 'L':
114+
if (num > (~0ULL >> 1))
115+
{
116+
sign = '-';
117+
num = 0ULL - num;
118+
}
119+
break;
120+
#endif /* RT_KLIBC_USING_VSNPRINTF_LONGLONG */
113121
case 'l':
114122
if ((long)num < 0)
115123
{
@@ -595,7 +603,14 @@ int rt_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
595603

596604
if (qualifier == 'L')
597605
{
598-
num = va_arg(args, unsigned long long);
606+
if (flags & SIGN)
607+
{
608+
num = (unsigned long long)va_arg(args, long long);
609+
}
610+
else
611+
{
612+
num = va_arg(args, unsigned long long);
613+
}
599614
}
600615
else if (qualifier == 'l')
601616
{

‎src/klibc/utest/TC_rt_sprintf.c‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -913,10 +913,12 @@ SPRINTF_TEST_CASE(integer_types)
913913
SPRINTF_CHECK("2147483647", buffer, "%li", 2147483647L);
914914
#ifdef RT_KLIBC_USING_VSNPRINTF_LONGLONG
915915
SPRINTF_CHECK("30", buffer, "%lli", 30LL);
916-
#ifdef RT_KLIBC_USING_VSNPRINTF_STANDARD
917916
SPRINTF_CHECK("-9223372036854775807", buffer, "%lli", -9223372036854775807LL);
918917
SPRINTF_CHECK("9223372036854775807", buffer, "%lli", 9223372036854775807LL);
919-
#endif /* RT_KLIBC_USING_VSNPRINTF_STANDARD */
918+
SPRINTF_CHECK("-2147483648", buffer, "%lld", (long long)(rt_int64_t)-2147483648LL);
919+
SPRINTF_CHECK("4294967295", buffer, "%lld", (long long)(rt_int64_t)RT_UINT32_MAX);
920+
SPRINTF_CHECK("-9223372036854775808", buffer, "%lld", (long long)(-9223372036854775807LL - 1LL));
921+
SPRINTF_CHECK("9223372036854775807", buffer, "%lld", 9223372036854775807LL);
920922
#endif /* RT_KLIBC_USING_VSNPRINTF_LONGLONG */
921923
SPRINTF_CHECK("100000", buffer, "%lu", 100000L);
922924
SPRINTF_CHECK("4294967295", buffer, "%lu", 0xFFFFFFFFL);

0 commit comments

Comments
 (0)