X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/64e8827c5d5def0325ab7181fe939623c77e807c..d4700e9d89995a338a134ed8fdb77ba26b6038d5:/sbr/fmt_scan.c diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index e4d79d57..ec94897e 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -490,6 +490,55 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, cp += n; } break; + case FT_LS_KILO: + case FT_LS_KIBI: + { + char *unitcp; + unsigned int whole, tenths; + unsigned int scale; + unsigned int val = (unsigned int)value; + char *kibisuff; + + switch (fmt->f_type) { + case FT_LS_KILO: scale = 1000; kibisuff = ""; break; + case FT_LS_KIBI: scale = 1024; kibisuff = "i"; break; + } + + if (val < scale) { + snprintf(buffer, sizeof(buffer), "%u", val); + } else { + + /* find correct scale for size (Kilo/Mega/Giga/Tera) */ + for (unitcp = "KMGT"; val > (scale * scale); val /= scale) { + if (!*++unitcp) + break; + } + + if (!*unitcp) { + strcpy(buffer, "huge"); + } else { + /* val is scale times too big. we want tenths */ + val *= 10; + + /* round up */ + val += (scale - 1); + val /= scale; + + whole = val / 10; + tenths = val - (whole * 10); + + if (tenths) { + snprintf(buffer, sizeof(buffer), "%u.%u%c%s", + whole, tenths, *unitcp, kibisuff); + } else { + snprintf(buffer, sizeof(buffer), "%u%c%s", + whole, *unitcp, kibisuff); + } + } + } + str = buffer; + } + break; case FT_NUMF: cpnumber (&cp, value, fmt->f_width, fmt->f_fill, ep - cp); break;