diff options
author | Eric Andersen | 2001-06-13 08:02:45 +0000 |
---|---|---|
committer | Eric Andersen | 2001-06-13 08:02:45 +0000 |
commit | f429baca868b7f62ffdeefbfce41abd677f97876 (patch) | |
tree | 64925420925deb361a2024b9b362e5c987334124 | |
parent | 17822cd60aaf9333a9895494edcf03a0037de54c (diff) | |
download | busybox-f429baca868b7f62ffdeefbfce41abd677f97876.zip busybox-f429baca868b7f62ffdeefbfce41abd677f97876.tar.gz |
I reworked make_human_readable_str so it now has a sane interface,
and then fixed up df, du, and ls to use the new interface. I also
fixed up some formatting issues in ls while I was in there.
-Erik
-rw-r--r-- | coreutils/df.c | 31 | ||||
-rw-r--r-- | coreutils/du.c | 15 | ||||
-rw-r--r-- | coreutils/ls.c | 11 | ||||
-rw-r--r-- | df.c | 31 | ||||
-rw-r--r-- | du.c | 15 | ||||
-rw-r--r-- | include/libbb.h | 2 | ||||
-rw-r--r-- | libbb/human_readable.c | 48 | ||||
-rw-r--r-- | libbb/libbb.h | 2 | ||||
-rw-r--r-- | ls.c | 11 |
9 files changed, 58 insertions, 108 deletions
diff --git a/coreutils/df.c b/coreutils/df.c index df68744..6a81086 100644 --- a/coreutils/df.c +++ b/coreutils/df.c @@ -32,7 +32,7 @@ extern const char mtab_file[]; /* Defined in utility.c */ #ifdef BB_FEATURE_HUMAN_READABLE -static unsigned long df_disp_hr = KILOBYTE; +static unsigned long df_disp_hr = 1; #endif static int do_df(char *device, const char *mount_point) @@ -40,9 +40,6 @@ static int do_df(char *device, const char *mount_point) struct statfs s; long blocks_used; long blocks_percent_used; -#ifdef BB_FEATURE_HUMAN_READABLE - long base; -#endif if (statfs(mount_point, &s) != 0) { perror_msg("%s", mount_point); @@ -65,27 +62,15 @@ static int do_df(char *device, const char *mount_point) return FALSE; } #ifdef BB_FEATURE_HUMAN_READABLE - switch (df_disp_hr) { - case MEGABYTE: - base = KILOBYTE; - break; - case KILOBYTE: - base = 1; - break; - default: - base = 0; - } printf("%-20s %9s ", device, - make_human_readable_str((unsigned long)(s.f_blocks * - (s.f_bsize/(double)KILOBYTE)), base)); + make_human_readable_str(s.f_blocks, s.f_bsize/KILOBYTE, df_disp_hr)); + printf("%9s ", - make_human_readable_str((unsigned long)( - (s.f_blocks - s.f_bfree) * - (s.f_bsize/(double)KILOBYTE)), base)); + make_human_readable_str( (s.f_blocks - s.f_bfree), s.f_bsize/KILOBYTE, df_disp_hr)); + printf("%9s %3ld%% %s\n", - make_human_readable_str((unsigned long)(s.f_bavail * - (s.f_bsize/(double)KILOBYTE)), base), - blocks_percent_used, mount_point); + make_human_readable_str(s.f_bavail, s.f_bsize/KILOBYTE, df_disp_hr), + blocks_percent_used, mount_point); #else printf("%-20s %9ld %9ld %9ld %3ld%% %s\n", device, @@ -119,7 +104,7 @@ extern int df_main(int argc, char **argv) strcpy(disp_units_hdr, " Size"); break; case 'm': - df_disp_hr = MEGABYTE; + df_disp_hr = KILOBYTE; strcpy(disp_units_hdr, "1M-blocks"); break; #endif diff --git a/coreutils/du.c b/coreutils/du.c index fd19855..1966e35 100644 --- a/coreutils/du.c +++ b/coreutils/du.c @@ -46,19 +46,8 @@ static Display *print; static void print_normal(long size, char *filename) { - unsigned long base; #ifdef BB_FEATURE_HUMAN_READABLE - switch (disp_hr) { - case MEGABYTE: - base = KILOBYTE; - break; - case KILOBYTE: - base = 1; - break; - default: - base = 0; - } - printf("%s\t%s\n", make_human_readable_str(size, base), filename); + printf("%s\t%s\n", make_human_readable_str(size<<10, 1, disp_hr), filename); #else printf("%ld\t%s\n", size, filename); #endif @@ -259,7 +248,7 @@ int du_main(int argc, char **argv) return status; } -/* $Id: du.c,v 1.48 2001/06/01 21:47:15 andersen Exp $ */ +/* $Id: du.c,v 1.49 2001/06/13 08:02:44 andersen Exp $ */ /* Local Variables: c-file-style: "linux" diff --git a/coreutils/ls.c b/coreutils/ls.c index ec8e216..c54b6a4 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -610,8 +610,8 @@ static int list_single(struct dnode *dn) break; case LIST_BLOCKS: #ifdef BB_FEATURE_HUMAN_READABLE - fprintf(stdout, "%5s ", make_human_readable_str(dn->dstat.st_blocks>>1, - (ls_disp_hr==TRUE)? 0: 1)); + fprintf(stdout, "%4s ", make_human_readable_str(dn->dstat.st_blocks>>1, + KILOBYTE, (ls_disp_hr==TRUE)? 0: 1)); #else #if _FILE_OFFSET_BITS == 64 printf("%4lld ", dn->dstat.st_blocks>>1); @@ -622,7 +622,7 @@ static int list_single(struct dnode *dn) column += 5; break; case LIST_MODEBITS: - printf("%10s", (char *)mode_string(dn->dstat.st_mode)); + printf("%-10s ", (char *)mode_string(dn->dstat.st_mode)); column += 10; break; case LIST_NLINKS: @@ -634,7 +634,7 @@ static int list_single(struct dnode *dn) my_getpwuid(scratch, dn->dstat.st_uid); printf("%-8.8s ", scratch); my_getgrgid(scratch, dn->dstat.st_gid); - printf("%-8.8s", scratch); + printf("%-8.8s ", scratch); column += 17; break; #endif @@ -649,8 +649,7 @@ static int list_single(struct dnode *dn) } else { #ifdef BB_FEATURE_HUMAN_READABLE if (ls_disp_hr==TRUE) { - fprintf(stdout, "%9s ", make_human_readable_str( - dn->dstat.st_size>>10, 0)); + fprintf(stdout, "%8s ", make_human_readable_str(dn->dstat.st_size, 1, 0)); } else #endif { @@ -32,7 +32,7 @@ extern const char mtab_file[]; /* Defined in utility.c */ #ifdef BB_FEATURE_HUMAN_READABLE -static unsigned long df_disp_hr = KILOBYTE; +static unsigned long df_disp_hr = 1; #endif static int do_df(char *device, const char *mount_point) @@ -40,9 +40,6 @@ static int do_df(char *device, const char *mount_point) struct statfs s; long blocks_used; long blocks_percent_used; -#ifdef BB_FEATURE_HUMAN_READABLE - long base; -#endif if (statfs(mount_point, &s) != 0) { perror_msg("%s", mount_point); @@ -65,27 +62,15 @@ static int do_df(char *device, const char *mount_point) return FALSE; } #ifdef BB_FEATURE_HUMAN_READABLE - switch (df_disp_hr) { - case MEGABYTE: - base = KILOBYTE; - break; - case KILOBYTE: - base = 1; - break; - default: - base = 0; - } printf("%-20s %9s ", device, - make_human_readable_str((unsigned long)(s.f_blocks * - (s.f_bsize/(double)KILOBYTE)), base)); + make_human_readable_str(s.f_blocks, s.f_bsize/KILOBYTE, df_disp_hr)); + printf("%9s ", - make_human_readable_str((unsigned long)( - (s.f_blocks - s.f_bfree) * - (s.f_bsize/(double)KILOBYTE)), base)); + make_human_readable_str( (s.f_blocks - s.f_bfree), s.f_bsize/KILOBYTE, df_disp_hr)); + printf("%9s %3ld%% %s\n", - make_human_readable_str((unsigned long)(s.f_bavail * - (s.f_bsize/(double)KILOBYTE)), base), - blocks_percent_used, mount_point); + make_human_readable_str(s.f_bavail, s.f_bsize/KILOBYTE, df_disp_hr), + blocks_percent_used, mount_point); #else printf("%-20s %9ld %9ld %9ld %3ld%% %s\n", device, @@ -119,7 +104,7 @@ extern int df_main(int argc, char **argv) strcpy(disp_units_hdr, " Size"); break; case 'm': - df_disp_hr = MEGABYTE; + df_disp_hr = KILOBYTE; strcpy(disp_units_hdr, "1M-blocks"); break; #endif @@ -46,19 +46,8 @@ static Display *print; static void print_normal(long size, char *filename) { - unsigned long base; #ifdef BB_FEATURE_HUMAN_READABLE - switch (disp_hr) { - case MEGABYTE: - base = KILOBYTE; - break; - case KILOBYTE: - base = 1; - break; - default: - base = 0; - } - printf("%s\t%s\n", make_human_readable_str(size, base), filename); + printf("%s\t%s\n", make_human_readable_str(size<<10, 1, disp_hr), filename); #else printf("%ld\t%s\n", size, filename); #endif @@ -259,7 +248,7 @@ int du_main(int argc, char **argv) return status; } -/* $Id: du.c,v 1.48 2001/06/01 21:47:15 andersen Exp $ */ +/* $Id: du.c,v 1.49 2001/06/13 08:02:44 andersen Exp $ */ /* Local Variables: c-file-style: "linux" diff --git a/include/libbb.h b/include/libbb.h index f24a381..893a9f0 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -198,12 +198,12 @@ struct sysinfo { }; extern int sysinfo (struct sysinfo* info); -const char *make_human_readable_str(unsigned long val, unsigned long not_hr); enum { KILOBYTE = 1024, MEGABYTE = (KILOBYTE*1024), GIGABYTE = (MEGABYTE*1024) }; +const char *make_human_readable_str(unsigned long size, unsigned long block_size, unsigned long display_unit); int ask_confirmation(void); int klogctl(int type, char * b, int len); diff --git a/libbb/human_readable.c b/libbb/human_readable.c index ff21751..2cb8875 100644 --- a/libbb/human_readable.c +++ b/libbb/human_readable.c @@ -1,10 +1,8 @@ /* vi: set sw=4 ts=4: */ /* - * Utility routines. + * make_human_readable_str * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. + * Copyright (C) 1999-2001 Erik Andersen <andersee@debian.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,10 +17,6 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * */ #include <stdio.h> @@ -30,28 +24,38 @@ -const char *make_human_readable_str(unsigned long val, unsigned long hr) +const char *make_human_readable_str(unsigned long size, + unsigned long block_size, unsigned long display_unit) { - int i=0; static char str[10] = "\0"; - static const char strings[] = { 'k', 'M', 'G', 'T', 0 }; - unsigned long divisor = 1; + static const char strings[] = { 0, 'k', 'M', 'G', 'T', 0 }; - if(val == 0) + if(size == 0 || block_size == 0) return("0"); - if(hr) - snprintf(str, 9, "%ld", val/hr); - else { - while(val >= divisor && i <= 4) { - divisor=divisor<<10, i++; - } - divisor=divisor>>10, i--; - snprintf(str, 9, "%.1Lf%c", (long double)(val)/divisor, strings[i]); + + if(display_unit) { + snprintf(str, 9, "%ld", (size/display_unit)*block_size); + } else { + /* Ok, looks like they want us to autoscale */ + int i=0; + unsigned long divisor = 1; + long double result = size*block_size; + for(i=0; i <= 4; i++) { + divisor<<=10; + if (result <= divisor) { + divisor>>=10; + break; + } + } + result/=divisor; + if (result > 10) + snprintf(str, 9, "%.0Lf%c", result, strings[i]); + else + snprintf(str, 9, "%.1Lf%c", result, strings[i]); } return(str); } - /* END CODE */ /* Local Variables: diff --git a/libbb/libbb.h b/libbb/libbb.h index f24a381..893a9f0 100644 --- a/libbb/libbb.h +++ b/libbb/libbb.h @@ -198,12 +198,12 @@ struct sysinfo { }; extern int sysinfo (struct sysinfo* info); -const char *make_human_readable_str(unsigned long val, unsigned long not_hr); enum { KILOBYTE = 1024, MEGABYTE = (KILOBYTE*1024), GIGABYTE = (MEGABYTE*1024) }; +const char *make_human_readable_str(unsigned long size, unsigned long block_size, unsigned long display_unit); int ask_confirmation(void); int klogctl(int type, char * b, int len); @@ -610,8 +610,8 @@ static int list_single(struct dnode *dn) break; case LIST_BLOCKS: #ifdef BB_FEATURE_HUMAN_READABLE - fprintf(stdout, "%5s ", make_human_readable_str(dn->dstat.st_blocks>>1, - (ls_disp_hr==TRUE)? 0: 1)); + fprintf(stdout, "%4s ", make_human_readable_str(dn->dstat.st_blocks>>1, + KILOBYTE, (ls_disp_hr==TRUE)? 0: 1)); #else #if _FILE_OFFSET_BITS == 64 printf("%4lld ", dn->dstat.st_blocks>>1); @@ -622,7 +622,7 @@ static int list_single(struct dnode *dn) column += 5; break; case LIST_MODEBITS: - printf("%10s", (char *)mode_string(dn->dstat.st_mode)); + printf("%-10s ", (char *)mode_string(dn->dstat.st_mode)); column += 10; break; case LIST_NLINKS: @@ -634,7 +634,7 @@ static int list_single(struct dnode *dn) my_getpwuid(scratch, dn->dstat.st_uid); printf("%-8.8s ", scratch); my_getgrgid(scratch, dn->dstat.st_gid); - printf("%-8.8s", scratch); + printf("%-8.8s ", scratch); column += 17; break; #endif @@ -649,8 +649,7 @@ static int list_single(struct dnode *dn) } else { #ifdef BB_FEATURE_HUMAN_READABLE if (ls_disp_hr==TRUE) { - fprintf(stdout, "%9s ", make_human_readable_str( - dn->dstat.st_size>>10, 0)); + fprintf(stdout, "%8s ", make_human_readable_str(dn->dstat.st_size, 1, 0)); } else #endif { |