du: extra compat: with -k and -m, round sizes up

function                                             old     new   delta
print                                                 36      65     +29

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2015-10-15 21:33:34 +02:00
parent 5251135bc1
commit 93dd9fd90a
2 changed files with 26 additions and 22 deletions

View File

@ -75,7 +75,7 @@ enum {
struct globals { struct globals {
#if ENABLE_FEATURE_HUMAN_READABLE #if ENABLE_FEATURE_HUMAN_READABLE
unsigned long disp_hr; unsigned long disp_unit;
#else #else
unsigned disp_k; unsigned disp_k;
#endif #endif
@ -89,18 +89,27 @@ struct globals {
#define INIT_G() do { } while (0) #define INIT_G() do { } while (0)
/* FIXME? coreutils' du rounds sizes up:
* for example, 1025k file is shown as "2" by du -m.
* We round to nearest.
*/
static void print(unsigned long long size, const char *filename) static void print(unsigned long long size, const char *filename)
{ {
/* TODO - May not want to defer error checking here. */ /* TODO - May not want to defer error checking here. */
#if ENABLE_FEATURE_HUMAN_READABLE #if ENABLE_FEATURE_HUMAN_READABLE
# if ENABLE_DESKTOP
/* ~30 bytes of code for extra comtat:
* coreutils' du rounds sizes up:
* for example, 1025k file is shown as "2" by du -m.
* We round to nearest if human-readable [too hard to fix],
* else (fixed scale such as -m), we round up. To that end,
* add yet another half of the unit before displaying:
*/
if (G.disp_unit)
size += (G.disp_unit-1) / (unsigned)(512 * 2);
# endif
printf("%s\t%s\n", printf("%s\t%s\n",
/* size x 512 / G.disp_hr, show one fractional, /* size x 512 / G.disp_unit.
* use suffixes if G.disp_hr == 0 */ * If G.disp_unit == 0, show one fractional
make_human_readable_str(size, 512, G.disp_hr), * and use suffixes
*/
make_human_readable_str(size, 512, G.disp_unit),
filename); filename);
#else #else
if (G.disp_k) { if (G.disp_k) {
@ -199,10 +208,10 @@ int du_main(int argc UNUSED_PARAM, char **argv)
INIT_G(); INIT_G();
#if ENABLE_FEATURE_HUMAN_READABLE #if ENABLE_FEATURE_HUMAN_READABLE
IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_hr = 1024;) IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_unit = 1024;)
IF_NOT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_hr = 512;) IF_NOT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_unit = 512;)
if (getenv("POSIXLY_CORRECT")) /* TODO - a new libbb function? */ if (getenv("POSIXLY_CORRECT")) /* TODO - a new libbb function? */
G.disp_hr = 512; G.disp_unit = 512;
#else #else
IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_k = 1;) IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_k = 1;)
/* IF_NOT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_k = 0;) - G is pre-zeroed */ /* IF_NOT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_k = 0;) - G is pre-zeroed */
@ -220,13 +229,13 @@ int du_main(int argc UNUSED_PARAM, char **argv)
opt = getopt32(argv, "aHkLsx" "d:" "lc" "hm", &G.max_print_depth); opt = getopt32(argv, "aHkLsx" "d:" "lc" "hm", &G.max_print_depth);
argv += optind; argv += optind;
if (opt & OPT_h_for_humans) { if (opt & OPT_h_for_humans) {
G.disp_hr = 0; G.disp_unit = 0;
} }
if (opt & OPT_m_mbytes) { if (opt & OPT_m_mbytes) {
G.disp_hr = 1024*1024; G.disp_unit = 1024*1024;
} }
if (opt & OPT_k_kbytes) { if (opt & OPT_k_kbytes) {
G.disp_hr = 1024; G.disp_unit = 1024;
} }
#else #else
opt_complementary = "H-L:L-H:s-d:d-s:d+"; opt_complementary = "H-L:L-H:s-d:d-s:d+";

View File

@ -14,16 +14,11 @@
* representations (say, powers of 1024) and manipulating coefficients. * representations (say, powers of 1024) and manipulating coefficients.
* The base ten "bytes" output could be handled similarly. * The base ten "bytes" output could be handled similarly.
* *
* 2) This routine always outputs a decimal point and a tenths digit when * 2) This routine outputs a decimal point and a tenths digit when
* display_unit != 0. Hence, it isn't uncommon for the returned string * display_unit == 0. Hence, it isn't uncommon for the returned string
* to have a length of 5 or 6. * to have a length of 5 or 6.
* *
* It might be nice to add a flag to indicate no decimal digits in * If block_size is also 0, no decimal digits are printed.
* that case. This could be either an additional parameter, or a
* special value of display_unit. Such a flag would also be nice for du.
*
* Some code to omit the decimal point and tenths digit is sketched out
* and "#if 0"'d below.
* *
* Licensed under GPLv2, see file LICENSE in this source tree. * Licensed under GPLv2, see file LICENSE in this source tree.
*/ */