[Toybox] [PATCH] ls -h support.
enh
enh at google.com
Thu Sep 3 20:53:12 PDT 2015
ping :-)
On Sat, Aug 15, 2015 at 3:30 PM, enh <enh at google.com> wrote:
> ls -h support.
>
> It turns out that people are anticipating the switch to toybox ls from
> toolbox ls on the assumption that this will finally bring -h support.
> Let's not disappoint.
>
> I've merged two existing buffers in listfiles whose uses didn't
> overlap into one. It may be possible to cram this into toybuf with the
> other stuff, but it didn't seem worth the extra complexity for 64B of
> stack, especially since we were already living with that for time
> formatting anyway.
>
> diff --git a/toys/posix/ls.c b/toys/posix/ls.c
> index f951198..3db8d3d 100644
> --- a/toys/posix/ls.c
> +++ b/toys/posix/ls.c
> @@ -5,13 +5,13 @@
> *
> * See http://opengroup.org/onlinepubs/9699919799/utilities/ls.html
>
> -USE_LS(NEWTOY(ls,
> USE_LS_COLOR("(color):;")"ZgoACFHLRSacdfiklmnpqrstux1[-Cxm1][-Cxml][-Cxmo][-Cxmg][-cu][-ftS][-HL]",
> TOYFLAG_BIN|TOYFLAG_LOCALE))
> +USE_LS(NEWTOY(ls,
> USE_LS_COLOR("(color):;")"ZgoACFHLRSacdfhiklmnpqrstux1[-Cxm1][-Cxml][-Cxmo][-Cxmg][-cu][-ftS][-HL]",
> TOYFLAG_BIN|TOYFLAG_LOCALE))
>
> config LS
> bool "ls"
> default y
> help
> - usage: ls [-ACFHLRSZacdfiklmnpqrstux1] [directory...]
> + usage: ls [-ACFHLRSZacdfhiklmnpqrstux1] [directory...]
> list files
>
> what to show:
> @@ -26,9 +26,10 @@ config LS
>
> output formats:
> -1 list one file per line -C columns (sorted vertically)
> - -g like -l but no owner -l long (show full details)
> - -m comma separated -n like -l but numeric uid/gid
> - -o like -l but no group -x columns (horizontal sort)
> + -g like -l but no owner -h human readable sizes
> + -l long (show full details) -m comma separated
> + -n like -l but numeric uid/gid -o like -l but no group
> + -x columns (horizontal sort)
>
> sorting (default is alphabetical):
> -f unsorted -r reverse -t timestamp -S size
> @@ -127,6 +128,7 @@ static void entrylen(struct dirtree *dt, unsigned *len)
> {
> struct stat *st = &(dt->st);
> unsigned flags = toys.optflags;
> + char tmp[64];
>
> *len = strwidth(dt->name);
> if (endtype(st)) ++*len;
> @@ -142,6 +144,9 @@ static void entrylen(struct dirtree *dt, unsigned *len)
> // cheating slightly here: assuming minor is always 3 digits to avoid
> // tracking another column
> len[5] = numlen(major(st->st_rdev))+5;
> + } else if (flags & FLAG_h) {
> + human_readable(tmp, st->st_size, 0);
> + len[5] = strwidth(tmp);
> } else len[5] = numlen(st->st_size);
> }
>
> @@ -290,6 +295,7 @@ static void listfiles(int dirfd, struct dirtree *indir)
> unsigned long dtlen, ul = 0;
> unsigned width, flags = toys.optflags, totals[8], len[8], totpad = 0,
> *colsizes = (unsigned *)(toybuf+260), columns = (sizeof(toybuf)-260)/4;
> + char tmp[64];
>
> memset(totals, 0, sizeof(totals));
>
> @@ -346,8 +352,12 @@ static void listfiles(int dirfd, struct dirtree *indir)
> blocks += sort[ul]->st.st_blocks;
> }
> totpad = totals[1]+!!totals[1]+totals[6]+!!totals[6]+totals[7]+!!totals[7];
> - if ((flags&(FLAG_l|FLAG_o|FLAG_n|FLAG_g|FLAG_s)) && indir->parent)
> - xprintf("total %llu\n", blocks);
> + if ((flags&(FLAG_h|FLAG_l|FLAG_o|FLAG_n|FLAG_g|FLAG_s)) && indir->parent) {
> + if (flags&FLAG_h) {
> + human_readable(tmp, blocks*512, 0);
> + xprintf("total %s\n", tmp);
> + } else xprintf("total %llu\n", blocks);
> + }
> }
>
> // Find largest entry in each field for display alignment
> @@ -416,22 +426,22 @@ static void listfiles(int dirfd, struct dirtree *indir)
>
> if (flags & (FLAG_l|FLAG_o|FLAG_n|FLAG_g)) {
> struct tm *tm;
> - char perm[11], thyme[64], *ss;
> + char *ss;
>
> // (long) is to coerce the st types into something we know we can print.
> - mode_to_string(mode, perm);
> - printf("%s% *ld", perm, totals[2]+1, (long)st->st_nlink);
> + mode_to_string(mode, tmp);
> + printf("%s% *ld", tmp, totals[2]+1, (long)st->st_nlink);
>
> // print user
> if (!(flags&FLAG_g)) {
> - if (flags&FLAG_n) sprintf(ss = thyme, "%u", (unsigned)st->st_uid);
> + if (flags&FLAG_n) sprintf(ss = tmp, "%u", (unsigned)st->st_uid);
> else strwidth(ss = getusername(st->st_uid));
> printf(" %*s", (int)totals[3], ss);
> }
>
> // print group
> if (!(flags&FLAG_o)) {
> - if (flags&FLAG_n) sprintf(ss = thyme, "%u", (unsigned)st->st_gid);
> + if (flags&FLAG_n) sprintf(ss = tmp, "%u", (unsigned)st->st_gid);
> else strwidth(ss = getgroupname(st->st_gid));
> printf(" %*s", (int)totals[4], ss);
> }
> @@ -439,15 +449,18 @@ static void listfiles(int dirfd, struct dirtree *indir)
> if (flags & FLAG_Z)
> printf(" %*s", -(int)totals[7], (char *)sort[next]->extra);
>
> - // print major/minor
> + // print major/minor, or size
> if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode))
> printf("% *d,% 4d", totals[5]-4,
> major(st->st_rdev),minor(st->st_rdev));
> - else printf("% *lld", totals[5]+1, (long long)st->st_size);
> + else if (flags&FLAG_h) {
> + human_readable(tmp, st->st_size, 0);
> + xprintf("%*s", totals[5]+1, tmp);
> + } else printf("% *lld", totals[5]+1, (long long)st->st_size);
>
> // print time, always in --time-style=long-iso
> tm = localtime(&(st->st_mtime));
> - strftime(thyme, sizeof(thyme), "%F %H:%M", tm);
> - xprintf(" %s ", thyme);
> + strftime(tmp, sizeof(tmp), "%F %H:%M", tm);
> + xprintf(" %s ", tmp);
> } else if (flags & FLAG_Z)
> printf("%*s ", (int)totals[7], (char *)sort[next]->extra);
--
Elliott Hughes - http://who/enh - http://jessies.org/~enh/
Android native code/tools questions? Mail me/drop by/add me as a reviewer.
1441338792.0
More information about the Toybox
mailing list