| 251 | } |
| 252 | |
| 253 | void AddFloat(char **buf_p, size_t &maxlen, double fval, int width, int prec, int flags) |
| 254 | { |
| 255 | int digits; // non-fraction part digits |
| 256 | double tmp; // temporary |
| 257 | char *buf = *buf_p; // output buffer pointer |
| 258 | int val; // temporary |
| 259 | int sign = 0; // 0: positive, 1: negative |
| 260 | int fieldlength; // for padding |
| 261 | int significant_digits = 0; // number of significant digits written |
| 262 | const int MAX_SIGNIFICANT_DIGITS = 16; |
| 263 | |
| 264 | if (ke::IsNaN(fval)) |
| 265 | { |
| 266 | AddString(buf_p, maxlen, "NaN", width, prec, flags | NOESCAPE); |
| 267 | return; |
| 268 | } |
| 269 | |
| 270 | if (ke::IsInfinite(static_cast<float>(fval))) |
| 271 | { |
| 272 | const char *str = ((fval < 0) ? "-Inf" : "Inf"); |
| 273 | AddString(buf_p, maxlen, str, width, prec, flags | NOESCAPE); |
| 274 | return; |
| 275 | } |
| 276 | |
| 277 | // default precision |
| 278 | if (prec < 0) |
| 279 | { |
| 280 | prec = 6; |
| 281 | } |
| 282 | |
| 283 | // get the sign |
| 284 | if (fval < 0) |
| 285 | { |
| 286 | fval = -fval; |
| 287 | sign = 1; |
| 288 | } |
| 289 | |
| 290 | // compute whole-part digits count |
| 291 | digits = (int)log10(fval) + 1; |
| 292 | |
| 293 | // Only print 0.something if 0 < fval < 1 |
| 294 | if (digits < 1) |
| 295 | { |
| 296 | digits = 1; |
| 297 | } |
| 298 | |
| 299 | // compute the field length |
| 300 | fieldlength = digits + prec + ((prec > 0) ? 1 : 0) + sign; |
| 301 | |
| 302 | // minus sign BEFORE left padding if padding with zeros |
| 303 | if (sign && maxlen && (flags & ZEROPAD)) |
| 304 | { |
| 305 | *buf++ = '-'; |
| 306 | maxlen--; |
| 307 | } |
| 308 | |
| 309 | // right justify if required |
| 310 | if ((flags & LADJUST) == 0) |