systat: Change the way ifstats are displayed.
authorPeter Avalos <pavalos@dragonflybsd.org>
Sun, 28 Aug 2011 04:00:29 +0000 (21:00 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sun, 28 Aug 2011 04:15:22 +0000 (21:15 -0700)
-Default to displaying bits/s for the rate, and bytes for the totals.
-kilo, mega, giga, tera are all powers of 1000, not 1024.
-Add two new commands: autobyte and autobit which will automatically
change the scale factor in bytes or bits, respectively.  auto defaults
to displaying bits.

usr.bin/systat/convtbl.c
usr.bin/systat/convtbl.h
usr.bin/systat/ifstat.c

index 7a1c1e7..ddfaea2 100644 (file)
 #include <string.h>
 #include "convtbl.h"
 
-#define BIT            (8)
-#define BITS           (1)
-#define KILOBIT                (1000LL)
-#define MEGABIT                (KILOBIT * 1000)
-#define GIGABIT                (MEGABIT * 1000)
-#define TERABIT                (GIGABIT * 1000)
+#define KILO           (1000LL)
+#define MEGA           (KILO * 1000)
+#define GIGA           (MEGA * 1000)
+#define TERA           (GIGA * 1000)
 
 #define BYTE           (1)
-#define BYTES          (1)
-#define KILOBYTE       (1024LL)
-#define MEGABYTE       (KILOBYTE * 1024)
-#define GIGABYTE       (MEGABYTE * 1024)
-#define TERABYTE       (GIGABYTE * 1024)
+#define BIT            (8)
 
 struct convtbl {
        uintmax_t        mul;
@@ -56,17 +50,19 @@ struct convtbl {
 
 static struct convtbl convtbl[] = {
        /* mul, scale, str, name */
-       [SC_BYTE] =     { BYTE, BYTES, "B", "byte" },
-       [SC_KILOBYTE] = { BYTE, KILOBYTE, "KB", "kbyte" },
-       [SC_MEGABYTE] = { BYTE, MEGABYTE, "MB", "mbyte" },
-       [SC_GIGABYTE] = { BYTE, GIGABYTE, "GB", "gbyte" },
-       [SC_TERABYTE] = { BYTE, TERABYTE, "TB", "tbyte" },
-
-       [SC_BIT] =      { BIT, BITS, "b", "bit" },
-       [SC_KILOBIT] =  { BIT, KILOBIT, "Kb", "kbit" },
-       [SC_MEGABIT] =  { BIT, MEGABIT, "Mb", "mbit" },
-       [SC_GIGABIT] =  { BIT, GIGABIT, "Gb", "gbit" },
-       [SC_TERABIT] =  { BIT, TERABIT, "Tb", "tbit" },
+       [SC_BYTE] =     { BYTE, 1, "B", "byte" },
+       [SC_KILOBYTE] = { BYTE, KILO, "KB", "kbyte" },
+       [SC_MEGABYTE] = { BYTE, MEGA, "MB", "mbyte" },
+       [SC_GIGABYTE] = { BYTE, GIGA, "GB", "gbyte" },
+       [SC_TERABYTE] = { BYTE, TERA, "TB", "tbyte" },
+       [SC_AUTOBYTE] = { BYTE, 0, "", "autobyte" },
+
+       [SC_BIT] =      { BIT, 1, "b", "bit" },
+       [SC_KILOBIT] =  { BIT, KILO, "Kb", "kbit" },
+       [SC_MEGABIT] =  { BIT, MEGA, "Mb", "mbit" },
+       [SC_GIGABIT] =  { BIT, GIGA, "Gb", "gbit" },
+       [SC_TERABIT] =  { BIT, TERA, "Tb", "tbit" },
+       [SC_AUTOBIT] =  { BIT, 0, "", "autobit" },
 
        [SC_AUTO] =     { 0, 0, "", "auto" }
 };
@@ -76,21 +72,23 @@ struct convtbl *
 get_tbl_ptr(const uintmax_t size, const int scale)
 {
        uintmax_t        tmp;
-       int              idx;
+       int              disp_bits, idx;
 
-       /* If our index is out of range, default to auto-scaling. */
-       idx = scale < SC_AUTO ? scale : SC_AUTO;
+       /* If our index is out of range, default to auto-scaling in bits. */
+       idx = scale < SC_AUTOBIT ? scale : SC_AUTOBIT;
+       disp_bits = idx > SC_AUTOBYTE;
 
-       if (idx == SC_AUTO)
+       if (idx == SC_AUTOBYTE || idx == SC_AUTOBIT)
                /*
                 * Simple but elegant algorithm.  Count how many times
-                * we can shift our size value right by a factor of ten,
+                * we can divide our size value by 1000,
                 * incrementing an index each time.  We then use the
                 * index as the array index into the conversion table.
                 */
-               for (tmp = size, idx = SC_KILOBYTE;
-                    tmp >= MEGABYTE && idx < SC_BIT - 1;
-                    tmp >>= 10, idx++);
+               for (tmp = size, idx = disp_bits ? SC_BIT : SC_BYTE;
+                    tmp >= 1000 / (disp_bits ? BIT : BYTE) &&
+                    idx < (disp_bits ? SC_AUTOBIT : SC_AUTOBYTE) - 1;
+                    tmp /= 1000, idx++);
 
        return (&convtbl[idx]);
 }
index ab891f9..8a47ef6 100644 (file)
@@ -43,11 +43,13 @@ enum scale {
        SC_MEGABYTE,
        SC_GIGABYTE,
        SC_TERABYTE,
+       SC_AUTOBYTE,
        SC_BIT,
        SC_KILOBIT,
        SC_MEGABIT,
        SC_GIGABIT,
        SC_TERABIT,
+       SC_AUTOBIT,
        SC_AUTO         /* KEEP THIS LAST */
 };
 
index 28b4e65..98fceca 100644 (file)
@@ -123,8 +123,8 @@ static       u_int getifnum(void);
 #define DOPUTTOTAL(c, r, d)    do {                                    \
        CLEAR_COLUMN((r), (c));                                         \
        mvprintw((r), (c), "%12.3f %s  ",                               \
-                convert(d##_##c, SC_AUTO),                             \
-                get_string(d##_##c, SC_AUTO));                         \
+                convert(d##_##c, SC_AUTOBYTE),                         \
+                get_string(d##_##c, SC_AUTOBYTE));                     \
 } while (0)
 
 #define PUTRATE(c, r)  do {                                            \