From 54965cadfe8f1aef663600cb07d3edbb0acf8769 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Wed, 9 Sep 2020 03:11:37 -0500 Subject: Attempt internationalization of HR_COMMAS, 9 digit memory sizes for top, and use the comma format when selected even if <3 digits (no 0.0M) --- lib/lib.c | 20 ++++++++++++++++---- toys/posix/ps.c | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index 28c7e9c4..319b6af4 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -1151,6 +1151,7 @@ match: int human_readable_long(char *buf, unsigned long long num, int dgt, int unit, int style) { + static char cc, dot; unsigned long long snap = 0; int len, commas = 0, off, ii, divisor = (style&HR_1000) ? 1000 : 1024; @@ -1160,18 +1161,29 @@ int human_readable_long(char *buf, unsigned long long num, int dgt, int unit, // Zettabyte and Yottabyte in case "unit" starts above zero. for (;;unit++) { len = snprintf(0, 0, "%llu", num); - if (style&HR_COMMAS) commas = (len>4)*((len-1)/3); + if (style&HR_COMMAS) commas = (len-1)/3; if (len<=(dgt-commas)) break; num = ((snap = num)+(divisor/2))/divisor; } if (CFG_TOYBOX_DEBUG && unit>8) return sprintf(buf, "%.*s", dgt, "TILT"); + if (!dot) { + if (CFG_TOYBOX_I18N) { + struct lconv *ll; + + setlocale(LC_NUMERIC, ""); + ll = localeconv(); + dot = *ll->decimal_point ? : '.'; + cc = *ll->thousands_sep ? : ','; + } else cc = ',', dot = '.'; + } + len = sprintf(buf, "%llu", num); - if (commas) { + if (style&HR_COMMAS) { for (ii = 0; ii=10000000); - human_readable_long(hr[j+!!j], run[i]>>(10*k), 8, k+1, HR_COMMAS); + human_readable_long(hr[j+!!j], run[i]>>(10*k), 9, k+1, HR_COMMAS); if (j==1) human_readable_long(hr[1], (run[i-1]-run[i])>>(10*k), 8, k+1, HR_COMMAS); else if (j==2) { - sprintf(toybuf, " %s: %9s total, %9s used, %9s free, %9s %s", + sprintf(toybuf, " %s:%10s total,%10s used,%10s free,%10s %s", (i<3) ? " Mem" : "Swap", hr[0], hr[1], hr[2], hr[3], (i<3) ? "buffers" : "cached"); lines = header_line(lines, 0); -- cgit v1.2.3