Just got some positive user feedback off-list.
Any takers?

On 02/11/18 13:48, Martijn van Duren wrote:
> Some documentation nits found by jmc.
> 
> On 02/11/18 12:31, Martijn van Duren wrote:
>> Hello tech@,
>>
>> Since my brain is incapable of quickly processing numbers larger than a
>> million (even with the thousand separators enabled), I would like to
>> introduce the -h flag to systat.
>> In order not to loose too much information I do the rollover at values  
>> from 10.0000 up.
>> I didn't use fmt_scaled, because it's intended for bytecounts and it's
>> inside libutil, which isn't linked to systat.
>>
>> It's possible to toggle it at runtime via the "human" command, but I
>> didn't add a single letter switch, since that space is already quite
>> crammed.
>>
>> OK?
>>
>> martijn@
>>
> 
> Index: engine.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/engine.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 engine.c
> --- engine.c  8 Feb 2018 07:00:33 -0000       1.22
> +++ engine.c  11 Feb 2018 12:46:19 -0000
> @@ -52,6 +52,7 @@ struct view_ent {
>  
>  useconds_t udelay = 5000000;
>  int dispstart = 0;
> +int humanreadable = 0;
>  int interactive = 1;
>  int averageonly = 0;
>  int maxprint = 0;
> @@ -717,6 +718,8 @@ void
>  print_fld_sdiv(field_def *fld, u_int64_t size, int d)
>  {
>       int len;
> +     char *mult = "KMGTPE";
> +     int i = -1;
>  
>       if (fld == NULL)
>               return;
> @@ -726,35 +729,21 @@ 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;
> -
> -     tb_start();
> -     size /= d;
> -     if (tbprintft("%lluT", size) <= len)
> -             goto ok;
> -     
> +     if (humanreadable) {
> +             while (size >= 10000 && sizeof(mult) >= i + 1) {
> +                     i++;
> +                     size /= d;
> +             }
> +             if (tbprintft("%llu%.1s", size, i == -1 ? "" : mult + i) <= len)
> +                     goto ok;
> +     }
> +     while (size != 0 && sizeof(mult) >= i + 1) {
> +             tb_start();
> +             if (tbprintft("%llu%.1s", size, i == -1 ? "" : mult + i) <= len)
> +                     goto ok;
> +             i++;
> +             size /= d;
> +     }
>  err:
>       print_fld_str(fld, "*");
>       tb_end();
> Index: engine.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/engine.h,v
> retrieving revision 1.9
> diff -u -p -r1.9 engine.h
> --- engine.h  8 Feb 2018 07:00:33 -0000       1.9
> +++ engine.h  11 Feb 2018 12:46:19 -0000
> @@ -148,6 +148,7 @@ void foreach_view(void (*callback)(field
>  extern int sortdir;
>  extern useconds_t udelay;
>  extern int dispstart;
> +extern int humanreadable;
>  extern int interactive;
>  extern int averageonly;
>  extern int maxprint;
> Index: main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/main.c,v
> retrieving revision 1.67
> diff -u -p -r1.67 main.c
> --- main.c    8 Feb 2018 07:00:33 -0000       1.67
> +++ main.c    11 Feb 2018 12:46:19 -0000
> @@ -212,7 +212,7 @@ void
>  usage(void)
>  {
>       extern char *__progname;
> -     fprintf(stderr, "usage: %s [-aBbiNn] [-d count] "
> +     fprintf(stderr, "usage: %s [-aBbhiNn] [-d count] "
>           "[-s delay] [-w width] [view] [delay]\n", __progname);
>       exit(1);
>  }
> @@ -305,6 +305,10 @@ cmd_compat(const char *buf)
>               need_update = 1;
>               return;
>       }
> +     if (strncasecmp(buf, "human", 5) == 0) {
> +             humanreadable = !humanreadable;
> +             return;
> +     }
>  
>       for (s = buf; *s && strchr("0123456789+-.eE", *s) != NULL; s++)
>               ;
> @@ -437,7 +441,7 @@ main(int argc, char *argv[])
>       if (setresgid(gid, gid, gid) == -1)
>               err(1, "setresgid");
>  
> -     while ((ch = getopt(argc, argv, "BNabd:ins:w:")) != -1) {
> +     while ((ch = getopt(argc, argv, "BNabd:hins:w:")) != -1) {
>               switch (ch) {
>               case 'a':
>                       maxlines = -1;
> @@ -455,6 +459,9 @@ main(int argc, char *argv[])
>                       countmax = strtonum(optarg, 1, INT_MAX, &errstr);
>                       if (errstr)
>                               errx(1, "-d %s: %s", optarg, errstr);
> +                     break;
> +             case 'h':
> +                     humanreadable = 1;
>                       break;
>               case 'i':
>                       interactive = 1;
> Index: systat.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/systat.1,v
> retrieving revision 1.103
> diff -u -p -r1.103 systat.1
> --- systat.1  8 Feb 2018 07:00:33 -0000       1.103
> +++ systat.1  11 Feb 2018 12:46:19 -0000
> @@ -38,7 +38,7 @@
>  .Nd display system statistics
>  .Sh SYNOPSIS
>  .Nm systat
> -.Op Fl aBbiNn
> +.Op Fl aBbhiNn
>  .Op Fl d Ar count
>  .Op Fl s Ar delay
>  .Op Fl w Ar width
> @@ -101,6 +101,8 @@ with statistics displayed every update.
>  Exit after
>  .Ar count
>  screen updates.
> +.It Fl h
> +Human readable mode.
>  .It Fl i
>  Interactive mode.
>  .It Fl N
> @@ -219,6 +221,8 @@ command interpreter.
>  .Bl -tag -width Fl
>  .It Ic help
>  Print the names of the available views on the command line.
> +.It Ic human
> +Toggle human readable mode.
>  .It Ic order
>  Print the names of the available orderings on the command line.
>  .It Ic quit
> 

Reply via email to