[kservice] 增加printf格式2进制和8进制,RT_KPRINTF_USING_LONGLONG 和 RT_PRINTF_SPECIAL 做了相应处理 (#6361)
* 增加printf格式2进制和8进制,RT_KPRINTF_USING_LONGLONG 和 RT_PRINTF_SPECIAL 做了相应处理
This commit is contained in:
parent
6da3b2b4b6
commit
cbbea1a0f5
@ -666,26 +666,13 @@ rt_inline int divide(long *n, int base)
|
|||||||
int res;
|
int res;
|
||||||
|
|
||||||
/* optimized for processor which does not support divide instructions. */
|
/* optimized for processor which does not support divide instructions. */
|
||||||
if (base == 10)
|
|
||||||
{
|
|
||||||
#ifdef RT_KPRINTF_USING_LONGLONG
|
#ifdef RT_KPRINTF_USING_LONGLONG
|
||||||
res = (int)(((unsigned long long)*n) % 10U);
|
res = (int)(((unsigned long long)*n) % base);
|
||||||
*n = (long long)(((unsigned long long)*n) / 10U);
|
*n = (long long)(((unsigned long long)*n) / base);
|
||||||
#else
|
#else
|
||||||
res = (int)(((unsigned long)*n) % 10U);
|
res = (int)(((unsigned long)*n) % base);
|
||||||
*n = (long)(((unsigned long)*n) / 10U);
|
*n = (long)(((unsigned long)*n) / base);
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef RT_KPRINTF_USING_LONGLONG
|
|
||||||
res = (int)(((unsigned long long)*n) % 16U);
|
|
||||||
*n = (long long)(((unsigned long long)*n) / 16U);
|
|
||||||
#else
|
|
||||||
res = (int)(((unsigned long)*n) % 16U);
|
|
||||||
*n = (long)(((unsigned long)*n) / 16U);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -723,9 +710,9 @@ static char *print_number(char *buf,
|
|||||||
{
|
{
|
||||||
char c, sign;
|
char c, sign;
|
||||||
#ifdef RT_KPRINTF_USING_LONGLONG
|
#ifdef RT_KPRINTF_USING_LONGLONG
|
||||||
char tmp[32];
|
char tmp[64];
|
||||||
#else
|
#else
|
||||||
char tmp[16];
|
char tmp[32];
|
||||||
#endif /* RT_KPRINTF_USING_LONGLONG */
|
#endif /* RT_KPRINTF_USING_LONGLONG */
|
||||||
int precision_bak = precision;
|
int precision_bak = precision;
|
||||||
const char *digits;
|
const char *digits;
|
||||||
@ -759,7 +746,7 @@ static char *print_number(char *buf,
|
|||||||
#ifdef RT_PRINTF_SPECIAL
|
#ifdef RT_PRINTF_SPECIAL
|
||||||
if (type & SPECIAL)
|
if (type & SPECIAL)
|
||||||
{
|
{
|
||||||
if (base == 16)
|
if (base == 2 || base == 16)
|
||||||
size -= 2;
|
size -= 2;
|
||||||
else if (base == 8)
|
else if (base == 8)
|
||||||
size--;
|
size--;
|
||||||
@ -809,7 +796,16 @@ static char *print_number(char *buf,
|
|||||||
#ifdef RT_PRINTF_SPECIAL
|
#ifdef RT_PRINTF_SPECIAL
|
||||||
if (type & SPECIAL)
|
if (type & SPECIAL)
|
||||||
{
|
{
|
||||||
if (base == 8)
|
if (base == 2)
|
||||||
|
{
|
||||||
|
if (buf < end)
|
||||||
|
*buf = '0';
|
||||||
|
++ buf;
|
||||||
|
if (buf < end)
|
||||||
|
*buf = 'b';
|
||||||
|
++ buf;
|
||||||
|
}
|
||||||
|
else if (base == 8)
|
||||||
{
|
{
|
||||||
if (buf < end)
|
if (buf < end)
|
||||||
*buf = '0';
|
*buf = '0';
|
||||||
@ -1068,6 +1064,9 @@ RT_WEAK int rt_vsnprintf(char *buf, rt_size_t size, const char *fmt, va_list arg
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* integer number formats - set up the flags and "break" */
|
/* integer number formats - set up the flags and "break" */
|
||||||
|
case 'b':
|
||||||
|
base = 2;
|
||||||
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
base = 8;
|
base = 8;
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user