added 'k' and 'K' to dump a byte string in \x hexadecimal notation

This commit is contained in:
hyung-hwan 2019-03-15 13:34:07 +00:00
parent 88b39ee0af
commit e06ffadd4e

View File

@ -428,7 +428,7 @@ reswitch:
goto number; goto number;
case T('c'): case T('c'):
/* zerpad must not take effect for 'c' */ /* zeropad must not take effect for 'c' */
if (flagc & FLAGC_ZEROPAD) padc = T(' '); if (flagc & FLAGC_ZEROPAD) padc = T(' ');
if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t))) || if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t))) ||
((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_c; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_c;
@ -450,7 +450,7 @@ reswitch:
break; break;
case T('C'): case T('C'):
/* zerpad must not take effect for 'C' */ /* zeropad must not take effect for 'C' */
if (flagc & FLAGC_ZEROPAD) padc = T(' '); if (flagc & FLAGC_ZEROPAD) padc = T(' ');
if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t))) || if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t))) ||
((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_c; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_c;
@ -494,7 +494,7 @@ reswitch:
break; break;
case T('s'): case T('s'):
/* zerpad must not take effect for 's' */ /* zeropad must not take effect for 's' */
if (flagc & FLAGC_ZEROPAD) padc = T(' '); if (flagc & FLAGC_ZEROPAD) padc = T(' ');
if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t))) || if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t))) ||
((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_s; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t)))) goto uppercase_s;
@ -526,7 +526,7 @@ reswitch:
break; break;
case T('S'): case T('S'):
/* zerpad must not take effect for 'S' */ /* zeropad must not take effect for 'S' */
if (flagc & FLAGC_ZEROPAD) padc = T(' '); if (flagc & FLAGC_ZEROPAD) padc = T(' ');
if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t))) || if (((lm_flag & LF_H) && (QSE_SIZEOF(char_t) < QSE_SIZEOF(ochar_t))) ||
((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_s; ((lm_flag & LF_L) && (QSE_SIZEOF(char_t) > QSE_SIZEOF(ochar_t)))) goto lowercase_s;
@ -538,18 +538,10 @@ reswitch:
/* get the length */ /* get the length */
for (oslen = 0; osp[oslen]; oslen++); for (oslen = 0; osp[oslen]; oslen++);
if (ch == T('K')) if (data->conv(osp, &oslen, QSE_NULL, &slen, data->ctx) <= -1)
{ {
oslen = 1; /* conversion error */
slen = 2; goto oops;
}
else
{
if (data->conv (osp, &oslen, QSE_NULL, &slen, data->ctx) <= -1)
{
/* conversion error */
goto oops;
}
} }
/* slen hold the length after conversion */ /* slen hold the length after conversion */
@ -576,17 +568,9 @@ reswitch:
#endif #endif
conv_len = QSE_COUNTOF(conv_buf); conv_len = QSE_COUNTOF(conv_buf);
if (ch == T('K')) /* this must not fail since the dry-run above was successful */
{ data->conv (&osp[tot_len], &src_len, conv_buf, &conv_len, data->ctx);
src_len = 1;
conv_len = 2;
qse_bytetombs(osp[tot_len], conv_buf, 2, 16, '0');
}
else
{
/* this must not fail since the dry-run above was successful */
data->conv (&osp[tot_len], &src_len, conv_buf, &conv_len, data->ctx);
}
tot_len += src_len; tot_len += src_len;
/* stop outputting if a converted character can't be printed /* stop outputting if a converted character can't be printed
@ -609,34 +593,73 @@ reswitch:
break; break;
case T('k'): case T('k'):
/* zerpad must not take effect for 's'. H & L doesn't take effect on 'k' */ case T('K'):
/* zeropad must not take effect for 's'. 'h' & 'l' doesn't take effect on 'k' */
if (flagc & FLAGC_ZEROPAD) padc = T(' '); if (flagc & FLAGC_ZEROPAD) padc = T(' ');
bytep = va_arg (ap, qse_byte_t*); /* with 'k' or 'K', i don't substitute "(null)" for the NULL pointer */
if (bytep == QSE_NULL) p = T("(null)"); bytep = va_arg(ap, qse_byte_t*);
if (flagc & FLAGC_DOT) if (ch == T('k'))
{ {
for (n = 0; n < precision && bytep[n]; n++); 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++) /* nothing */;
}
else
{
for (n = 0; bytep[n]; n++) /* nothing */;
}
width -= (n * 4);
} }
else else
{ {
for (n = 0; bytep[n]; n++); 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_ISPRINT(bytep[n])? 1: 4;
}
else
{
for (n = 0; bytep[n]; n++) width -= QSE_ISPRINT(bytep[n])? 1: 4;
}
} }
width -= (n * 2);
if (!(flagc & FLAGC_LEFTADJ) && width > 0) if (!(flagc & FLAGC_LEFTADJ) && width > 0)
{ {
while (width--) PUT_CHAR(padc); while (width--) PUT_CHAR(padc);
} }
while (n--)
if (ch == T('k'))
{ {
qse_mchar_t xbuf[3]; while (n--)
qse_bytetombs (*bytep, xbuf, QSE_COUNTOF(xbuf), 16, QSE_MT('0')); {
PUT_CHAR(xbuf[0]); qse_mchar_t xbuf[3];
PUT_CHAR(xbuf[1]); qse_bytetombs (*bytep, xbuf, QSE_COUNTOF(xbuf), 16, QSE_MT('0'));
bytep++; PUT_CHAR('\\');
PUT_CHAR('x');
PUT_CHAR(xbuf[0]);
PUT_CHAR(xbuf[1]);
bytep++;
}
}
else
{
while (n--)
{
if (QSE_ISPRINT(*bytep)) PUT_CHAR(*bytep);
else
{
qse_mchar_t xbuf[3];
qse_bytetombs (*bytep, xbuf, QSE_COUNTOF(xbuf), 16, QSE_MT('0'));
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)
{ {