X-Git-Url: https://www.fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=dus.c;h=88221f67b09dd67e3d48a290f3a656fec1ea9510;hb=e96b00b6716ceb5046d2e3592834cd167b05ab61;hp=3a4d7f41891ad47231cd86393a41d0670c1c7465;hpb=a05803ca317f043c88c4c7e6a3f5390fbc996697;p=dus.git diff --git a/dus.c b/dus.c index 3a4d7f4..88221f6 100644 --- a/dus.c +++ b/dus.c @@ -51,6 +51,11 @@ int forced_height = 0; /* -1 means no height limit, strictly positive int fancy_size_display = 0; /* 1 means to use floating values with K, M and G as units */ +int reverse_sorting = 0; /* 1 means to show the large ones first */ + +int show_top = 0; /* 1 means to show the top of the sorted list + instead of the bottom */ + /********************************************************************/ int ignore_entry(const char *name) { @@ -147,19 +152,29 @@ int compare_files(const void *x1, const void *x2) { f1 = (const struct file_with_size **) x1; f2 = (const struct file_with_size **) x2; - if((*f1)->size < (*f2)->size) { - return -1; - } else if((*f1)->size > (*f2)->size) { - return 1; + if(reverse_sorting) { + if((*f1)->size < (*f2)->size) { + return 1; + } else if((*f1)->size > (*f2)->size) { + return -1; + } else { + return 0; + } } else { - return 0; + if((*f1)->size < (*f2)->size) { + return -1; + } else if((*f1)->size > (*f2)->size) { + return 1; + } else { + return 0; + } } } void print_sorted(struct file_with_size *root, int height) { struct file_with_size *node; struct file_with_size **nodes; - int nb, n, first; + int nb, n, first, last; nb = 0; for(node = root; node; node = node->next) { @@ -176,6 +191,7 @@ void print_sorted(struct file_with_size *root, int height) { qsort(nodes, nb, sizeof(struct file_with_size *), compare_files); first = 0; + last = nb; if(forced_height) { height = forced_height; @@ -185,8 +201,14 @@ void print_sorted(struct file_with_size *root, int height) { first = nb - height; } + if(show_top) { + n = last; + last = nb - first; + first = nb - n; + } + if(fancy_size_display) { - for(n = first; n < nb; n++) { + for(n = first; n < last; n++) { if(nodes[n]->size < 1024) { printf("% 7d %s\n", ((int) nodes[n]->size), @@ -206,7 +228,7 @@ void print_sorted(struct file_with_size *root, int height) { } } } else { - for(n = first; n < nb; n++) { + for(n = first; n < last; n++) { print_size_sum(nodes[n]->size); printf(" %s\n", nodes[n]->filename); } @@ -218,7 +240,7 @@ void print_sorted(struct file_with_size *root, int height) { /**********************************************************************/ int main(int argc, char **argv) { - char c; + int c; struct file_with_size *root; root = 0; @@ -226,7 +248,7 @@ int main(int argc, char **argv) { setlocale (LC_ALL, ""); while (1) { - c = getopt(argc, argv, "dfl:hdu"); + c = getopt(argc, argv, "dfrtl:hdu"); if (c == -1) break; @@ -240,21 +262,30 @@ int main(int argc, char **argv) { fancy_size_display = 1; break; + case 'r': + reverse_sorting = 1; + break; + + case 't': + show_top = 1; + break; + case 'l': forced_height = atoi(optarg); break; case 'h': printf("Usage: dus [OPTION]... [FILE]...\n"); - printf("List files and directories sorted according to their size or content \n"); - printf("size.\n"); + printf("List files and directories sorted according to their size or content size (the content of the current directory by default).\n"); printf("\n"); - printf(" -d do not take into account files starting with a '.'\n"); + printf(" -d ignore files and directories starting with a '.'\n"); printf(" -f display size with float values and K, M and G units.\n"); + printf(" -r reverse the sorting order.\n"); + printf(" -t show the top of the list.\n"); printf(" -l specificy the number of lines to display. The value -1\n"); printf(" corresponds to all the lines. By default the command\n"); - printf(" shows one line less than the number of lines of the TTY,\n"); - printf(" or all the lines if standard output is not a tty\n"); + printf(" shows one line less than the height the tty, or all the\n"); + printf(" lines if the standard output is not a tty.\n"); printf(" -h show this help.\n"); printf("\n"); printf("Report bugs and comments to \n");