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:
parent
5251135bc1
commit
93dd9fd90a
@ -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+";
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user