[Toybox] [PATCH] fix human_readable output for du

enh enh at google.com
Sat Aug 8 10:40:18 PDT 2015


ping.

On Sat, Jan 17, 2015 at 6:18 PM, enh <enh at google.com> wrote:
> this was the du patch. the documentation of the BSD function is
> https://www.freebsd.org/cgi/man.cgi?query=humanize_number&sektion=3&n=1
> and even just between dd and du a fair number of those flags are used.
> i didn't know whether you'd prefer i fix all the -h'es (and add the
> missing ones) or just worry about them one at a time. i guess i should
> have just gone ahead and looked at df and ls in the meantime :-)
>
> On Wed, Nov 26, 2014 at 12:48 PM, enh <enh at google.com> wrote:
>> Different tools have different ideas about what human-readable output
>> looks like. dd uses "7 MB" where du uses "7M", for example. this patch
>> adds flags, similar to the BSD humanize_number. most callers will pass
>> 0.
>>
>> diff --git a/lib/lib.c b/lib/lib.c
>> index 5923176..578f99a 100644
>> --- a/lib/lib.c
>> +++ b/lib/lib.c
>> @@ -831,7 +831,7 @@ void names_to_pid(char **names, int
>> (*callback)(pid_t pid, char *name))
>>
>>  // display first few digits of number with power of two units, except we're
>>  // actually just counting decimal digits and showing mil/bil/trillions.
>> -int human_readable(char *buf, unsigned long long num)
>> +int human_readable(char *buf, unsigned long long num, int style)
>>  {
>>    int end, len;
>>
>> @@ -844,9 +844,9 @@ int human_readable(char *buf, unsigned long long num)
>>      buf[1] = '.';
>>      end = 3;
>>    }
>> -  buf[end++] = ' ';
>> +  if (style & HR_SPACE) buf[end++] = ' ';
>>    if (len) buf[end++] = " KMGTPE"[len];
>> -  buf[end++] = 'B';
>> +  if (style & HR_B) buf[end++] = 'B';
>>    buf[end++] = 0;
>>
>>    return end;
>> diff --git a/lib/lib.h b/lib/lib.h
>> index 49b02bb..e3baec4 100644
>> --- a/lib/lib.h
>> +++ b/lib/lib.h
>> @@ -168,7 +168,9 @@ void replace_tempfile(int fdin, int fdout, char **tempname);
>>  void crc_init(unsigned int *crc_table, int little_endian);
>>  int terminal_size(unsigned *x, unsigned *y);
>>  int yesno(char *prompt, int def);
>> -int human_readable(char *buf, unsigned long long num);
>> +#define HR_SPACE 1
>> +#define HR_B 2
>> +int human_readable(char *buf, unsigned long long num, int style);
>>
>>  // net.c
>>  int xsocket(int domain, int type, int protocol);
>> diff --git a/toys/pending/dd.c b/toys/pending/dd.c
>> index a5c2452..202fb4b 100644
>> --- a/toys/pending/dd.c
>> +++ b/toys/pending/dd.c
>> @@ -133,9 +133,9 @@ static void summary()
>>    //out to STDERR
>>    fprintf(stderr,"%llu+%llu records in\n%llu+%llu records out\n",
>> st.in_full, st.in_part,
>>        st.out_full, st.out_part);
>> -  human_readable(toybuf, st.bytes);
>> +  human_readable(toybuf, st.bytes, HR_SPACE|HR_B);
>>    fprintf(stderr, "%llu bytes (%s) copied,",st.bytes, toybuf);
>> -  human_readable(toybuf, st.bytes/seconds);
>> +  human_readable(toybuf, st.bytes/seconds, HR_SPACE|HR_B);
>>    fprintf(stderr, "%f seconds, %s/s\n", seconds, toybuf);
>>  }
>>
>> diff --git a/toys/posix/du.c b/toys/posix/du.c
>> index 22a26d3..9d537a1 100644
>> --- a/toys/posix/du.c
>> +++ b/toys/posix/du.c
>> @@ -55,7 +55,7 @@ static void print(long long size, struct dirtree *node)
>>    if (TT.maxdepth && TT.depth > TT.maxdepth) return;
>>
>>    if (toys.optflags & FLAG_h) {
>> -    human_readable(toybuf, size);
>> +    human_readable(toybuf, size, 0);
>>      printf("%s", toybuf);
>>    } else {
>>      int bits = 10;



-- 
Elliott Hughes - http://who/enh - http://jessies.org/~enh/
Android native code/tools questions? Mail me/drop by/add me as a reviewer.

 1439055618.0


More information about the Toybox mailing list