I reworked make_human_readable_str so it now has a sane interface,
authorEric Andersen <andersen@codepoet.org>
Wed, 13 Jun 2001 08:02:45 +0000 (08:02 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 13 Jun 2001 08:02:45 +0000 (08:02 -0000)
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

coreutils/df.c
coreutils/du.c
coreutils/ls.c
df.c
du.c
include/libbb.h
libbb/human_readable.c
libbb/libbb.h
ls.c

index df68744337e2ebf4adc52ad2c43e3fd7a7681cd6..6a81086cb19f00439d6f34ae0bbe15d5dc899277 100644 (file)
@@ -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
index fd19855e1bc9b37882833b15d08853fc6f422ae6..1966e35591947b0deaf768a8c76dada60773ab5a 100644 (file)
@@ -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"
index ec8e216fa76943caaeea3cac863ead741c69be71..c54b6a42f279a238ecc467a13e0e9e70cf3ecec9 100644 (file)
@@ -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 
                                        {
diff --git a/df.c b/df.c
index df68744337e2ebf4adc52ad2c43e3fd7a7681cd6..6a81086cb19f00439d6f34ae0bbe15d5dc899277 100644 (file)
--- a/df.c
+++ b/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/du.c b/du.c
index fd19855e1bc9b37882833b15d08853fc6f422ae6..1966e35591947b0deaf768a8c76dada60773ab5a 100644 (file)
--- a/du.c
+++ b/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"
index f24a38109ccb9feb08551d0e628c3e24a2be67b1..893a9f07f7fd0d242236a29ae327f8348d02f2a2 100644 (file)
@@ -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);
index ff2175175bb365f038a11f25a9de79d758b556a5..2cb887563c534c777a17d9bd936cf01ee2f57def 100644 (file)
@@ -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
  * 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>
 
 
 
-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:
index f24a38109ccb9feb08551d0e628c3e24a2be67b1..893a9f07f7fd0d242236a29ae327f8348d02f2a2 100644 (file)
@@ -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/ls.c b/ls.c
index ec8e216fa76943caaeea3cac863ead741c69be71..c54b6a42f279a238ecc467a13e0e9e70cf3ecec9 100644 (file)
--- a/ls.c
+++ b/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 
                                        {