du: extra compat: with -k and -m, round sizes up
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 15 Oct 2015 19:33:34 +0000 (21:33 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 15 Oct 2015 19:33:34 +0000 (21:33 +0200)
function                                             old     new   delta
print                                                 36      65     +29

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/du.c
libbb/human_readable.c

index 9c6ff880050871fd9834ca007dcbdd5238e8aab0..1889c16bb13c0861bd82b6e46b428610a1245128 100644 (file)
@@ -75,7 +75,7 @@ enum {
 
 struct globals {
 #if ENABLE_FEATURE_HUMAN_READABLE
-       unsigned long disp_hr;
+       unsigned long disp_unit;
 #else
        unsigned disp_k;
 #endif
@@ -89,18 +89,27 @@ struct globals {
 #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)
 {
        /* TODO - May not want to defer error checking here. */
 #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",
-                       /* size x 512 / G.disp_hr, show one fractional,
-                        * use suffixes if G.disp_hr == 0 */
-                       make_human_readable_str(size, 512, G.disp_hr),
+                       /* size x 512 / G.disp_unit.
+                        * If G.disp_unit == 0, show one fractional
+                        * and use suffixes
+                        */
+                       make_human_readable_str(size, 512, G.disp_unit),
                        filename);
 #else
        if (G.disp_k) {
@@ -199,10 +208,10 @@ int du_main(int argc UNUSED_PARAM, char **argv)
        INIT_G();
 
 #if ENABLE_FEATURE_HUMAN_READABLE
-       IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_hr = 1024;)
-       IF_NOT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_hr = 512;)
+       IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_unit = 1024;)
+       IF_NOT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(G.disp_unit = 512;)
        if (getenv("POSIXLY_CORRECT"))  /* TODO - a new libbb function? */
-               G.disp_hr = 512;
+               G.disp_unit = 512;
 #else
        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 */
@@ -220,13 +229,13 @@ int du_main(int argc UNUSED_PARAM, char **argv)
        opt = getopt32(argv, "aHkLsx" "d:" "lc" "hm", &G.max_print_depth);
        argv += optind;
        if (opt & OPT_h_for_humans) {
-               G.disp_hr = 0;
+               G.disp_unit = 0;
        }
        if (opt & OPT_m_mbytes) {
-               G.disp_hr = 1024*1024;
+               G.disp_unit = 1024*1024;
        }
        if (opt & OPT_k_kbytes) {
-               G.disp_hr = 1024;
+               G.disp_unit = 1024;
        }
 #else
        opt_complementary = "H-L:L-H:s-d:d-s:d+";
index 5c7fc076ff52a9e9f0b46d869446ec4f2bc5b727..b4e0ef181a0decb9ea43f2f76a4a99f151c3cacc 100644 (file)
  *      representations (say, powers of 1024) and manipulating coefficients.
  *      The base ten "bytes" output could be handled similarly.
  *
- *   2) This routine always outputs a decimal point and a tenths digit when
- *      display_unit != 0.  Hence, it isn't uncommon for the returned string
+ *   2) This routine outputs a decimal point and a tenths digit when
+ *      display_unit == 0.  Hence, it isn't uncommon for the returned string
  *      to have a length of 5 or 6.
  *
- *      It might be nice to add a flag to indicate no decimal digits in
- *      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.
+ *      If block_size is also 0, no decimal digits are printed.
  *
  * Licensed under GPLv2, see file LICENSE in this source tree.
  */