Index: engine.c =================================================================== RCS file: /cvs/src/usr.bin/systat/engine.c,v retrieving revision 1.21 diff -u -p -r1.21 engine.c --- engine.c 5 Apr 2017 15:57:11 -0000 1.21 +++ engine.c 29 Jan 2018 01:33:34 -0000 @@ -713,9 +713,55 @@ ok: print_fld_tb(fld); } +static const char fmt_suffixes[] = { 'K', 'M', 'G', 'T', '\0' }; + +ssize_t +fmt_sdiv(char *buf, size_t len, int width, u_int64_t size, int d) +{ + const char *suffix = fmt_suffixes; + ssize_t rv; + + rv = snprintf(buf, len, "%llu", size); + if (rv <= width) + return (rv); + + for (suffix = fmt_suffixes; *suffix != '\0'; suffix++) { + size /= d; + + rv = snprintf(buf, len, "%llu%c", size, *suffix); + if (rv <= width) + return (rv); + } + + return (-1); +} + +ssize_t +fmt_ssdiv(char *buf, size_t len, int width, int64_t ssize, int d) +{ + const char *suffix; + ssize_t rv; + + rv = snprintf(buf, len, "%lld", ssize); + if (rv <= width) + return (rv); + + for (suffix = fmt_suffixes; *suffix != '\0'; suffix++) { + ssize /= d; + + rv = snprintf(buf, len, "%lld%c", ssize, *suffix); + if (rv <= width) + return (rv); + } + + return (-1); +} + void print_fld_sdiv(field_def *fld, u_int64_t size, int d) { + const char *str; + ssize_t rv; int len; if (fld == NULL) @@ -726,42 +772,14 @@ print_fld_sdiv(field_def *fld, u_int64_t return; tb_start(); - if (tbprintft("%llu", size) <= len) - goto ok; - - tb_start(); - size /= d; - if (tbprintft("%lluK", size) <= len) - goto ok; - if (size == 0) - goto err; - - tb_start(); - size /= d; - if (tbprintft("%lluM", size) <= len) - goto ok; - if (size == 0) - goto err; - - tb_start(); - size /= d; - if (tbprintft("%lluG", size) <= len) - goto ok; - if (size == 0) - goto err; + rv = fmt_sdiv(tb_ptr, tb_len, len, size, d); + if (rv == -1) + str = "*"; + else + str = tb_ptr; - tb_start(); - size /= d; - if (tbprintft("%lluT", size) <= len) - goto ok; - -err: - print_fld_str(fld, "*"); + print_fld_str(fld, str); tb_end(); - return; - -ok: - print_fld_tb(fld); } void @@ -773,6 +791,8 @@ print_fld_size(field_def *fld, u_int64_t void print_fld_ssdiv(field_def *fld, int64_t size, int d) { + const char *str; + ssize_t rv; int len; if (fld == NULL) @@ -783,42 +803,14 @@ print_fld_ssdiv(field_def *fld, int64_t return; tb_start(); - if (tbprintft("%lld", size) <= len) - goto ok; - - tb_start(); - size /= d; - if (tbprintft("%lldK", size) <= len) - goto ok; - if (size == 0) - goto err; + rv = fmt_sdiv(tb_ptr, tb_len, len, size, d); + if (rv == -1) + str = "*"; + else + str = tb_ptr; - tb_start(); - size /= d; - if (tbprintft("%lldM", size) <= len) - goto ok; - if (size == 0) - goto err; - - tb_start(); - size /= d; - if (tbprintft("%lldG", size) <= len) - goto ok; - if (size == 0) - goto err; - - tb_start(); - size /= d; - if (tbprintft("%lldT", size) <= len) - goto ok; - -err: - print_fld_str(fld, "*"); + print_fld_str(fld, str); tb_end(); - return; - -ok: - print_fld_tb(fld); } void Index: engine.h =================================================================== RCS file: /cvs/src/usr.bin/systat/engine.h,v retrieving revision 1.8 diff -u -p -r1.8 engine.h --- engine.h 7 Sep 2013 11:43:49 -0000 1.8 +++ engine.h 29 Jan 2018 00:56:25 -0000 @@ -121,6 +121,9 @@ void print_fld_tb(field_def *); void print_title(void); +ssize_t fmt_sdiv(char *, size_t, int, u_int64_t, int); +ssize_t fmt_ssdiv(char *, size_t, int, int64_t, int); + void hide_field(field_def *fld); void show_field(field_def *fld); void field_setup(void); Index: vmstat.c =================================================================== RCS file: /cvs/src/usr.bin/systat/vmstat.c,v retrieving revision 1.82 diff -u -p -r1.82 vmstat.c --- vmstat.c 18 Dec 2016 23:36:32 -0000 1.82 +++ vmstat.c 29 Jan 2018 01:05:48 -0000 @@ -83,6 +83,7 @@ static float cputime(int); static void dinfo(int, int); static void getinfo(struct Info *); void putint(int, int, int, int); +void putsize(u_int64_t, int, int, int); void putintmk(int, int, int, int); void putuint64(u_int64_t, int, int, int); void putfloat(double, int, int, int, int, int); @@ -224,7 +225,7 @@ labelkre(void) { int i, j, l; - mvprintw(MEMROW, MEMCOL, " memory totals (in KB)"); + mvprintw(MEMROW, MEMCOL, " memory totals"); mvprintw(MEMROW + 1, MEMCOL, " real virtual free"); mvprintw(MEMROW + 2, MEMCOL, "Active"); mvprintw(MEMROW + 3, MEMCOL, "All"); @@ -377,19 +378,19 @@ showkre(void) addch(cpuchar[c]); } -#define pgtokb(pg) ((pg) * (s.uvmexp.pagesize / 1024)) +#define pgtob(pg) ((u_int64_t)(pg) * (s.uvmexp.pagesize)) - putint(pgtokb(s.uvmexp.active), MEMROW + 2, MEMCOL + 7, 8); - putint(pgtokb(s.uvmexp.active + s.uvmexp.swpginuse), /* XXX */ + putsize(pgtob(s.uvmexp.active), MEMROW + 2, MEMCOL + 7, 8); + putsize(pgtob(s.uvmexp.active + s.uvmexp.swpginuse), /* XXX */ MEMROW + 2, MEMCOL + 17, 8); - putint(pgtokb(s.uvmexp.npages - s.uvmexp.free), MEMROW + 3, MEMCOL + 7, 8); - putint(pgtokb(s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse), + putsize(pgtob(s.uvmexp.npages - s.uvmexp.free), MEMROW + 3, MEMCOL + 7, 8); + putsize(pgtob(s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse), MEMROW + 3, MEMCOL + 17, 8); - putint(pgtokb(s.uvmexp.free), MEMROW + 2, MEMCOL + 26, 8); - putint(pgtokb(s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse), + putsize(pgtob(s.uvmexp.free), MEMROW + 2, MEMCOL + 26, 8); + putsize(pgtob(s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse), MEMROW + 3, MEMCOL + 26, 8); - putint(total.t_rq - 1, PROCSROW + 1, PROCSCOL + 3, 3); + putint(total.t_rq - 1, PROCSROW + 1, PROCSCOL + 3, 3); putint(total.t_dw, PROCSROW + 1, PROCSCOL + 6, 3); putint(total.t_sl, PROCSROW + 1, PROCSCOL + 9, 3); putint(total.t_sw, PROCSROW + 1, PROCSCOL + 12, 3); @@ -577,6 +578,28 @@ putfloat(double f, int l, int c, int w, addch('*'); return; } + addstr(b); +} + +void +putsize(u_int64_t s, int l, int c, int w) +{ + char b[128]; + ssize_t len; + int pad; + + move(l, c); + + len = fmt_sdiv(b, sizeof(b), w, s, 1024); + if (len == -1) { + while (--w >= 0) + addch('*'); + return; + } + + for (pad = len; pad < w; pad++) + addch(' '); + addstr(b); }