Index | Thread | Search

From:
Mark Kettenis <mark.kettenis@xs4all.nl>
Subject:
Re: dd commas
To:
joshua stein <jcs@jcs.org>
Cc:
tech@openbsd.org
Date:
Mon, 18 Nov 2024 21:44:57 +0100

Download raw body.

Thread
  • Janne Johansson:

    dd commas

  • Mark Kettenis:

    dd commas

    • Walter Alejandro Iglesias:

      dd commas

  • Christian Weisgerber:

    dd commas

  • > Date: Mon, 18 Nov 2024 13:36:55 -0600
    > From: joshua stein <jcs@jcs.org>
    
    Using commas as a thousands separater is a bad idea.  Only the
    anglosphere does do that and more importantly, many countries use the
    comma as the decimal separater.
    
    > Maybe someone else will find this useful, but when I ^T dd and see 
    > output like 1257557196800, I have to highlight three digits at a 
    > time in my terminal for my brain to understand if it's at hundreds 
    > of gigabytes or in terabytes.
    > 
    > Before:
    > 
    >     11994+0 records in
    >     11993+0 records out
    >     1257557196800 bytes transferred in 5017.398 secs (250659198 bytes/sec)
    > 
    > After:
    > 
    >     11994+0 records in
    >     11993+0 records out
    >     1,257,557,196,800 bytes transferred in 5017.398 secs (250,659,198 bytes/sec)
    > 
    > 
    > diff --git bin/dd/extern.h bin/dd/extern.h
    > index aff85daf021..2f2ce4629ad 100644
    > --- bin/dd/extern.h
    > +++ bin/dd/extern.h
    > @@ -38,6 +38,7 @@
    >  
    >  void block(void);
    >  void block_close(void);
    > +void commafy(unsigned long long, char *, size_t);
    >  void dd_out(int);
    >  void def(void);
    >  void def_close(void);
    > diff --git bin/dd/misc.c bin/dd/misc.c
    > index cd0ba9fa41d..0671c35ed42 100644
    > --- bin/dd/misc.c
    > +++ bin/dd/misc.c
    > @@ -49,6 +49,7 @@
    >  void
    >  sig_summary(int notused)
    >  {
    > +	char bstr[26], pstr[26];
    >  	int save_errno = errno;
    >  	struct timespec elapsed, now;
    >  	unsigned long long bps, msec;
    > @@ -85,10 +86,12 @@ sig_summary(int notused)
    >  		    st.trunc, (st.trunc == 1) ? "block" : "blocks");
    >  	}
    >  	if (!(ddflags & C_NOXFER)) {
    > +		commafy(st.bytes, bstr, sizeof(bstr));
    > +		commafy(bps, pstr, sizeof(pstr));
    >  		dprintf(STDERR_FILENO,
    > -		    "%lld bytes transferred in %lld.%03ld secs "
    > -		    "(%llu bytes/sec)\n", (long long)st.bytes,
    > -		    (long long)elapsed.tv_sec, elapsed.tv_nsec / 1000000, bps);
    > +		    "%s bytes transferred in %lld.%03ld secs "
    > +		    "(%s bytes/sec)\n", bstr, elapsed.tv_sec,
    > +		    elapsed.tv_nsec / 1000000, pstr);
    >  	}
    >  	errno = save_errno;
    >  }
    > @@ -107,3 +110,24 @@ exit_summary(void)
    >  {
    >  	sig_summary(0);
    >  }
    > +
    > +void
    > +commafy(unsigned long long count, char *dst, size_t size)
    > +{
    > +	char llstr[26];
    > +	int n, len, pos, cpos;
    > +
    > +	len = snprintf(llstr, sizeof(llstr), "%llu", count);
    > +	cpos = len + ((len - 1) / 3);
    > +
    > +	if (cpos > size)
    > +		return;
    > +
    > +	dst[cpos--] = '\0';
    > +
    > +	for (n = 0, pos = len - 1; n < len; n++) {
    > +		if (n && n % 3 == 0)
    > +			dst[cpos--] = ',';
    > +		dst[cpos--] = llstr[pos--];
    > +	}
    > +}
    > 
    > 
    
    
    
  • Janne Johansson:

    dd commas

  • Mark Kettenis:

    dd commas

  • Christian Weisgerber:

    dd commas