]> granicus.if.org Git - procps-ng/commitdiff
top: enabled arbitrarily large numbers in 'scale' guys
authorJim Warner <james.warner@comcast.net>
Thu, 13 Jan 2022 19:13:13 +0000 (13:13 -0600)
committerCraig Small <csmall@dropbear.xyz>
Mon, 17 Jan 2022 09:27:20 +0000 (20:27 +1100)
While experimenting with a new feature, wherein select
fields display the total upon request, the capacity of
the 'num' passed to some 'scale' guys became an issue.

So this commit will, with the compiler's help, put the
responsibility for converting the integer into a float
within the calling code (instead of the called logic).

Reference(s):
. 03/08/21, newlib branch equivalent commit
commit 62928cf4614314dfb99adba79240098f49487c6f

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c
top/top.h

index 90be5a9f3ca9d74002510a9543d03e6edffd4b92..d08435a11d9118b6c2254f6763cae80ef18f893e 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -1641,7 +1641,7 @@ static inline const char *make_str_utf8 (const char *str, int width, int justr,
          * Do some scaling then justify stuff.
          * We'll interpret 'num' as a kibibytes quantity and try to
          * format it to reach 'target' while also fitting 'width'. */
-static const char *scale_mem (int target, unsigned long num, int width, int justr) {
+static const char *scale_mem (int target, float num, int width, int justr) {
    //                               SK_Kb   SK_Mb      SK_Gb      SK_Tb      SK_Pb      SK_Eb
 #ifdef BOOST_MEMORY
    static const char *fmttab[] =  { "%.0f", "%#.1f%c", "%#.3f%c", "%#.3f%c", "%#.3f%c", NULL };
@@ -1649,7 +1649,6 @@ static const char *scale_mem (int target, unsigned long num, int width, int just
    static const char *fmttab[] =  { "%.0f", "%.1f%c",  "%.1f%c",  "%.1f%c",  "%.1f%c",  NULL };
 #endif
    static char buf[SMLBUFSIZ];
-   float scaled_num;
    char *psfx;
    int i;
 
@@ -1657,12 +1656,11 @@ static const char *scale_mem (int target, unsigned long num, int width, int just
    if (Rc.zero_suppress && 0 >= num)
       goto end_justifies;
 
-   scaled_num = num;
    for (i = SK_Kb, psfx = Scaled_sfxtab; i < SK_Eb; psfx++, i++) {
       if (i >= target
-      && (width >= snprintf(buf, sizeof(buf), fmttab[i], scaled_num, *psfx)))
+      && (width >= snprintf(buf, sizeof(buf), fmttab[i], num, *psfx)))
          goto end_justifies;
-      scaled_num /= 1024.0;
+      num /= 1024.0;
    }
 
    // well shoot, this outta' fit...
@@ -1674,23 +1672,21 @@ end_justifies:
 
         /*
          * Do some scaling then justify stuff. */
-static const char *scale_num (unsigned long num, int width, int justr) {
+static const char *scale_num (float num, int width, int justr) {
    static char buf[SMLBUFSIZ];
-   float scaled_num;
    char *psfx;
 
    buf[0] = '\0';
    if (Rc.zero_suppress && 0 >= num)
       goto end_justifies;
-   if (width >= snprintf(buf, sizeof(buf), "%lu", num))
+   if (width >= snprintf(buf, sizeof(buf), "%.0f", num))
       goto end_justifies;
 
-   scaled_num = num;
    for (psfx = Scaled_sfxtab; 0 < *psfx; psfx++) {
-      scaled_num /= 1024.0;
-      if (width >= snprintf(buf, sizeof(buf), "%.1f%c", scaled_num, *psfx))
+      num /= 1024.0;
+      if (width >= snprintf(buf, sizeof(buf), "%.1f%c", num, *psfx))
          goto end_justifies;
-      if (width >= snprintf(buf, sizeof(buf), "%.0f%c", scaled_num, *psfx))
+      if (width >= snprintf(buf, sizeof(buf), "%.0f%c", num, *psfx))
          goto end_justifies;
    }
 
index a267e52d95e45f0c51e647651f401161fe65e2ff..302050260a9425ac81645503e9db0583be262855 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -736,8 +736,8 @@ typedef struct WIN_t {
 //atic inline const char *make_num (long num, int width, int justr, int col, int noz);
 //atic inline const char *make_str (const char *str, int width, int justr, int col);
 //atic inline const char *make_str_utf8 (const char *str, int width, int justr, int col);
-//atic const char   *scale_mem (int target, unsigned long num, int width, int justr);
-//atic const char   *scale_num (unsigned long num, int width, int justr);
+//atic const char   *scale_mem (int target, float num, int width, int justr);
+//atic const char   *scale_num (float num, int width, int justr);
 //atic const char   *scale_pcnt (float num, int width, int justr);
 //atic const char   *scale_tics (TIC_t tics, int width, int justr);
 /*------  Fields Management support  -------------------------------------*/