mirror of
https://git.busybox.net/busybox.git
synced 2024-12-03 02:23:27 +08:00
ls: print a space after each column. Closes bug 2941
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
163d864357
commit
2f7d9e8903
@ -29,6 +29,70 @@
|
||||
* [2009-03]
|
||||
* ls sorts listing now, and supports almost all options.
|
||||
*/
|
||||
|
||||
//usage:#define ls_trivial_usage
|
||||
//usage: "[-1AaCxd"
|
||||
//usage: IF_FEATURE_LS_FOLLOWLINKS("L")
|
||||
//usage: IF_FEATURE_LS_RECURSIVE("R")
|
||||
//usage: IF_FEATURE_LS_FILETYPES("Fp") "lins"
|
||||
//usage: IF_FEATURE_LS_TIMESTAMPS("e")
|
||||
//usage: IF_FEATURE_HUMAN_READABLE("h")
|
||||
//usage: IF_FEATURE_LS_SORTFILES("rSXv")
|
||||
//usage: IF_FEATURE_LS_TIMESTAMPS("ctu")
|
||||
//usage: IF_SELINUX("kKZ") "]"
|
||||
//usage: IF_FEATURE_AUTOWIDTH(" -w WIDTH") " [FILE]..."
|
||||
//usage:#define ls_full_usage "\n\n"
|
||||
//usage: "List directory contents\n"
|
||||
//usage: "\nOptions:"
|
||||
//usage: "\n -1 List in a single column"
|
||||
//usage: "\n -A Don't list . and .."
|
||||
//usage: "\n -a Don't hide entries starting with ."
|
||||
//usage: "\n -C List by columns"
|
||||
//usage: "\n -x List by lines"
|
||||
//usage: "\n -d List directory entries instead of contents"
|
||||
//usage: IF_FEATURE_LS_FOLLOWLINKS(
|
||||
//usage: "\n -L List entries pointed to by symlinks"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_LS_RECURSIVE(
|
||||
//usage: "\n -R Recurse"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_LS_FILETYPES(
|
||||
//usage: "\n -F Append indicator (one of */=@|) to entries"
|
||||
//usage: "\n -p Append indicator (one of /=@|) to entries"
|
||||
//usage: )
|
||||
//usage: "\n -l Long listing format"
|
||||
//usage: "\n -i List inode numbers"
|
||||
//usage: "\n -n List numeric UIDs and GIDs instead of names"
|
||||
//usage: "\n -s List the size of each file, in blocks"
|
||||
//usage: IF_FEATURE_LS_TIMESTAMPS(
|
||||
//usage: "\n -e List full date and time"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_HUMAN_READABLE(
|
||||
//usage: "\n -h List sizes in human readable format (1K 243M 2G)"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_LS_SORTFILES(
|
||||
//usage: "\n -r Sort in reverse order"
|
||||
//usage: "\n -S Sort by file size"
|
||||
//usage: "\n -X Sort by extension"
|
||||
//usage: "\n -v Sort by version"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_LS_TIMESTAMPS(
|
||||
//usage: "\n -c With -l: sort by ctime"
|
||||
//usage: "\n -t With -l: sort by modification time"
|
||||
//usage: "\n -u With -l: sort by access time"
|
||||
//usage: )
|
||||
//usage: IF_SELINUX(
|
||||
//usage: "\n -k List security context"
|
||||
//usage: "\n -K List security context in long format"
|
||||
//usage: "\n -Z List security context and permission"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_AUTOWIDTH(
|
||||
//usage: "\n -w N Assume the terminal is N columns wide"
|
||||
//usage: )
|
||||
//usage: IF_FEATURE_LS_COLOR(
|
||||
//usage: "\n --color[={always,never,auto}] Control coloring"
|
||||
//usage: )
|
||||
|
||||
#include "libbb.h"
|
||||
#include "unicode.h"
|
||||
|
||||
@ -53,7 +117,6 @@
|
||||
|
||||
enum {
|
||||
TERMINAL_WIDTH = 80, /* use 79 if terminal has linefold bug */
|
||||
COLUMN_GAP = 2, /* includes the file type char */
|
||||
|
||||
/* what is the overall style of the listing */
|
||||
STYLE_COLUMNAR = 1 << 21, /* many records per line */
|
||||
@ -241,7 +304,6 @@ struct globals {
|
||||
smallint exit_code;
|
||||
unsigned all_fmt;
|
||||
#if ENABLE_FEATURE_AUTOWIDTH
|
||||
unsigned tabstops; // = COLUMN_GAP;
|
||||
unsigned terminal_width; // = TERMINAL_WIDTH;
|
||||
#endif
|
||||
#if ENABLE_FEATURE_LS_TIMESTAMPS
|
||||
@ -258,11 +320,9 @@ enum { show_color = 0 };
|
||||
#define exit_code (G.exit_code )
|
||||
#define all_fmt (G.all_fmt )
|
||||
#if ENABLE_FEATURE_AUTOWIDTH
|
||||
# define tabstops (G.tabstops )
|
||||
# define terminal_width (G.terminal_width)
|
||||
#else
|
||||
enum {
|
||||
tabstops = COLUMN_GAP,
|
||||
terminal_width = TERMINAL_WIDTH,
|
||||
};
|
||||
#endif
|
||||
@ -270,7 +330,6 @@ enum {
|
||||
#define INIT_G() do { \
|
||||
/* we have to zero it out because of NOEXEC */ \
|
||||
memset(&G, 0, sizeof(G)); \
|
||||
IF_FEATURE_AUTOWIDTH(tabstops = COLUMN_GAP;) \
|
||||
IF_FEATURE_AUTOWIDTH(terminal_width = TERMINAL_WIDTH;) \
|
||||
IF_FEATURE_LS_TIMESTAMPS(time(¤t_time_t);) \
|
||||
} while (0)
|
||||
@ -732,8 +791,8 @@ static NOINLINE unsigned list_single(const struct dnode *dn)
|
||||
static void showfiles(struct dnode **dn, unsigned nfiles)
|
||||
{
|
||||
unsigned i, ncols, nrows, row, nc;
|
||||
unsigned column = 0;
|
||||
unsigned nexttab = 0;
|
||||
unsigned column;
|
||||
unsigned nexttab;
|
||||
unsigned column_width = 0; /* used only by STYLE_COLUMNAR */
|
||||
|
||||
if (all_fmt & STYLE_LONG) { /* STYLE_LONG or STYLE_SINGLE */
|
||||
@ -745,7 +804,7 @@ static void showfiles(struct dnode **dn, unsigned nfiles)
|
||||
if (column_width < len)
|
||||
column_width = len;
|
||||
}
|
||||
column_width += tabstops +
|
||||
column_width += 1 +
|
||||
IF_SELINUX( ((all_fmt & LIST_CONTEXT) ? 33 : 0) + )
|
||||
((all_fmt & LIST_INO) ? 8 : 0) +
|
||||
((all_fmt & LIST_BLOCKS) ? 5 : 0);
|
||||
@ -761,6 +820,8 @@ static void showfiles(struct dnode **dn, unsigned nfiles)
|
||||
ncols = 1;
|
||||
}
|
||||
|
||||
column = 0;
|
||||
nexttab = 0;
|
||||
for (row = 0; row < nrows; row++) {
|
||||
for (nc = 0; nc < ncols; nc++) {
|
||||
/* reach into the array based on the column and row */
|
||||
@ -771,8 +832,8 @@ static void showfiles(struct dnode **dn, unsigned nfiles)
|
||||
if (i < nfiles) {
|
||||
if (column > 0) {
|
||||
nexttab -= column;
|
||||
printf("%*s", nexttab, "");
|
||||
column += nexttab;
|
||||
printf("%*s ", nexttab, "");
|
||||
column += nexttab + 1;
|
||||
}
|
||||
nexttab = column + column_width;
|
||||
column += list_single(dn[i]);
|
||||
@ -993,7 +1054,7 @@ int ls_main(int argc UNUSED_PARAM, char **argv)
|
||||
/* -T NUM, -w NUM: */
|
||||
IF_FEATURE_AUTOWIDTH(":T+:w+");
|
||||
opt = getopt32(argv, ls_options
|
||||
IF_FEATURE_AUTOWIDTH(, &tabstops, &terminal_width)
|
||||
IF_FEATURE_AUTOWIDTH(, NULL, &terminal_width)
|
||||
IF_FEATURE_LS_COLOR(, &color_opt)
|
||||
);
|
||||
for (i = 0; opt_flags[i] != (1U<<31); i++) {
|
||||
|
@ -2173,67 +2173,6 @@ INSERT
|
||||
"\n -h Print banner page too" \
|
||||
"\n -V Verbose" \
|
||||
|
||||
#define ls_trivial_usage \
|
||||
"[-1Aa" IF_FEATURE_LS_TIMESTAMPS("c") "Cd" \
|
||||
IF_FEATURE_LS_TIMESTAMPS("e") IF_FEATURE_LS_FILETYPES("F") "iln" \
|
||||
IF_FEATURE_LS_FILETYPES("p") IF_FEATURE_LS_FOLLOWLINKS("L") \
|
||||
IF_FEATURE_LS_RECURSIVE("R") IF_FEATURE_LS_SORTFILES("rS") "s" \
|
||||
IF_FEATURE_AUTOWIDTH("T") IF_FEATURE_LS_TIMESTAMPS("tu") \
|
||||
IF_FEATURE_LS_SORTFILES("v") IF_FEATURE_AUTOWIDTH("w") "x" \
|
||||
IF_FEATURE_LS_SORTFILES("X") IF_FEATURE_HUMAN_READABLE("h") "k" \
|
||||
IF_SELINUX("K") "] [FILE]..."
|
||||
#define ls_full_usage "\n\n" \
|
||||
"List directory contents\n" \
|
||||
"\nOptions:" \
|
||||
"\n -1 List in a single column" \
|
||||
"\n -A Don't list . and .." \
|
||||
"\n -a Don't hide entries starting with ." \
|
||||
"\n -C List by columns" \
|
||||
IF_FEATURE_LS_TIMESTAMPS( \
|
||||
"\n -c With -l: sort by ctime") \
|
||||
IF_FEATURE_LS_COLOR( \
|
||||
"\n --color[={always,never,auto}] Control coloring") \
|
||||
"\n -d List directory entries instead of contents" \
|
||||
IF_FEATURE_LS_TIMESTAMPS( \
|
||||
"\n -e List full date and time") \
|
||||
IF_FEATURE_LS_FILETYPES( \
|
||||
"\n -F Append indicator (one of */=@|) to entries") \
|
||||
"\n -i List inode numbers" \
|
||||
"\n -l Long listing format" \
|
||||
"\n -n List numeric UIDs and GIDs instead of names" \
|
||||
IF_FEATURE_LS_FILETYPES( \
|
||||
"\n -p Append indicator (one of /=@|) to entries") \
|
||||
IF_FEATURE_LS_FOLLOWLINKS( \
|
||||
"\n -L List entries pointed to by symlinks") \
|
||||
IF_FEATURE_LS_RECURSIVE( \
|
||||
"\n -R Recurse") \
|
||||
IF_FEATURE_LS_SORTFILES( \
|
||||
"\n -r Sort in reverse order") \
|
||||
IF_FEATURE_LS_SORTFILES( \
|
||||
"\n -S Sort by file size") \
|
||||
"\n -s List the size of each file, in blocks" \
|
||||
IF_FEATURE_AUTOWIDTH( \
|
||||
"\n -T N Assume tabstop every N columns") \
|
||||
IF_FEATURE_LS_TIMESTAMPS( \
|
||||
"\n -t With -l: sort by modification time") \
|
||||
IF_FEATURE_LS_TIMESTAMPS( \
|
||||
"\n -u With -l: sort by access time") \
|
||||
IF_FEATURE_LS_SORTFILES( \
|
||||
"\n -v Sort by version") \
|
||||
IF_FEATURE_AUTOWIDTH( \
|
||||
"\n -w N Assume the terminal is N columns wide") \
|
||||
"\n -x List by lines" \
|
||||
IF_FEATURE_LS_SORTFILES( \
|
||||
"\n -X Sort by extension") \
|
||||
IF_FEATURE_HUMAN_READABLE( \
|
||||
"\n -h List sizes in human readable format (1K 243M 2G)") \
|
||||
IF_SELINUX( \
|
||||
"\n -k List security context") \
|
||||
IF_SELINUX( \
|
||||
"\n -K List security context in long format") \
|
||||
IF_SELINUX( \
|
||||
"\n -Z List security context and permission") \
|
||||
|
||||
#define lsattr_trivial_usage \
|
||||
"[-Radlv] [FILE]..."
|
||||
#define lsattr_full_usage "\n\n" \
|
||||
|
Loading…
Reference in New Issue
Block a user