From 2d7fd04f251af65bd1dc873dea03bbf4c468bc66 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 2 Apr 2018 08:47:50 +0000 Subject: [PATCH] implemented %f for sprintf --- lib/logfmt.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/lib/logfmt.c b/lib/logfmt.c index 0489f7d..ca5e84d 100644 --- a/lib/logfmt.c +++ b/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)) { - 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; } nsptr = hcl->inttostr.xbuf.ptr; 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; } @@ -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; nslen = hcl->inttostr.xbuf.len; + HCL_ASSERT (hcl, nslen > 0); if (nsptr[0] == '-') { /* a negative number was given. i must skip the minus sign