X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/13ae67e6d208deea2382c2901488d8a7f278ee23..d4700e9d89995a338a134ed8fdb77ba26b6038d5:/sbr/fmt_scan.c diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 20420516..ec94897e 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -491,16 +491,25 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, } 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; - if (value < 1000) { - snprintf(buffer, sizeof(buffer), "%u", value); + 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"; value > 999999; value /= 1000) { + for (unitcp = "KMGT"; val > (scale * scale); val /= scale) { if (!*++unitcp) break; } @@ -508,17 +517,22 @@ fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat, if (!*unitcp) { strcpy(buffer, "huge"); } else { - /* round up to next higer tenth of kilo-/mega-/giga- */ - value += 99; value /= 100; + /* val is scale times too big. we want tenths */ + val *= 10; + + /* round up */ + val += (scale - 1); + val /= scale; - /* want one digit after decimal, avoid float */ - whole = value / 10; - tenths = value - (whole * 10); + whole = val / 10; + tenths = val - (whole * 10); if (tenths) { - snprintf(buffer, sizeof(buffer), "%u.%u%c", whole, tenths, *unitcp); + snprintf(buffer, sizeof(buffer), "%u.%u%c%s", + whole, tenths, *unitcp, kibisuff); } else { - snprintf(buffer, sizeof(buffer), "%u%c", whole, *unitcp); + snprintf(buffer, sizeof(buffer), "%u%c%s", + whole, *unitcp, kibisuff); } } }