diff options
author | Jim Meyering <jim@meyering.net> | 2003-10-13 15:16:27 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2003-10-13 15:16:27 +0000 |
commit | a8e60e65f8d185f32f4d8d3832b69c4c0f5135ec (patch) | |
tree | b67d57a80ca639b197fa2def44508c480e5a743b /src | |
parent | aa615387afbde6c0c96902a2c09aa5f12469801d (diff) | |
download | coreutils-a8e60e65f8d185f32f4d8d3832b69c4c0f5135ec.tar.xz |
(struct bin_str.len, length_of_file_name_and_frills, indent,
nfiles, files_index, tabsize, line_length, struct column_info.line_len,
struct column_info.col_arr[0], max_idx):
Now size_t, not int.
(get_funky_string): Return bool indicating success, instead of
a negative count to indicate failure. Store number of columns
through new parameter OUTPUT_COUNT; that way, they can never
go negative. Change equals_end from int to bool. All uses
changed.
(struct column_info.valid_len): Now bool, not int. All uses changed.
(dired_dump_obstack, get_funky_string, clear_files,
extract_dirs_from_files, print_current_files,
print_many_per_line, print_horizontal, init_column_info,
put_indicator, length_of_file_name_and_frills,
print_with_commas): Use size_t, not int, for local variables
that count sizes.
(decode_switches): Decode sizes using xstrtoul, not xstrtol.
Check for TIOCGWINSZ returing negative values (or values greater
than SIZE_MAX!).
(visit_dir, main, parse_ls_color, queue_directory, add_ignore_pattern,
init_column_info):
Use xmalloc and xnmalloc, not XMALLOC.
(gobble_file): Use xnrealloc, not XREALLOC.
(print_color_indicator): Remove now-unnecessary cast to size_t.
Diffstat (limited to 'src')
-rw-r--r-- | src/ls.c | 200 |
1 files changed, 104 insertions, 96 deletions
@@ -234,7 +234,7 @@ struct fileinfo struct bin_str { - int len; /* Number of bytes */ + size_t len; /* Number of bytes */ const char *string; /* Pointer to the same */ }; @@ -256,14 +256,14 @@ static uintmax_t gobble_file (const char *name, enum filetype type, static void print_color_indicator (const char *name, mode_t mode, int linkok); static void put_indicator (const struct bin_str *ind); static int put_indicator_direct (const struct bin_str *ind); -static int length_of_file_name_and_frills (const struct fileinfo *f); +static size_t length_of_file_name_and_frills (const struct fileinfo *f); static void add_ignore_pattern (const char *pattern); static void attach (char *dest, const char *dirname, const char *name); static void clear_files (void); static void extract_dirs_from_files (const char *dirname, int ignore_dot_and_dot_dot); static void get_link_name (const char *filename, struct fileinfo *f); -static void indent (int from, int to); +static void indent (size_t from, size_t to); static void init_column_info (void); static void print_current_files (void); static void print_dir (const char *name, const char *realname); @@ -310,10 +310,10 @@ static Hash_table *active_dir_set; static struct fileinfo *files; /* FIXME: rename this to e.g. cwd_file */ /* Length of block that `files' points to, measured in files. */ -static int nfiles; /* FIXME: rename this to e.g. cwd_n_alloc */ +static size_t nfiles; /* FIXME: rename this to e.g. cwd_n_alloc */ /* Index of first unused in `files'. */ -static int files_index; /* FIXME: rename this to e.g. cwd_n_used */ +static size_t files_index; /* FIXME: rename this to e.g. cwd_n_used */ /* When nonzero, in a color listing, color each symlink name according to the type of file it points to. Otherwise, color them according to the `ln' @@ -623,7 +623,7 @@ static struct quoting_options *dirname_quoting_options; /* The number of chars per hardware tab stop. Setting this to zero inhibits the use of TAB characters for separating columns. -T */ -static int tabsize; +static size_t tabsize; /* Nonzero means we are listing the working directory because no non-option arguments were given. */ @@ -637,7 +637,7 @@ static int print_dir_name; /* The line length to use for breaking lines in many-per-line format. Can be set with -w. */ -static int line_length; +static size_t line_length; /* If nonzero, the file listing format requires that stat be called on each file. */ @@ -790,16 +790,16 @@ static enum color_type const color_types[] = /* Information about filling a column. */ struct column_info { - int valid_len; - int line_len; - int *col_arr; + bool valid_len; + size_t line_len; + size_t *col_arr; }; /* Array with information about column filledness. */ static struct column_info *column_info; /* Maximum number of columns ever possible for this display. */ -static int max_idx; +static size_t max_idx; /* The minimum width of a colum is 3: 1 character for the name and 2 for the separating white space. */ @@ -895,18 +895,18 @@ dev_ino_pop (void) static void dired_dump_obstack (const char *prefix, struct obstack *os) { - int n_pos; + size_t n_pos; n_pos = obstack_object_size (os) / sizeof (dired_pos); if (n_pos > 0) { - int i; + size_t i; size_t *pos; pos = (size_t *) obstack_finish (os); fputs (prefix, stdout); for (i = 0; i < n_pos; i++) - printf (" %lu", (unsigned long) pos[i]); + printf (" %lu", (unsigned long int) pos[i]); putchar ('\n'); } } @@ -943,7 +943,7 @@ visit_dir (dev_t dev, ino_t ino) struct dev_ino *ent_from_table; int found_match; - ent = XMALLOC (struct dev_ino, 1); + ent = xmalloc (sizeof *ent); ent->st_ino = ino; ent->st_dev = dev; @@ -1059,10 +1059,10 @@ main (int argc, char **argv) check_symlink_color = 1; { - unsigned j; + unsigned int j; static int const sigs[] = { SIGHUP, SIGINT, SIGPIPE, SIGQUIT, SIGTERM, SIGTSTP }; - unsigned nsigs = sizeof sigs / sizeof *sigs; + unsigned int nsigs = sizeof sigs / sizeof *sigs; #ifdef SA_NOCLDSTOP struct sigaction oldact, newact; sigset_t caught_signals; @@ -1126,7 +1126,7 @@ main (int argc, char **argv) } nfiles = 100; - files = XMALLOC (struct fileinfo, nfiles); + files = xnmalloc (nfiles, sizeof *files); files_index = 0; clear_files (); @@ -1314,11 +1314,11 @@ decode_switches (int argc, char **argv) char const *p = getenv ("COLUMNS"); if (p && *p) { - long int tmp_long; - if (xstrtol (p, NULL, 0, &tmp_long, NULL) == LONGINT_OK - && 0 < tmp_long && tmp_long <= INT_MAX) + unsigned long int tmp_ulong; + if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK + && 0 < tmp_ulong && tmp_ulong <= SIZE_MAX) { - line_length = (int) tmp_long; + line_length = tmp_ulong; } else { @@ -1333,7 +1333,8 @@ decode_switches (int argc, char **argv) { struct winsize ws; - if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1 && ws.ws_col != 0) + if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1 + && 0 < ws.ws_col && ws.ws_col <= SIZE_MAX) line_length = ws.ws_col; } #endif @@ -1345,11 +1346,11 @@ decode_switches (int argc, char **argv) tabsize = 8; if (!getenv ("POSIXLY_CORRECT") && (p = getenv ("TABSIZE"))) { - long int tmp_long; - if (xstrtol (p, NULL, 0, &tmp_long, NULL) == LONGINT_OK - && 0 <= tmp_long && tmp_long <= INT_MAX) + unsigned long int tmp_ulong; + if (xstrtoul (p, NULL, 0, &tmp_ulong, NULL) == LONGINT_OK + && tmp_ulong <= SIZE_MAX) { - tabsize = (int) tmp_long; + tabsize = tmp_ulong; } else { @@ -1468,12 +1469,12 @@ decode_switches (int argc, char **argv) case 'w': { - long int tmp_long; - if (xstrtol (optarg, NULL, 0, &tmp_long, NULL) != LONGINT_OK - || tmp_long <= 0 || tmp_long > INT_MAX) + unsigned long int tmp_ulong; + if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK + || ! (0 < tmp_ulong && tmp_ulong <= SIZE_MAX)) error (EXIT_FAILURE, 0, _("invalid line width: %s"), quotearg (optarg)); - line_length = (int) tmp_long; + line_length = tmp_ulong; break; } @@ -1542,12 +1543,12 @@ decode_switches (int argc, char **argv) case 'T': { - long int tmp_long; - if (xstrtol (optarg, NULL, 0, &tmp_long, NULL) != LONGINT_OK - || tmp_long < 0 || tmp_long > INT_MAX) + unsigned long int tmp_ulong; + if (xstrtoul (optarg, NULL, 0, &tmp_ulong, NULL) != LONGINT_OK + || SIZE_MAX < tmp_ulong) error (EXIT_FAILURE, 0, _("invalid tab size: %s"), quotearg (optarg)); - tabsize = (int) tmp_long; + tabsize = tmp_ulong; break; } @@ -1754,7 +1755,8 @@ decode_switches (int argc, char **argv) /* Parse a string as part of the LS_COLORS variable; this may involve decoding all kinds of escape characters. If equals_end is set an unescaped equal sign ends the string, otherwise only a : or \0 - does. Returns the number of characters output, or -1 on failure. + does. Set *OUTPUT_COUNT to the number of bytes output. Return + true if successful. The resulting string is *not* null-terminated, but may contain embedded nulls. @@ -1763,11 +1765,12 @@ decode_switches (int argc, char **argv) the first free byte after the array and the character that ended the input string, respectively. */ -static int -get_funky_string (char **dest, const char **src, int equals_end) +static bool +get_funky_string (char **dest, const char **src, bool equals_end, + size_t *output_count) { int num; /* For numerical codes */ - int count; /* Something to count with */ + size_t count; /* Something to count with */ enum { ST_GND, ST_BACKSLASH, ST_OCTAL, ST_HEX, ST_CARET, ST_END, ST_ERROR } state; @@ -1952,8 +1955,9 @@ get_funky_string (char **dest, const char **src, int equals_end) *dest = q; *src = p; + *output_count = count; - return state == ST_ERROR ? -1 : count; + return state != ST_ERROR; } static void @@ -1996,15 +2000,15 @@ parse_ls_color (void) override an earlier one, which can be useful for having terminal-specific defs override global). */ - ext = XMALLOC (struct color_ext_type, 1); + ext = xmalloc (sizeof *ext); ext->next = color_ext_list; color_ext_list = ext; ++p; ext->ext.string = buf; - state = (ext->ext.len = - get_funky_string (&buf, &p, 1)) < 0 ? -1 : 4; + state = (get_funky_string (&buf, &p, true, &ext->ext.len) + ? 4 : -1); break; case '\0': @@ -2037,8 +2041,9 @@ parse_ls_color (void) if (STREQ (label, indicator_name[ind_no])) { color_indicator[ind_no].string = buf; - state = ((color_indicator[ind_no].len = - get_funky_string (&buf, &p, 0)) < 0 ? -1 : 1); + state = (get_funky_string (&buf, &p, false, + &color_indicator[ind_no].len) + ? 1 : -1); break; } } @@ -2051,8 +2056,8 @@ parse_ls_color (void) if (*(p++) == '=') { ext->seq.string = buf; - state = (ext->seq.len = - get_funky_string (&buf, &p, 0)) < 0 ? -1 : 1; + state = (get_funky_string (&buf, &p, false, &ext->seq.len) + ? 1 : -1); } else state = -1; @@ -2096,7 +2101,7 @@ queue_directory (const char *name, const char *realname) { struct pending *new; - new = XMALLOC (struct pending, 1); + new = xmalloc (sizeof *new); new->realname = realname ? xstrdup (realname) : NULL; new->name = name ? xstrdup (name) : NULL; new->next = pending_dirs; @@ -2251,7 +2256,7 @@ add_ignore_pattern (const char *pattern) { register struct ignore_pattern *ignore; - ignore = XMALLOC (struct ignore_pattern, 1); + ignore = xmalloc (sizeof *ignore); ignore->pattern = pattern; /* Add it to the head of the linked list. */ ignore->next = ignore_patterns; @@ -2286,7 +2291,7 @@ file_interesting (const struct dirent *next) static void clear_files (void) { - register int i; + register size_t i; for (i = 0; i < files_index; i++) { @@ -2312,8 +2317,8 @@ gobble_file (const char *name, enum filetype type, int explicit_arg, if (files_index == nfiles) { + files = xnrealloc (files, nfiles, 2 * sizeof *files); nfiles *= 2; - files = XREALLOC (files, struct fileinfo, nfiles); } files[files_index].linkname = 0; @@ -2539,7 +2544,8 @@ basename_is_dot_or_dotdot (const char *name) static void extract_dirs_from_files (const char *dirname, int ignore_dot_and_dot_dot) { - register int i, j; + register size_t i; + register size_t j; if (*dirname && LOOP_DETECT) { @@ -2551,7 +2557,7 @@ extract_dirs_from_files (const char *dirname, int ignore_dot_and_dot_dot) /* Queue the directories last one first, because queueing reverses the order. */ - for (i = files_index - 1; i >= 0; i--) + for (i = files_index; i-- != 0; ) if ((files[i].filetype == directory || files[i].filetype == arg_directory) && (!ignore_dot_and_dot_dot || !basename_is_dot_or_dotdot (files[i].name))) @@ -2780,7 +2786,7 @@ sort_files (void) static void print_current_files (void) { - register int i; + register size_t i; switch (format) { @@ -2901,7 +2907,7 @@ format_user (char *buffer, uid_t u) if (name) sprintf (buffer, "%-8s ", name); else - sprintf (buffer, "%-8lu ", (unsigned long) u); + sprintf (buffer, "%-8lu ", (unsigned long int) u); return strlen (buffer); } @@ -2975,7 +2981,7 @@ print_long_format (const struct fileinfo *f) /* The last byte of the mode string is the POSIX "optional alternate access method flag". */ - sprintf (p, "%s %3lu ", modebuf, (unsigned long) f->stat.st_nlink); + sprintf (p, "%s %3lu ", modebuf, (unsigned long int) f->stat.st_nlink); p += strlen (p); if (print_owner) @@ -2987,7 +2993,7 @@ print_long_format (const struct fileinfo *f) if (group_name) sprintf (p, "%-8s ", group_name); else - sprintf (p, "%-8lu ", (unsigned long) f->stat.st_gid); + sprintf (p, "%-8lu ", (unsigned long int) f->stat.st_gid); p += strlen (p); } @@ -2996,8 +3002,8 @@ print_long_format (const struct fileinfo *f) if (S_ISCHR (f->stat.st_mode) || S_ISBLK (f->stat.st_mode)) sprintf (p, "%3lu, %3lu ", - (unsigned long) major (f->stat.st_rdev), - (unsigned long) minor (f->stat.st_rdev)); + (unsigned long int) major (f->stat.st_rdev), + (unsigned long int) minor (f->stat.st_rdev)); else { char hbuf[LONGEST_HUMAN_READABLE + 1]; @@ -3399,7 +3405,7 @@ print_color_indicator (const char *name, mode_t mode, int linkok) name += len; /* Pointer to final \0. */ for (ext = color_ext_list; ext != NULL; ext = ext->next) { - if ((size_t) ext->ext.len <= len + if (ext->ext.len <= len && strncmp (name - ext->ext.len, ext->ext.string, ext->ext.len) == 0) break; @@ -3416,12 +3422,12 @@ print_color_indicator (const char *name, mode_t mode, int linkok) static void put_indicator (const struct bin_str *ind) { - register int i; + register size_t i; register const char *p; p = ind->string; - for (i = ind->len; i > 0; --i) + for (i = ind->len; i != 0; --i) putchar (*(p++)); } @@ -3432,17 +3438,17 @@ static int put_indicator_direct (const struct bin_str *ind) { size_t len; - if (ind->len <= 0) + if (ind->len == 0) return 0; len = ind->len; return (full_write (STDOUT_FILENO, ind->string, len) != len); } -static int +static size_t length_of_file_name_and_frills (const struct fileinfo *f) { - register int len = 0; + register size_t len = 0; size_t name_width; if (print_inode) @@ -3482,14 +3488,14 @@ static void print_many_per_line (void) { struct column_info *line_fmt; - int filesno; /* Index into files. */ - int row; /* Current row. */ - int max_name_length; /* Length of longest file name + frills. */ - int name_length; /* Length of each file name + frills. */ - int pos; /* Current character column. */ - int cols; /* Number of files across. */ - int rows; /* Maximum number of files down. */ - int max_cols; + size_t filesno; /* Index into files. */ + size_t row; /* Current row. */ + size_t max_name_length; /* Length of longest file name + frills. */ + size_t name_length; /* Length of each file name + frills. */ + size_t pos; /* Current character column. */ + size_t cols; /* Number of files across. */ + size_t rows; /* Maximum number of files down. */ + size_t max_cols; /* Normally the maximum number of columns is determined by the screen width. But if few files are available this might limit it @@ -3499,7 +3505,7 @@ print_many_per_line (void) /* Compute the maximum number of possible columns. */ for (filesno = 0; filesno < files_index; ++filesno) { - int i; + size_t i; name_length = length_of_file_name_and_frills (files + filesno); @@ -3507,8 +3513,8 @@ print_many_per_line (void) { if (column_info[i].valid_len) { - int idx = filesno / ((files_index + i) / (i + 1)); - int real_length = name_length + (idx == i ? 0 : 2); + size_t idx = filesno / ((files_index + i) / (i + 1)); + size_t real_length = name_length + (idx == i ? 0 : 2); if (real_length > column_info[i].col_arr[idx]) { @@ -3536,7 +3542,7 @@ print_many_per_line (void) for (row = 0; row < rows; row++) { - int col = 0; + size_t col = 0; filesno = row; pos = 0; /* Print the next row. */ @@ -3561,12 +3567,12 @@ static void print_horizontal (void) { struct column_info *line_fmt; - int filesno; - int max_name_length; - int name_length; - int cols; - int pos; - int max_cols; + size_t filesno; + size_t max_name_length; + size_t name_length; + size_t cols; + size_t pos; + size_t max_cols; /* Normally the maximum number of columns is determined by the screen width. But if few files are available this might limit it @@ -3577,7 +3583,7 @@ print_horizontal (void) max_name_length = 0; for (filesno = 0; filesno < files_index; ++filesno) { - int i; + size_t i; name_length = length_of_file_name_and_frills (files + filesno); @@ -3585,8 +3591,8 @@ print_horizontal (void) { if (column_info[i].valid_len) { - int idx = filesno % (i + 1); - int real_length = name_length + (idx == i ? 0 : 2); + size_t idx = filesno % (i + 1); + size_t real_length = name_length + (idx == i ? 0 : 2); if (real_length > column_info[i].col_arr[idx]) { @@ -3618,7 +3624,7 @@ print_horizontal (void) /* Now the rest. */ for (filesno = 1; filesno < files_index; ++filesno) { - int col = filesno % cols; + size_t col = filesno % cols; if (col == 0) { @@ -3642,8 +3648,9 @@ print_horizontal (void) static void print_with_commas (void) { - int filesno; - int pos, old_pos; + size_t filesno; + size_t pos; + size_t old_pos; pos = 0; @@ -3675,11 +3682,11 @@ print_with_commas (void) Use a TAB character instead of two or more spaces whenever possible. */ static void -indent (int from, int to) +indent (size_t from, size_t to) { while (from < to) { - if (tabsize > 0 && to / tabsize > (from + 1) / tabsize) + if (tabsize != 0 && to / tabsize > (from + 1) / tabsize) { putchar ('\t'); from += tabsize - from % tabsize; @@ -3718,7 +3725,7 @@ attach (char *dest, const char *dirname, const char *name) static void init_column_info (void) { - int i; + size_t i; int allocate = 0; max_idx = line_length / MIN_COLUMN_WIDTH; @@ -3727,19 +3734,20 @@ init_column_info (void) if (column_info == NULL) { - column_info = XMALLOC (struct column_info, max_idx); + column_info = xnmalloc (max_idx, sizeof *column_info); allocate = 1; } for (i = 0; i < max_idx; ++i) { - int j; + size_t j; - column_info[i].valid_len = 1; + column_info[i].valid_len = true; column_info[i].line_len = (i + 1) * MIN_COLUMN_WIDTH; if (allocate) - column_info[i].col_arr = XMALLOC (int, i + 1); + column_info[i].col_arr = xnmalloc (i + 1, + sizeof column_info[i].col_arr[0]); for (j = 0; j <= i; ++j) column_info[i].col_arr[j] = MIN_COLUMN_WIDTH; |