ls: handle -s through option_mask32
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 23 Jan 2017 17:43:43 +0000 (18:43 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 23 Jan 2017 17:43:43 +0000 (18:43 +0100)
function                                             old     new   delta
scan_and_display_dirs_recur                          493     494      +1
sort_and_display_files                               424     423      -1
ls_main                                              682     677      -5

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

index 7ed6a1fdc9d13ddb795f78cc290b6c485ede2402..b138520b3ba0c7debe283ea8c3540b6d619c5511 100644 (file)
@@ -198,7 +198,6 @@ SPLIT_SUBDIR    = 2,
 
 /* 51306 lrwxrwxrwx  1 root     root         2 May 11 01:43 /bin/view -> vi* */
 /* what file information will be listed */
-LIST_BLOCKS     = 1 << 1,
 LIST_MODEBITS   = 1 << 2,
 LIST_NLINKS     = 1 << 3,
 LIST_ID_NAME    = 1 << 4,
@@ -210,23 +209,21 @@ LIST_FULLTIME   = 1 << 9,
 LIST_SYMLINK    = 1 << 10,
 LIST_FILETYPE   = 1 << 11, /* show / suffix for dirs */
 LIST_CLASSIFY   = 1 << 12, /* requires LIST_FILETYPE, also show *,|,@,= suffixes */
-LIST_MASK       = (LIST_CLASSIFY << 1) - 1,
+
+LIST_LONG       = LIST_MODEBITS | LIST_NLINKS | LIST_ID_NAME | LIST_SIZE | \
+                  LIST_DATE_TIME | LIST_SYMLINK,
 
 /* what files will be displayed */
 DISP_DIRNAME    = 1 << 13,      /* 2 or more items? label directories */
 DISP_NOLIST     = 1 << 16,      /* show directory as itself, not contents */
 DISP_RECURSIVE  = 1 << 17,      /* show directory and everything below it */
 DISP_ROWS       = 1 << 18,      /* print across rows */
-DISP_MASK       = ((DISP_ROWS << 1) - 1) & ~(DISP_DIRNAME - 1),
 
 /* what is the overall style of the listing */
 STYLE_COLUMNAR  = 1 << 19,      /* many records per line */
 STYLE_LONG      = 2 << 19,      /* one record per line, extended info */
 STYLE_SINGLE    = 3 << 19,      /* one record per line */
 STYLE_MASK      = STYLE_SINGLE,
-
-LIST_LONG       = LIST_MODEBITS | LIST_NLINKS | LIST_ID_NAME | LIST_SIZE | \
-                  LIST_DATE_TIME | LIST_SYMLINK,
 };
 
 /* -Cadi1l  Std options, busybox always supports */
@@ -262,7 +259,7 @@ enum {
        OPT_l = (1 << 5),
        OPT_g = (1 << 6),
        //OPT_n = (1 << 7),
-       //OPT_s = (1 << 8),
+       OPT_s = (1 << 8),
        //OPT_x = (1 << 9),
        OPT_A = (1 << 10),
        //OPT_k = (1 << 11),
@@ -321,7 +318,7 @@ static const uint32_t opt_flags[] = {
        LIST_LONG | STYLE_LONG,      /* l - by keeping it after -1, "ls -l -1" ignores -1 */
        LIST_LONG | STYLE_LONG,      /* g (don't show owner) - handled via OPT_g. assumes l */
        LIST_LONG | STYLE_LONG | LIST_ID_NUMERIC, /* n (assumes l) */
-       LIST_BLOCKS,                 /* s */
+       0,                           /* s */
        DISP_ROWS | STYLE_COLUMNAR,  /* x */
        0,                           /* A */
        ENABLE_SELINUX * (LIST_CONTEXT|STYLE_SINGLE), /* k (ignored if !SELINUX) */
@@ -559,7 +556,7 @@ static NOINLINE unsigned display_single(const struct dnode *dn)
        if (option_mask32 & OPT_i) /* list inodes */
                column += printf("%7llu ", (long long) dn->dn_ino);
 //TODO: -h should affect -s too:
-       if (G.all_fmt & LIST_BLOCKS)
+       if (option_mask32 & OPT_s) /* list allocated blocks */
                column += printf("%6"OFF_FMT"u ", (off_t) (dn->dn_blocks >> 1));
        if (G.all_fmt & LIST_MODEBITS)
                column += printf("%-10s ", (char *) bb_mode_string(dn->dn_mode));
@@ -704,10 +701,11 @@ static void display_files(struct dnode **dn, unsigned nfiles)
                        if (column_width < len)
                                column_width = len;
                }
-               column_width += 2 +
-                       IF_SELINUX( ((G.all_fmt & LIST_CONTEXT) ? 33 : 0) + )
-                               ((option_mask32 & OPT_i) ? 8 : 0) /* inode# width */
-                               + ((G.all_fmt & LIST_BLOCKS) ? 5 : 0);
+               column_width += 2
+                       IF_SELINUX(+ ((G.all_fmt & LIST_CONTEXT) ? 33 : 0))
+                       + ((option_mask32 & OPT_i) ? 8 : 0) /* inode# width */
+                       + ((option_mask32 & OPT_s) ? 5 : 0) /* "alloc block" width */
+               ;
                ncols = (unsigned)G_terminal_width / column_width;
        }
 
@@ -1069,8 +1067,11 @@ static void scan_and_display_dirs_recur(struct dnode **dn, int first)
                }
                subdnp = scan_one_dir((*dn)->fullname, &nfiles);
 #if ENABLE_DESKTOP
-               if ((G.all_fmt & STYLE_MASK) == STYLE_LONG || (G.all_fmt & LIST_BLOCKS))
+               if ((G.all_fmt & STYLE_MASK) == STYLE_LONG
+                || (option_mask32 & OPT_s)
+               ) {
                        printf("total %"OFF_FMT"u\n", calculate_blocks(subdnp));
+               }
 #endif
                if (nfiles > 0) {
                        /* list all files at this level */
@@ -1247,8 +1248,7 @@ int ls_main(int argc UNUSED_PARAM, char **argv)
                cur = my_stat(*argv, *argv,
                        /* follow links on command line unless -l, -s or -F: */
                        !((G.all_fmt & STYLE_MASK) == STYLE_LONG
-                         || (G.all_fmt & LIST_BLOCKS)
-                         || (option_mask32 & OPT_F)
+                         || (option_mask32 & (OPT_s|OPT_F))
                        )
                        /* ... or if -H: */
                        || (option_mask32 & OPT_H)