added prefix to qse_fmtintmax() and qse_fmtuintmax().
chnaged awk's printf to use qse_fmtintmax().
This commit is contained in:
@ -19,15 +19,16 @@
|
||||
*/
|
||||
|
||||
#include <qse/cmn/fmt.h>
|
||||
#include <qse/cmn/str.h>
|
||||
|
||||
/* ==================== multibyte ===================================== */
|
||||
static int fmt_unsigned_to_mbs (
|
||||
qse_mchar_t* buf, int size,
|
||||
qse_uintmax_t value, int base_and_flags,
|
||||
qse_mchar_t fillchar, qse_mchar_t signchar)
|
||||
qse_mchar_t fillchar, qse_mchar_t signchar, const qse_mchar_t* prefix)
|
||||
{
|
||||
qse_mchar_t tmp[(QSE_SIZEOF(qse_uintmax_t) * 8)];
|
||||
int reslen, base, xsize, reqlen;
|
||||
int reslen, base, xsize, reqlen, pflen;
|
||||
qse_mchar_t* p, * bp, * be;
|
||||
qse_mchar_t xbasechar;
|
||||
|
||||
@ -50,6 +51,14 @@ static int fmt_unsigned_to_mbs (
|
||||
/* reslen is the length of the resulting string without padding. */
|
||||
reslen = (int)(p - tmp);
|
||||
if (signchar) reslen++; /* increment reslen for the sign character */
|
||||
if (prefix)
|
||||
{
|
||||
/* since the length can be truncated for different type sizes,
|
||||
* don't pass in a very long prefix. */
|
||||
pflen = (int)qse_mbslen(prefix);
|
||||
reslen += pflen;
|
||||
}
|
||||
|
||||
|
||||
/* get the required buffer size for lossless formatting */
|
||||
reqlen = (base_and_flags & QSE_FMTINTMAXTOMBS_NONULL)? reslen: (reslen + 1);
|
||||
@ -67,12 +76,13 @@ static int fmt_unsigned_to_mbs (
|
||||
/* fill space */
|
||||
if (fillchar != QSE_MT('\0'))
|
||||
{
|
||||
|
||||
if (base_and_flags & QSE_FMTINTMAXTOMBS_FILLRIGHT)
|
||||
{
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
|
||||
@ -95,6 +105,8 @@ static int fmt_unsigned_to_mbs (
|
||||
xsize--;
|
||||
}
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
@ -110,6 +122,8 @@ static int fmt_unsigned_to_mbs (
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
@ -119,6 +133,8 @@ static int fmt_unsigned_to_mbs (
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
@ -129,7 +145,8 @@ static int fmt_unsigned_to_mbs (
|
||||
|
||||
int qse_fmtintmaxtombs (
|
||||
qse_mchar_t* buf, int size,
|
||||
qse_intmax_t value, int base_and_flags, qse_mchar_t fillchar)
|
||||
qse_intmax_t value, int base_and_flags,
|
||||
qse_mchar_t fillchar, const qse_mchar_t* prefix)
|
||||
{
|
||||
qse_mchar_t signchar;
|
||||
qse_uintmax_t absvalue;
|
||||
@ -144,18 +161,24 @@ int qse_fmtintmaxtombs (
|
||||
signchar = QSE_MT('+');
|
||||
absvalue = value;
|
||||
}
|
||||
else if (base_and_flags & QSE_FMTINTMAXTOMBS_EMPTYSIGN)
|
||||
{
|
||||
signchar = QSE_MT(' ');
|
||||
absvalue = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
signchar = QSE_MT('\0');
|
||||
absvalue = value;
|
||||
}
|
||||
|
||||
return fmt_unsigned_to_mbs (buf, size, absvalue, base_and_flags, fillchar, signchar);
|
||||
return fmt_unsigned_to_mbs (buf, size, absvalue, base_and_flags, fillchar, signchar, prefix);
|
||||
}
|
||||
|
||||
int qse_fmtuintmaxtombs (
|
||||
qse_mchar_t* buf, int size,
|
||||
qse_uintmax_t value, int base_and_flags, qse_mchar_t fillchar)
|
||||
qse_uintmax_t value, int base_and_flags,
|
||||
qse_mchar_t fillchar, const qse_mchar_t* prefix)
|
||||
{
|
||||
qse_mchar_t signchar;
|
||||
|
||||
@ -164,25 +187,28 @@ int qse_fmtuintmaxtombs (
|
||||
{
|
||||
signchar = QSE_MT('+');
|
||||
}
|
||||
else if (base_and_flags & QSE_FMTINTMAXTOMBS_EMPTYSIGN)
|
||||
{
|
||||
signchar = QSE_MT(' ');
|
||||
}
|
||||
else
|
||||
{
|
||||
signchar = QSE_MT('\0');
|
||||
}
|
||||
|
||||
return fmt_unsigned_to_mbs (buf, size, value, base_and_flags, fillchar, signchar);
|
||||
return fmt_unsigned_to_mbs (buf, size, value, base_and_flags, fillchar, signchar, prefix);
|
||||
}
|
||||
|
||||
|
||||
/* ==================== wide-char ===================================== */
|
||||
|
||||
#if 0
|
||||
static int fmt_unsigned_to_wcs (
|
||||
qse_wchar_t* buf, int size,
|
||||
qse_uintmax_t value, int base_and_flags,
|
||||
qse_wchar_t fillchar, qse_wchar_t signchar)
|
||||
qse_wchar_t fillchar, qse_wchar_t signchar, const qse_wchar_t* prefix)
|
||||
{
|
||||
qse_wchar_t tmp[(QSE_SIZEOF(qse_uintmax_t) * 8)];
|
||||
int reslen, base;
|
||||
int reslen, base, xsize, reqlen, pflen;
|
||||
qse_wchar_t* p, * bp, * be;
|
||||
qse_wchar_t xbasechar;
|
||||
|
||||
@ -205,111 +231,14 @@ static int fmt_unsigned_to_wcs (
|
||||
/* reslen is the length of the resulting string without padding. */
|
||||
reslen = (int)(p - tmp);
|
||||
if (signchar) reslen++; /* increment reslen for the sign character */
|
||||
|
||||
if (size <= 0 ||
|
||||
((base_and_flags & QSE_FMTINTMAXTOWCS_NOTRUNC) && size <= reslen))
|
||||
if (prefix)
|
||||
{
|
||||
/* conversion without loss requires at least 'reslen + 1'. */
|
||||
return -(reslen + 1);
|
||||
/* since the length can be truncated for different type sizes,
|
||||
* don't pass in a very long prefix. */
|
||||
pflen = (int)qse_wcslen(prefix);
|
||||
reslen += pflen;
|
||||
}
|
||||
|
||||
bp = buf;
|
||||
be = buf + size - 1;
|
||||
|
||||
/* fill space */
|
||||
if (fillchar != QSE_WT('\0'))
|
||||
{
|
||||
|
||||
if (base_and_flags & QSE_FMTINTMAXTOWCS_FILLRIGHT)
|
||||
{
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
|
||||
/* fill the right side */
|
||||
while (size - 1 > reslen)
|
||||
{
|
||||
*bp++ = fillchar;
|
||||
size--;
|
||||
}
|
||||
}
|
||||
else if (base_and_flags & QSE_FMTINTMAXTOWCS_FILLCENTER)
|
||||
{
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* fill the left side */
|
||||
while (size - 1 > reslen)
|
||||
{
|
||||
*bp++ = fillchar;
|
||||
size--;
|
||||
}
|
||||
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* fill the left side */
|
||||
while (size - 1 > reslen)
|
||||
{
|
||||
*bp++ = fillchar;
|
||||
size--;
|
||||
}
|
||||
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
|
||||
*bp = QSE_WT('\0');
|
||||
return bp - buf;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int fmt_unsigned_to_wcs (
|
||||
qse_wchar_t* buf, int size,
|
||||
qse_uintmax_t value, int base_and_flags,
|
||||
qse_wchar_t fillchar, qse_wchar_t signchar)
|
||||
{
|
||||
qse_wchar_t tmp[(QSE_SIZEOF(qse_uintmax_t) * 8)];
|
||||
int reslen, base, xsize, reqlen;
|
||||
qse_wchar_t* p, * bp, * be;
|
||||
qse_wchar_t xbasechar;
|
||||
|
||||
base = base_and_flags & 0xFF;
|
||||
if (base < 2 || base > 36) return -1;
|
||||
|
||||
xbasechar = (base_and_flags & QSE_FMTINTMAXTOWCS_UPPERCASE)? QSE_WT('A'): QSE_WT('a');
|
||||
|
||||
/* store the resulting numeric string into 'tmp' first */
|
||||
p = tmp;
|
||||
do
|
||||
{
|
||||
int digit = value % base;
|
||||
if (digit < 10) *p++ = digit + QSE_WT('0');
|
||||
else *p++ = digit + xbasechar - 10;
|
||||
value /= base;
|
||||
}
|
||||
while (value > 0);
|
||||
|
||||
/* reslen is the length of the resulting string without padding. */
|
||||
reslen = (int)(p - tmp);
|
||||
if (signchar) reslen++; /* increment reslen for the sign character */
|
||||
|
||||
/* get the required buffer size for lossless formatting */
|
||||
reqlen = (base_and_flags & QSE_FMTINTMAXTOWCS_NONULL)? reslen: (reslen + 1);
|
||||
|
||||
@ -326,12 +255,13 @@ static int fmt_unsigned_to_wcs (
|
||||
/* fill space */
|
||||
if (fillchar != QSE_WT('\0'))
|
||||
{
|
||||
|
||||
if (base_and_flags & QSE_FMTINTMAXTOWCS_FILLRIGHT)
|
||||
{
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
|
||||
@ -354,6 +284,8 @@ static int fmt_unsigned_to_wcs (
|
||||
xsize--;
|
||||
}
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
@ -369,6 +301,8 @@ static int fmt_unsigned_to_wcs (
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
@ -378,6 +312,8 @@ static int fmt_unsigned_to_wcs (
|
||||
/* emit sign */
|
||||
if (signchar && bp < be) *bp++ = signchar;
|
||||
|
||||
/* copy prefix if necessary */
|
||||
if (prefix) while (*prefix && bp < be) *bp++ = *prefix++;
|
||||
/* copy the numeric string to the destination buffer */
|
||||
while (p > tmp && bp < be) *bp++ = *--p;
|
||||
}
|
||||
@ -388,7 +324,8 @@ static int fmt_unsigned_to_wcs (
|
||||
|
||||
int qse_fmtintmaxtowcs (
|
||||
qse_wchar_t* buf, int size,
|
||||
qse_intmax_t value, int base_and_flags, qse_wchar_t fillchar)
|
||||
qse_intmax_t value, int base_and_flags,
|
||||
qse_wchar_t fillchar, const qse_wchar_t* prefix)
|
||||
{
|
||||
qse_wchar_t signchar;
|
||||
qse_uintmax_t absvalue;
|
||||
@ -403,18 +340,24 @@ int qse_fmtintmaxtowcs (
|
||||
signchar = QSE_WT('+');
|
||||
absvalue = value;
|
||||
}
|
||||
else if (base_and_flags & QSE_FMTINTMAXTOMBS_EMPTYSIGN)
|
||||
{
|
||||
signchar = QSE_WT(' ');
|
||||
absvalue = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
signchar = QSE_WT('\0');
|
||||
absvalue = value;
|
||||
}
|
||||
|
||||
return fmt_unsigned_to_wcs (buf, size, absvalue, base_and_flags, fillchar, signchar);
|
||||
return fmt_unsigned_to_wcs (buf, size, absvalue, base_and_flags, fillchar, signchar, prefix);
|
||||
}
|
||||
|
||||
int qse_fmtuintmaxtowcs (
|
||||
qse_wchar_t* buf, int size,
|
||||
qse_uintmax_t value, int base_and_flags, qse_wchar_t fillchar)
|
||||
qse_uintmax_t value, int base_and_flags,
|
||||
qse_wchar_t fillchar, const qse_wchar_t* prefix)
|
||||
{
|
||||
qse_wchar_t signchar;
|
||||
|
||||
@ -423,11 +366,15 @@ int qse_fmtuintmaxtowcs (
|
||||
{
|
||||
signchar = QSE_WT('+');
|
||||
}
|
||||
else if (base_and_flags & QSE_FMTINTMAXTOMBS_EMPTYSIGN)
|
||||
{
|
||||
signchar = QSE_WT(' ');
|
||||
}
|
||||
else
|
||||
{
|
||||
signchar = QSE_WT('\0');
|
||||
}
|
||||
|
||||
return fmt_unsigned_to_wcs (buf, size, value, base_and_flags, fillchar, signchar);
|
||||
return fmt_unsigned_to_wcs (buf, size, value, base_and_flags, fillchar, signchar, prefix);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user