touched up on the 'k' and 'K' specifier in formatted output

This commit is contained in:
hyung-hwan 2019-03-17 04:11:00 +00:00
parent 585633b26d
commit 6916a11e61

View File

@ -601,19 +601,38 @@ reswitch:
* because 'k' means qse_byte_t. * because 'k' means qse_byte_t.
* 'l', results in uppercase hexadecimal letters. * 'l', results in uppercase hexadecimal letters.
* 'h' drops the leading \x in the output * 'h' drops the leading \x in the output
* --------------------------------------------------------
* hk -> \x + non-printable in lowercase hex
* k -> all in lowercase hex
* lk -> \x + all in lowercase hex
* --------------------------------------------------------
* hK -> \x + non-printable in uppercase hex
* K -> all in uppercase hex
* lK -> \x + all in uppercase hex
* --------------------------------------------------------
* with 'k' or 'K', i don't substitute "(null)" for the NULL pointer
*/ */
if (flagc & FLAGC_ZEROPAD) padc = T(' '); if (flagc & FLAGC_ZEROPAD) padc = T(' ');
/*
no \x + printable as usual -> h, \x, all hex -> l
lowercase -> k, uppercase K */
/* with 'k' or 'K', i don't substitute "(null)" for the NULL pointer */
bytep = va_arg(ap, qse_byte_t*); bytep = va_arg(ap, qse_byte_t*);
k_hex_width = (lm_flag & LF_H)? 2: 4; k_hex_width = (lm_flag & (LF_H | LF_L))? 4: 2;
if (ch == T('k')) if (lm_flag & LF_H)
{ {
/* to print non-printables in hex */
if (flagc & FLAGC_DOT)
{
/* if precision is specifed, it doesn't stop at the value of zero unlike 's' or 'S' */
for (n = 0; n < precision; n++) width -= QSE_ISMPRINT(bytep[n])? 1: k_hex_width;
}
else
{
for (n = 0; bytep[n]; n++) width -= QSE_ISMPRINT(bytep[n])? 1: k_hex_width;
}
}
else
{
/* to print all in hex */
if (flagc & FLAGC_DOT) if (flagc & FLAGC_DOT)
{ {
/* if precision is specifed, it doesn't stop at the value of zero unlike 's' or 'S' */ /* if precision is specifed, it doesn't stop at the value of zero unlike 's' or 'S' */
@ -625,61 +644,33 @@ lowercase -> k, uppercase K */
} }
width -= (n * k_hex_width); width -= (n * k_hex_width);
} }
else
{
if (flagc & FLAGC_DOT)
{
/* if precision is specifed, it doesn't stop at the value of zero unlike 's' or 'S' */
for (n = 0; n < precision; n++) width -= QSE_ISMPRINT(bytep[n])? 1: k_hex_width;
}
else
{
for (n = 0; bytep[n]; n++) width -= QSE_ISMPRINT(bytep[n])? 1: k_hex_width;
}
}
if (!(flagc & FLAGC_LEFTADJ) && width > 0) if (!(flagc & FLAGC_LEFTADJ) && width > 0)
{ {
while (width--) PUT_CHAR(padc); while (width--) PUT_CHAR(padc);
} }
if (ch == T('k'))
{
while (n--) while (n--)
{
if ((lm_flag & LF_H) && QSE_ISMPRINT(*bytep))
{
PUT_CHAR(*bytep);
}
else
{ {
qse_mchar_t xbuf[3]; qse_mchar_t xbuf[3];
qse_bytetombs (*bytep, xbuf, QSE_COUNTOF(xbuf), (16 | ((lm_flag & LF_L)? 0: QSE_BYTETOSTR_LOWERCASE)), QSE_MT('0')); qse_bytetombs (*bytep, xbuf, QSE_COUNTOF(xbuf), (16 | (ch == T('k')? QSE_BYTETOSTR_LOWERCASE: 0)), QSE_MT('0'));
if (!(lm_flag & LF_H)) if (lm_flag & (LF_H | LF_L))
{ {
PUT_CHAR('\\'); PUT_CHAR('\\');
PUT_CHAR('x'); PUT_CHAR('x');
} }
PUT_CHAR(xbuf[0]); PUT_CHAR(xbuf[0]);
PUT_CHAR(xbuf[1]); PUT_CHAR(xbuf[1]);
}
bytep++; bytep++;
} }
}
else
{
while (n--)
{
if (QSE_ISMPRINT(*bytep)) PUT_CHAR(*bytep);
else
{
qse_mchar_t xbuf[3];
qse_bytetombs (*bytep, xbuf, QSE_COUNTOF(xbuf), (16 | ((lm_flag & LF_L)? 0: QSE_BYTETOSTR_LOWERCASE)), QSE_MT('0'));
if (!(lm_flag & LF_H))
{
PUT_CHAR('\\');
PUT_CHAR('x');
}
PUT_CHAR(xbuf[0]);
PUT_CHAR(xbuf[1]);
}
bytep++;
}
}
if ((flagc & FLAGC_LEFTADJ) && width > 0) if ((flagc & FLAGC_LEFTADJ) && width > 0)
{ {
while (width--) PUT_CHAR(padc); while (width--) PUT_CHAR(padc);