可移植printf源码(四)
gth */
{
str_len++;
t_str_ptr++;
}
break;
}
default:
{
/* non-processed format...inform user and try not to crash */
static const char err_msg[]="!!NG!!";
static const char err_fmt[]=" ";
str_ptr = err_msg;
str_len = (int)sizeof(err_msg)-1;
format=err_fmt;
break;
}
} /* switch end */
} /* escape processing end */
else
{
/* pass through Standard ASCII */
index = 0;
if( *format == '\n') /* Add CR to LF */
tmp_buf[str_len++] = '\r';
tmp_buf[str_len++] = *format;
tmp_buf[str_len] = 0;
}
/*
if numeric format
default precision = 0
if width specified set precision to width-prefix size if zero pad
if precision specified set precision to it
set precision to str_len if str_len is greater
space = min_width - precision - prefix size if greater than zero
if left justify, space to right, else space to left,
if string format
if precision > 0, use to truncate string
*/
out_state=LEFT_SPACE;
/* if precision is -1, field has been requested to zero pad */
if (precision == -1)
precision = min_width - prefix[prefix_select].size;
if ((precision > 0) && (*format == 's'))
{
/* requesting string truncation... */
if (str_len > precision)
str_len = precision;
/* zero precision to prevent zero padding */
precision = 0;
}
/* precision now equals number of zero pads */
precision = precision - str_len;
/* min_width now equals number of spaces to add...left_justify will control at beginning or end of min_width */
min_width = (min_width - str_len) - prefix[prefix_select].size;
min_width -= (precision > 0) precision : 0;
do
{
tmp_char = 0;
switch (out_state)
{
case LEFT_SPACE:
{
if ((min_width > 0) && (left_justify == 0))
{
tmp_char = ' ';
min_width--;
}
else
{
/* advance state */
index = 0;
out_state = PREFIX;
}
break;
}
case PREFIX:
{
tmp_char = prefix[prefix_select].c[index++];
if (index >= prefix[prefix_select].size)
{
/* advance state */
out_state = ZERO_PAD;
}
break;
}
case ZERO_PAD:
{
if (precision > 0)
{
tmp_char = '0';
precision--;
}
else
{
/* advance state */
precision = 0;
out_state = VALUE_TXT;
}
break;
}
case VALUE_TXT:
{
tmp_char = str_ptr[precision++]; /* use precision for indexing because is type "int" */
if (precision >= str_len)
{
/* advance state */
out_state = RIGHT_SPACE;
}
break;
}
case RIGHT_SPACE:
{
if (min_width > 0)
{
tmp_char = ' ';
min_width--;
}
else
{
/* advance state */
out_state = OUT_DONE;
}
| 评论 |
|
|