implemented %f for sprintf
This commit is contained in:
parent
6ed4d2e705
commit
2d7fd04f25
98
lib/logfmt.c
98
lib/logfmt.c
@ -987,14 +987,107 @@ static HCL_INLINE int print_formatted (hcl_t* hcl, hcl_ooi_t nargs, hcl_fmtout_t
|
|||||||
|
|
||||||
if (!hcl_inttostr(hcl, arg, 10, -1))
|
if (!hcl_inttostr(hcl, arg, 10, -1))
|
||||||
{
|
{
|
||||||
HCL_LOG1 (hcl, HCL_LOG_WARN | HCL_LOG_UNTYPED, "unable to convert integer %O to string \n", arg);
|
HCL_LOG1 (hcl, HCL_LOG_WARN | HCL_LOG_UNTYPED, "unable to convert %O to string \n", arg);
|
||||||
goto invalid_format;
|
goto invalid_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsptr = hcl->inttostr.xbuf.ptr;
|
nsptr = hcl->inttostr.xbuf.ptr;
|
||||||
nslen = hcl->inttostr.xbuf.len;
|
nslen = hcl->inttostr.xbuf.len;
|
||||||
|
HCL_ASSERT (hcl, nslen > 0);
|
||||||
|
|
||||||
PRINT_OOCS (nsptr, nslen);
|
if (nsptr[0] == '-')
|
||||||
|
{
|
||||||
|
HCL_ASSERT (hcl, (HCL_OOP_IS_SMOOI(arg) && HCL_OOP_TO_SMOOI(arg) < 0) || HCL_IS_NBIGINT(hcl,arg));
|
||||||
|
nsptr++;
|
||||||
|
nslen--;
|
||||||
|
neg = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(flagc & FLAGC_DOT))
|
||||||
|
{
|
||||||
|
precision = scale;
|
||||||
|
if (precision <= 0) precision = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((flagc & FLAGC_DOT) && precision < scale)
|
||||||
|
{
|
||||||
|
hcl_oow_t diff = scale - precision;
|
||||||
|
scale = precision;
|
||||||
|
nslen = (nslen < diff)? 0: (nslen - diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nslen < scale + 1)
|
||||||
|
{
|
||||||
|
extra = 1;
|
||||||
|
if (precision > 0) extra += 1 + scale;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
extra = 0;
|
||||||
|
if (nslen > 0) extra += nslen - scale;
|
||||||
|
if (precision > 0)
|
||||||
|
{
|
||||||
|
extra += 1;
|
||||||
|
if (nslen > 0) extra += scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (neg) extra++;
|
||||||
|
else if (flagc & FLAGC_SIGN) extra++;
|
||||||
|
else if (flagc & FLAGC_SPACE) extra++;
|
||||||
|
|
||||||
|
if ((flagc & FLAGC_DOT) && precision > scale)
|
||||||
|
{
|
||||||
|
/* trailing zeros in the fractional part */
|
||||||
|
extra += precision - scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(flagc & FLAGC_LEFTADJ) && !(flagc & FLAGC_ZEROPAD) && width > extra)
|
||||||
|
{
|
||||||
|
width -= extra;
|
||||||
|
PRINT_OOCH (padc, width);
|
||||||
|
width = 0;
|
||||||
|
}
|
||||||
|
if (neg) PRINT_OOCH ('-', 1);
|
||||||
|
else if (flagc & FLAGC_SIGN) PRINT_OOCH ('+', 1);
|
||||||
|
else if (flagc & FLAGC_SPACE) PRINT_OOCH (' ', 1);
|
||||||
|
|
||||||
|
if (!(flagc & FLAGC_LEFTADJ) && width > extra)
|
||||||
|
{
|
||||||
|
width -= extra;
|
||||||
|
PRINT_OOCH (padc, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nslen < scale + 1)
|
||||||
|
{
|
||||||
|
PRINT_OOCH ('0', 1);
|
||||||
|
if (precision > 0)
|
||||||
|
{
|
||||||
|
PRINT_OOCH ('.', 1);
|
||||||
|
PRINT_OOCH ('0', scale - nslen);
|
||||||
|
PRINT_OOCS (nsptr, nslen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (nslen > 0) PRINT_OOCS (nsptr, nslen - scale);
|
||||||
|
if (precision > 0)
|
||||||
|
{
|
||||||
|
PRINT_OOCH ('.', 1);
|
||||||
|
if (nslen > 0) PRINT_OOCS (&nsptr[nslen - scale], scale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (precision > scale)
|
||||||
|
{
|
||||||
|
/* trailing zeros in the fractional part */
|
||||||
|
PRINT_OOCH ('0', precision - scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((flagc & FLAGC_LEFTADJ) && width > extra)
|
||||||
|
{
|
||||||
|
width -= extra;
|
||||||
|
PRINT_OOCH (padc, width);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1093,6 +1186,7 @@ static HCL_INLINE int print_formatted (hcl_t* hcl, hcl_ooi_t nargs, hcl_fmtout_t
|
|||||||
nsptr = hcl->inttostr.xbuf.ptr;
|
nsptr = hcl->inttostr.xbuf.ptr;
|
||||||
nslen = hcl->inttostr.xbuf.len;
|
nslen = hcl->inttostr.xbuf.len;
|
||||||
|
|
||||||
|
HCL_ASSERT (hcl, nslen > 0);
|
||||||
if (nsptr[0] == '-')
|
if (nsptr[0] == '-')
|
||||||
{
|
{
|
||||||
/* a negative number was given. i must skip the minus sign
|
/* a negative number was given. i must skip the minus sign
|
||||||
|
Loading…
x
Reference in New Issue
Block a user