diff options
author | Jim Meyering <jim@meyering.net> | 2003-09-05 20:53:08 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2003-09-05 20:53:08 +0000 |
commit | 1f4715e0e8d5e1bb071e2ecd6e60b68603460fd7 (patch) | |
tree | e5630790434b1a576ca51c2b204a0632bc9f401f | |
parent | 098a0f56ca1c6c3b89e48e42fcb4900b3fab58bd (diff) | |
download | coreutils-1f4715e0e8d5e1bb071e2ecd6e60b68603460fd7.tar.xz |
Don't ignore -S if input is a pipe. Bug report by Michael McFarland in
<http://mail.gnu.org/archive/html/bug-coreutils/2003-09/msg00008.html>.
(sort_buffer_size): Omit SIZE_BOUND arg. Compute the
size_bound ourselves. if an input file is a pipe and the user
specified a size, use that size instead of trying to guess the
pipe size. This has the beneficial side effect of avoiding the
overhead of default_sort_size in that case. All callers changed.
(sort): Remove static var size; now done by sort_buffer_size.
-rw-r--r-- | src/sort.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/sort.c b/src/sort.c index 7a2fe54ea..22b51e197 100644 --- a/src/sort.c +++ b/src/sort.c @@ -684,13 +684,18 @@ default_sort_size (void) by FPS and FILES, which are alternate paths to the same files. NFILES gives the number of input files; NFPS may be less. Assume that each input line requires LINE_BYTES extra bytes' worth of line - information. Return at most SIZE_BOUND. */ + information. Do not exceed a bound on the size: if the bound is + not specified by the user, use a default. */ static size_t sort_buffer_size (FILE *const *fps, int nfps, char *const *files, int nfiles, - size_t line_bytes, size_t size_bound) + size_t line_bytes) { + /* A bound on the input size. If zero, the bound hasn't been + determined yet. */ + static size_t size_bound; + /* In the worst case, each input byte is a newline. */ size_t worst_case_per_input_byte = line_bytes + 1; @@ -712,7 +717,23 @@ sort_buffer_size (FILE *const *fps, int nfps, != 0) die (_("stat failed"), files[i]); - file_size = S_ISREG (st.st_mode) ? st.st_size : INPUT_FILE_SIZE_GUESS; + if (S_ISREG (st.st_mode)) + file_size = st.st_size; + else + { + /* The file has unknown size. If the user specified a sort + buffer size, use that; otherwise, guess the size. */ + if (sort_size) + return sort_size; + file_size = INPUT_FILE_SIZE_GUESS; + } + + if (! size_bound) + { + size_bound = sort_size; + if (! size_bound) + size_bound = default_sort_size (); + } /* Add the amount of memory needed to represent the worst case where the input consists entirely of newlines followed by a @@ -1963,10 +1984,6 @@ sort (char * const *files, int nfiles, char const *output_file) int n_temp_files = 0; bool output_file_created = false; - static size_t size; - if (! size && ! (size = sort_size)) - size = default_sort_size (); - buf.alloc = 0; while (nfiles) @@ -1979,8 +1996,7 @@ sort (char * const *files, int nfiles, char const *output_file) if (! buf.alloc) initbuf (&buf, bytes_per_line, - sort_buffer_size (&fp, 1, files, nfiles, - bytes_per_line, size)); + sort_buffer_size (&fp, 1, files, nfiles, bytes_per_line)); buf.eof = false; files++; nfiles--; |