可移植printf源码(三)
{
/* output decimal value from stack */
static const unsigned long base10[] = {1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1};
/* convert all data types to long to ease later processing */
switch (size_type)
{
default:
case UI:
value.UL = (unsigned long)va_arg(sp, unsigned int);
break;
case SI:
value.SL = (signed long)va_arg(sp, signed int);
break;
case UH:
value.UL = (unsigned long)(unsigned short)va_arg(sp, unsigned int);
break;
case SH:
value.SL = (signed long)(signed short)va_arg(sp, signed int);
break;
case UL:
case SL:
value.UL = va_arg(sp, unsigned long);
break;
}
/* convert signed values to positive as necessary and set prefix appropriately */
if (size_type >= SI)
{
if (value.SL < 0)
{
value.SL = -value.SL;
prefix_select = 1;
}
}
/* write out decimal values to buffer...after suppressing zeros */
for (index = 0; index < 10; index++)
{
tmp_char = (unsigned char)(value.UL/base10[index]);
value.UL -= tmp_char * base10[index];
tmp_buf[str_len] = tmp_char + '0';
if ((tmp_char != 0) || (str_len !=0))
str_len++;
}
if (str_len == 0)
str_len = 1; /* if value was zero, we need to increment length */
tmp_buf[str_len] = 0;
break;
}
case 'X':
if (prefix_select != 0) prefix_select++;
/* fall through to processing */
case 'x':
{
/* output hex value from stack */
static const char ascii_table_lower[] = "0123456789abcdef";
static const char ascii_table_upper[] = "0123456789ABCDEF";
static const char hex_shift[] = { 28, 24, 20, 16, 12, 8, 4, 0};
/* convert all data types to long to ease later processing */
switch (size_type)
{
default:
case UI:
case SI:
value.UL = (unsigned long)va_arg(sp, unsigned int);
break;
case UH:
case SH:
value.UL = (unsigned long)(unsigned short)va_arg(sp, unsigned int);
break;
case UL:
case SL:
value.UL = va_arg(sp, unsigned long);
break;
}
/* write out hex values to buffer...after suppressing initial zeros */
for (index = 0; index < 8; index++)
{
tmp_char = (unsigned char)(value.UL >> hex_shift[index]) & 0x0F;
tmp_buf[str_len] = (*format == 'x') ascii_table_lower[tmp_char] : ascii_table_upper[tmp_char];
if ((tmp_char != 0) || (str_len !=0))
str_len++;
}
if (str_len == 0)
str_len = 1; /* if value was zero, we need to increment length */
tmp_buf[str_len] = 0;
break;
}
case 's':
case 'S':
{
/* Add string from stack */
char const FAR * t_str_ptr;
str_ptr = t_str_ptr = va_arg(sp, char FAR *);
while(*t_str_ptr) /* find string len
| 评论 |
|
|