X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=dus.c;h=63cc183c30acadfd523cd1002953f6c7621b128b;hb=e708ca19d1b2345e001050b327ffbbbf5e09e88c;hp=620df1ede4de90e91cddedbe90d0e77851a37dd5;hpb=6ea55a080b700e73fa9194972a6349233ea4384f;p=dus.git diff --git a/dus.c b/dus.c index 620df1e..63cc183 100644 --- a/dus.c +++ b/dus.c @@ -85,22 +85,7 @@ int ignore_entry(const char *name) { return strcmp(name, ".") == 0 || strcmp(name, "..") == 0 || - (ignore_dotfiles && name[0] == '.'); -} - -void print_size_sum(size_sum_t s) { - char tmp[128]; - char *a = tmp + sizeof(tmp)/sizeof(char); - *(--a) = '\0'; - if(s) { - while(s) { - *(--a) = s%10 + '0'; - s /= 10; - } - } else { - *(--a) = '0'; - } - printf("%s", a); + (ignore_dotfiles && name[0] == '.' && name[1] != '/'); } size_sum_t entry_size(const char *name) { @@ -219,18 +204,19 @@ int compare_files(const void *x1, const void *x2) { } } -void raw_print(char *buffer, char *filename, size_sum_t size) { +void raw_print(char *buffer, size_t buffer_size, + char *filename, size_sum_t size) { char *a, *b, *c, u; b = buffer; - if(size) { - while(size) { - *(b++) = size%10 + '0'; - size /= 10; + do { + if(b >= buffer + buffer_size) { + fprintf(stderr, "Buffer overflow in raw_print (hu?!).\n"); + exit(EXIT_FAILURE); } - } else { - *(b++) = '0'; - } + *(b++) = size%10 + '0'; + size /= 10; + } while(size); a = buffer; c = b; @@ -242,30 +228,34 @@ void raw_print(char *buffer, char *filename, size_sum_t size) { *(b++) = ' '; - sprintf(b, " %s\n", filename); + snprintf(b, buffer_size - (b - buffer), "%s\n", filename); } -void fancy_print(char *buffer, char *filename, size_sum_t size) { +void fancy_print(char *buffer, size_t buffer_size, char *filename, size_sum_t size) { if(size < 1024) { - sprintf(buffer, - "% 7d -- %s\n", - ((int) size), - filename); + snprintf(buffer, + buffer_size, + "% 7d -- %s\n", + ((int) size), + filename); } else if(size < 1024 * 1024) { - sprintf(buffer, - "% 6.1fK -- %s\n", - ((double) (size))/(1024.0), - filename); + snprintf(buffer, + buffer_size, + "% 6.1fK -- %s\n", + ((double) (size))/(1024.0), + filename); } else if(size < 1024 * 1024 * 1024) { - sprintf(buffer, - "% 6.1fM -- %s\n", - ((double) (size))/(1024.0 * 1024), - filename); + snprintf(buffer, + buffer_size, + "% 6.1fM -- %s\n", + ((double) (size))/(1024.0 * 1024), + filename); } else { - sprintf(buffer, - "% 6.1fG -- %s\n", - ((double) (size))/(1024.0 * 1024.0 * 1024.0), - filename); + snprintf(buffer, + buffer_size, + "% 6.1fG -- %s\n", + ((double) (size))/(1024.0 * 1024.0 * 1024.0), + filename); } } @@ -300,6 +290,10 @@ void print_sorted(struct entry_node *root, int width, int height) { height = forced_height; } + if(forced_width) { + width = forced_width; + } + if(height >= 0 && nb_nodes > height && !show_top && !forced_height) { printf("...\n"); } @@ -314,14 +308,20 @@ void print_sorted(struct entry_node *root, int width, int height) { first = nb_nodes - n; } + /* I do not like valgrind to complain about uninitialized data */ + if(width < BUFFER_SIZE) { + line[width] = '\0'; + } + for(n = first; n < last; n++) { if(fancy_size_display) { - fancy_print(line, nodes[n]->name, nodes[n]->size); + fancy_print(line, BUFFER_SIZE, nodes[n]->name, nodes[n]->size); } else { - raw_print(line, nodes[n]->name, nodes[n]->size); + raw_print(line, BUFFER_SIZE, nodes[n]->name, nodes[n]->size); } - if(width >= 0 && width < BUFFER_SIZE) { - line[width] = '\0'; + if(width >= 1 && width + 1 < BUFFER_SIZE && line[width]) { + line[width] = '\n'; + line[width + 1] = '\0'; } printf(line); } @@ -338,29 +338,26 @@ void print_sorted(struct entry_node *root, int width, int height) { void usage(FILE *out) { fprintf(out, "Usage: dus [OPTION]... [FILE]...\n"); fprintf(out, "Version %s (%s)\n", VERSION_NUMBER, UNAME); - fprintf(out, "List files and directories sorted according to their size or content size. Take the content of the current directory as argument if none is provided.\n"); + fprintf(out, "List files and directories sorted according to their sizes. If no files or directories are provided as arguments, use the content of the current directory.\n"); fprintf(out, "\n"); - fprintf(out, " -d, --ignore-dots\n"); - fprintf(out, " ignore files and directories starting with a '.'\n"); - fprintf(out, " -f, --fancy\n"); - fprintf(out, " display size with float values and K, M and G units.\n"); - fprintf(out, " -r, --reverse-order\n"); - fprintf(out, " reverse the sorting order.\n"); - fprintf(out, " -t, --show-top\n"); - fprintf(out, " show the top of the list.\n"); + /* 01234567890123456789012345678901234567890123456789012345678901234567890123456789*/ + fprintf(out, " -d, --ignore-dots ignore files and directories starting with a '.'\n"); + fprintf(out, " -f, --fancy display size with float values and K, M and G\n"); + fprintf(out, " units.\n"); + fprintf(out, " -r, --reverse-order reverse the sorting order.\n"); + fprintf(out, " -t, --show-top show the top of the list.\n"); fprintf(out, " -c , --nb-columns \n"); - fprintf(out, " specificy the number of columns to display. The value -1\n"); - fprintf(out, " corresponds to no constraint. By default the command\n"); - fprintf(out, " uses the tty width, or no constraint if the stdout is\n"); - fprintf(out, " not a tty.\n"); + fprintf(out, " specificy the number of columns to display. The\n"); + fprintf(out, " value -1 corresponds to no constraint. By default\n"); + fprintf(out, " the command uses the tty width, or no constraint\n"); + fprintf(out, " if the stdout is not a tty.\n"); fprintf(out, " -l , --nb-lines \n"); - fprintf(out, " same as -c for number of lines.\n"); - fprintf(out, " -h, --help\n"); - fprintf(out, " show this help.\n"); + fprintf(out, " same as -c for number of lines.\n"); + fprintf(out, " -h, --help show this help.\n"); fprintf(out, " -m , --size-min \n"); - fprintf(out, " set the listed entries minimum size.\n"); + fprintf(out, " set the listed entries minimum size.\n"); fprintf(out, "\n"); - fprintf(out, "Report bugs and comments to \n"); + fprintf(out, "Report bugs and comments to .\n"); } /**********************************************************************/