dd: clarify meaning of multiplication factors; put xM in order
[platform/upstream/coreutils.git] / src / sort.c
1 /* sort - sort lines of text (with all kinds of options).
2    Copyright (C) 1988, 1991-2008 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17    Written December 1988 by Mike Haertel.
18    The author may be reached (Email) at the address mike@gnu.ai.mit.edu,
19    or (US mail) as Mike Haertel c/o Free Software Foundation.
20
21    Ørn E. Hansen added NLS support in 1997.  */
22
23 #include <config.h>
24
25 #include <getopt.h>
26 #include <sys/types.h>
27 #include <sys/wait.h>
28 #include <signal.h>
29 #include "system.h"
30 #include "argmatch.h"
31 #include "error.h"
32 #include "hard-locale.h"
33 #include "hash.h"
34 #include "md5.h"
35 #include "physmem.h"
36 #include "posixver.h"
37 #include "quote.h"
38 #include "quotearg.h"
39 #include "randread.h"
40 #include "readtokens0.h"
41 #include "stdio--.h"
42 #include "stdlib--.h"
43 #include "strnumcmp.h"
44 #include "xmemcoll.h"
45 #include "xmemxfrm.h"
46 #include "xstrtol.h"
47
48 #if HAVE_SYS_RESOURCE_H
49 # include <sys/resource.h>
50 #endif
51 #ifndef RLIMIT_DATA
52 struct rlimit { size_t rlim_cur; };
53 # define getrlimit(Resource, Rlp) (-1)
54 #endif
55
56 /* The official name of this program (e.g., no `g' prefix).  */
57 #define PROGRAM_NAME "sort"
58
59 #define AUTHORS \
60   proper_name ("Mike Haertel"), \
61   proper_name ("Paul Eggert")
62
63 #if HAVE_LANGINFO_CODESET
64 # include <langinfo.h>
65 #endif
66
67 /* Use SA_NOCLDSTOP as a proxy for whether the sigaction machinery is
68    present.  */
69 #ifndef SA_NOCLDSTOP
70 # define SA_NOCLDSTOP 0
71 /* No sigprocmask.  Always 'return' zero. */
72 # define sigprocmask(How, Set, Oset) (0)
73 # define sigset_t int
74 # if ! HAVE_SIGINTERRUPT
75 #  define siginterrupt(sig, flag) /* empty */
76 # endif
77 #endif
78
79 #if !defined OPEN_MAX && defined NR_OPEN
80 # define OPEN_MAX NR_OPEN
81 #endif
82 #if !defined OPEN_MAX
83 # define OPEN_MAX 20
84 #endif
85
86 #define UCHAR_LIM (UCHAR_MAX + 1)
87
88 #ifndef DEFAULT_TMPDIR
89 # define DEFAULT_TMPDIR "/tmp"
90 #endif
91
92 /* Exit statuses.  */
93 enum
94   {
95     /* POSIX says to exit with status 1 if invoked with -c and the
96        input is not properly sorted.  */
97     SORT_OUT_OF_ORDER = 1,
98
99     /* POSIX says any other irregular exit must exit with a status
100        code greater than 1.  */
101     SORT_FAILURE = 2
102   };
103
104 enum
105   {
106     /* The number of times we should try to fork a compression process
107        (we retry if the fork call fails).  We don't _need_ to compress
108        temp files, this is just to reduce disk access, so this number
109        can be small.  */
110     MAX_FORK_TRIES_COMPRESS = 2,
111
112     /* The number of times we should try to fork a decompression process.
113        If we can't fork a decompression process, we can't sort, so this
114        number should be big.  */
115     MAX_FORK_TRIES_DECOMPRESS = 8
116   };
117
118 /* The representation of the decimal point in the current locale.  */
119 static int decimal_point;
120
121 /* Thousands separator; if -1, then there isn't one.  */
122 static int thousands_sep;
123
124 /* Nonzero if the corresponding locales are hard.  */
125 static bool hard_LC_COLLATE;
126 #if HAVE_NL_LANGINFO
127 static bool hard_LC_TIME;
128 #endif
129
130 #define NONZERO(x) ((x) != 0)
131
132 /* The kind of blanks for '-b' to skip in various options. */
133 enum blanktype { bl_start, bl_end, bl_both };
134
135 /* The character marking end of line. Default to \n. */
136 static char eolchar = '\n';
137
138 /* Lines are held in core as counted strings. */
139 struct line
140 {
141   char *text;                   /* Text of the line. */
142   size_t length;                /* Length including final newline. */
143   char *keybeg;                 /* Start of first key. */
144   char *keylim;                 /* Limit of first key. */
145 };
146
147 /* Input buffers. */
148 struct buffer
149 {
150   char *buf;                    /* Dynamically allocated buffer,
151                                    partitioned into 3 regions:
152                                    - input data;
153                                    - unused area;
154                                    - an array of lines, in reverse order.  */
155   size_t used;                  /* Number of bytes used for input data.  */
156   size_t nlines;                /* Number of lines in the line array.  */
157   size_t alloc;                 /* Number of bytes allocated. */
158   size_t left;                  /* Number of bytes left from previous reads. */
159   size_t line_bytes;            /* Number of bytes to reserve for each line. */
160   bool eof;                     /* An EOF has been read.  */
161 };
162
163 struct keyfield
164 {
165   size_t sword;                 /* Zero-origin 'word' to start at. */
166   size_t schar;                 /* Additional characters to skip. */
167   size_t eword;                 /* Zero-origin first word after field. */
168   size_t echar;                 /* Additional characters in field. */
169   bool const *ignore;           /* Boolean array of characters to ignore. */
170   char const *translate;        /* Translation applied to characters. */
171   bool skipsblanks;             /* Skip leading blanks when finding start.  */
172   bool skipeblanks;             /* Skip leading blanks when finding end.  */
173   bool numeric;                 /* Flag for numeric comparison.  Handle
174                                    strings of digits with optional decimal
175                                    point, but no exponential notation. */
176   bool random;                  /* Sort by random hash of key.  */
177   bool general_numeric;         /* Flag for general, numeric comparison.
178                                    Handle numbers in exponential notation. */
179   bool month;                   /* Flag for comparison by month name. */
180   bool reverse;                 /* Reverse the sense of comparison. */
181   struct keyfield *next;        /* Next keyfield to try. */
182 };
183
184 struct month
185 {
186   char const *name;
187   int val;
188 };
189
190 /* FIXME: None of these tables work with multibyte character sets.
191    Also, there are many other bugs when handling multibyte characters.
192    One way to fix this is to rewrite `sort' to use wide characters
193    internally, but doing this with good performance is a bit
194    tricky.  */
195
196 /* Table of blanks.  */
197 static bool blanks[UCHAR_LIM];
198
199 /* Table of non-printing characters. */
200 static bool nonprinting[UCHAR_LIM];
201
202 /* Table of non-dictionary characters (not letters, digits, or blanks). */
203 static bool nondictionary[UCHAR_LIM];
204
205 /* Translation table folding lower case to upper.  */
206 static char fold_toupper[UCHAR_LIM];
207
208 #define MONTHS_PER_YEAR 12
209
210 /* Table mapping month names to integers.
211    Alphabetic order allows binary search. */
212 static struct month monthtab[] =
213 {
214   {"APR", 4},
215   {"AUG", 8},
216   {"DEC", 12},
217   {"FEB", 2},
218   {"JAN", 1},
219   {"JUL", 7},
220   {"JUN", 6},
221   {"MAR", 3},
222   {"MAY", 5},
223   {"NOV", 11},
224   {"OCT", 10},
225   {"SEP", 9}
226 };
227
228 /* During the merge phase, the number of files to merge at once. */
229 #define NMERGE_DEFAULT 16
230
231 /* Minimum size for a merge or check buffer.  */
232 #define MIN_MERGE_BUFFER_SIZE (2 + sizeof (struct line))
233
234 /* Minimum sort size; the code might not work with smaller sizes.  */
235 #define MIN_SORT_SIZE (nmerge * MIN_MERGE_BUFFER_SIZE)
236
237 /* The number of bytes needed for a merge or check buffer, which can
238    function relatively efficiently even if it holds only one line.  If
239    a longer line is seen, this value is increased.  */
240 static size_t merge_buffer_size = MAX (MIN_MERGE_BUFFER_SIZE, 256 * 1024);
241
242 /* The approximate maximum number of bytes of main memory to use, as
243    specified by the user.  Zero if the user has not specified a size.  */
244 static size_t sort_size;
245
246 /* The guessed size for non-regular files.  */
247 #define INPUT_FILE_SIZE_GUESS (1024 * 1024)
248
249 /* Array of directory names in which any temporary files are to be created. */
250 static char const **temp_dirs;
251
252 /* Number of temporary directory names used.  */
253 static size_t temp_dir_count;
254
255 /* Number of allocated slots in temp_dirs.  */
256 static size_t temp_dir_alloc;
257
258 /* Flag to reverse the order of all comparisons. */
259 static bool reverse;
260
261 /* Flag for stable sort.  This turns off the last ditch bytewise
262    comparison of lines, and instead leaves lines in the same order
263    they were read if all keys compare equal.  */
264 static bool stable;
265
266 /* If TAB has this value, blanks separate fields.  */
267 enum { TAB_DEFAULT = CHAR_MAX + 1 };
268
269 /* Tab character separating fields.  If TAB_DEFAULT, then fields are
270    separated by the empty string between a non-blank character and a blank
271    character. */
272 static int tab = TAB_DEFAULT;
273
274 /* Flag to remove consecutive duplicate lines from the output.
275    Only the last of a sequence of equal lines will be output. */
276 static bool unique;
277
278 /* Nonzero if any of the input files are the standard input. */
279 static bool have_read_stdin;
280
281 /* List of key field comparisons to be tried.  */
282 static struct keyfield *keylist;
283
284 /* Program used to (de)compress temp files.  Must accept -d.  */
285 static char const *compress_program;
286
287 /* Maximum number of files to merge in one go.  If more than this
288    number are present, temp files will be used. */
289 static unsigned int nmerge = NMERGE_DEFAULT;
290
291 static void sortlines_temp (struct line *, size_t, struct line *);
292
293 /* Report MESSAGE for FILE, then clean up and exit.
294    If FILE is null, it represents standard output.  */
295
296 static void die (char const *, char const *) ATTRIBUTE_NORETURN;
297 static void
298 die (char const *message, char const *file)
299 {
300   error (0, errno, "%s: %s", message, file ? file : _("standard output"));
301   exit (SORT_FAILURE);
302 }
303
304 void
305 usage (int status)
306 {
307   if (status != EXIT_SUCCESS)
308     fprintf (stderr, _("Try `%s --help' for more information.\n"),
309              program_name);
310   else
311     {
312       printf (_("\
313 Usage: %s [OPTION]... [FILE]...\n\
314   or:  %s [OPTION]... --files0-from=F\n\
315 "),
316               program_name, program_name);
317       fputs (_("\
318 Write sorted concatenation of all FILE(s) to standard output.\n\
319 \n\
320 "), stdout);
321       fputs (_("\
322 Mandatory arguments to long options are mandatory for short options too.\n\
323 "), stdout);
324       fputs (_("\
325 Ordering options:\n\
326 \n\
327 "), stdout);
328       fputs (_("\
329   -b, --ignore-leading-blanks  ignore leading blanks\n\
330   -d, --dictionary-order      consider only blanks and alphanumeric characters\n\
331   -f, --ignore-case           fold lower case to upper case characters\n\
332 "), stdout);
333       fputs (_("\
334   -g, --general-numeric-sort  compare according to general numerical value\n\
335   -i, --ignore-nonprinting    consider only printable characters\n\
336   -M, --month-sort            compare (unknown) < `JAN' < ... < `DEC'\n\
337   -n, --numeric-sort          compare according to string numerical value\n\
338   -R, --random-sort           sort by random hash of keys\n\
339       --random-source=FILE    get random bytes from FILE (default /dev/urandom)\n\
340       --sort=WORD             sort according to WORD:\n\
341                                 general-numeric -g, month -M, numeric -n,\n\
342                                 random -R\n\
343   -r, --reverse               reverse the result of comparisons\n\
344 \n\
345 "), stdout);
346       fputs (_("\
347 Other options:\n\
348 \n\
349 "), stdout);
350       fputs (_("\
351       --batch-size=NMERGE   merge at most NMERGE inputs at once;\n\
352                             for more use temp files\n\
353 "), stdout);
354       fputs (_("\
355   -c, --check, --check=diagnose-first  check for sorted input; do not sort\n\
356   -C, --check=quiet, --check=silent  like -c, but do not report first bad line\n\
357       --compress-program=PROG  compress temporaries with PROG;\n\
358                               decompress them with PROG -d\n\
359       --files0-from=F       read input from the files specified by\n\
360                             NUL-terminated names in file F\n\
361 "), stdout);
362       fputs (_("\
363   -k, --key=POS1[,POS2]     start a key at POS1, end it at POS2 (origin 1)\n\
364   -m, --merge               merge already sorted files; do not sort\n\
365 "), stdout);
366       fputs (_("\
367   -o, --output=FILE         write result to FILE instead of standard output\n\
368   -s, --stable              stabilize sort by disabling last-resort comparison\n\
369   -S, --buffer-size=SIZE    use SIZE for main memory buffer\n\
370 "), stdout);
371       printf (_("\
372   -t, --field-separator=SEP  use SEP instead of non-blank to blank transition\n\
373   -T, --temporary-directory=DIR  use DIR for temporaries, not $TMPDIR or %s;\n\
374                               multiple options specify multiple directories\n\
375   -u, --unique              with -c, check for strict ordering;\n\
376                               without -c, output only the first of an equal run\n\
377 "), DEFAULT_TMPDIR);
378       fputs (_("\
379   -z, --zero-terminated     end lines with 0 byte, not newline\n\
380 "), stdout);
381       fputs (HELP_OPTION_DESCRIPTION, stdout);
382       fputs (VERSION_OPTION_DESCRIPTION, stdout);
383       fputs (_("\
384 \n\
385 POS is F[.C][OPTS], where F is the field number and C the character position\n\
386 in the field; both are origin 1.  If neither -t nor -b is in effect, characters\n\
387 in a field are counted from the beginning of the preceding whitespace.  OPTS is\n\
388 one or more single-letter ordering options, which override global ordering\n\
389 options for that key.  If no key is given, use the entire line as the key.\n\
390 \n\
391 SIZE may be followed by the following multiplicative suffixes:\n\
392 "), stdout);
393       fputs (_("\
394 % 1% of memory, b 1, K 1024 (default), and so on for M, G, T, P, E, Z, Y.\n\
395 \n\
396 With no FILE, or when FILE is -, read standard input.\n\
397 \n\
398 *** WARNING ***\n\
399 The locale specified by the environment affects sort order.\n\
400 Set LC_ALL=C to get the traditional sort order that uses\n\
401 native byte values.\n\
402 "), stdout );
403       emit_bug_reporting_address ();
404     }
405
406   exit (status);
407 }
408
409 /* For long options that have no equivalent short option, use a
410    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
411 enum
412 {
413   CHECK_OPTION = CHAR_MAX + 1,
414   COMPRESS_PROGRAM_OPTION,
415   FILES0_FROM_OPTION,
416   NMERGE_OPTION,
417   RANDOM_SOURCE_OPTION,
418   SORT_OPTION
419 };
420
421 static char const short_options[] = "-bcCdfgik:mMno:rRsS:t:T:uy:z";
422
423 static struct option const long_options[] =
424 {
425   {"ignore-leading-blanks", no_argument, NULL, 'b'},
426   {"check", optional_argument, NULL, CHECK_OPTION},
427   {"compress-program", required_argument, NULL, COMPRESS_PROGRAM_OPTION},
428   {"dictionary-order", no_argument, NULL, 'd'},
429   {"ignore-case", no_argument, NULL, 'f'},
430   {"files0-from", required_argument, NULL, FILES0_FROM_OPTION},
431   {"general-numeric-sort", no_argument, NULL, 'g'},
432   {"ignore-nonprinting", no_argument, NULL, 'i'},
433   {"key", required_argument, NULL, 'k'},
434   {"merge", no_argument, NULL, 'm'},
435   {"month-sort", no_argument, NULL, 'M'},
436   {"numeric-sort", no_argument, NULL, 'n'},
437   {"random-sort", no_argument, NULL, 'R'},
438   {"random-source", required_argument, NULL, RANDOM_SOURCE_OPTION},
439   {"sort", required_argument, NULL, SORT_OPTION},
440   {"output", required_argument, NULL, 'o'},
441   {"reverse", no_argument, NULL, 'r'},
442   {"stable", no_argument, NULL, 's'},
443   {"batch-size", required_argument, NULL, NMERGE_OPTION},
444   {"buffer-size", required_argument, NULL, 'S'},
445   {"field-separator", required_argument, NULL, 't'},
446   {"temporary-directory", required_argument, NULL, 'T'},
447   {"unique", no_argument, NULL, 'u'},
448   {"zero-terminated", no_argument, NULL, 'z'},
449   {GETOPT_HELP_OPTION_DECL},
450   {GETOPT_VERSION_OPTION_DECL},
451   {NULL, 0, NULL, 0},
452 };
453
454 static char const *const check_args[] =
455 {
456   "quiet", "silent", "diagnose-first", NULL
457 };
458 static char const check_types[] =
459 {
460   'C', 'C', 'c'
461 };
462 ARGMATCH_VERIFY (check_args, check_types);
463
464 static char const *const sort_args[] =
465 {
466   "general-numeric", "month", "numeric", "random", NULL
467 };
468 static char const sort_types[] =
469 {
470   'g', 'M', 'n', 'R'
471 };
472 ARGMATCH_VERIFY (sort_args, sort_types);
473
474 /* The set of signals that are caught.  */
475 static sigset_t caught_signals;
476
477 /* Critical section status.  */
478 struct cs_status
479 {
480   bool valid;
481   sigset_t sigs;
482 };
483
484 /* Enter a critical section.  */
485 static struct cs_status
486 cs_enter (void)
487 {
488   struct cs_status status;
489   status.valid = (sigprocmask (SIG_BLOCK, &caught_signals, &status.sigs) == 0);
490   return status;
491 }
492
493 /* Leave a critical section.  */
494 static void
495 cs_leave (struct cs_status status)
496 {
497   if (status.valid)
498     {
499       /* Ignore failure when restoring the signal mask. */
500       sigprocmask (SIG_SETMASK, &status.sigs, NULL);
501     }
502 }
503
504 /* The list of temporary files. */
505 struct tempnode
506 {
507   struct tempnode *volatile next;
508   pid_t pid;     /* If compressed, the pid of compressor, else zero */
509   char name[1];  /* Actual size is 1 + file name length.  */
510 };
511 static struct tempnode *volatile temphead;
512 static struct tempnode *volatile *temptail = &temphead;
513
514 struct sortfile
515 {
516   char const *name;
517   pid_t pid;     /* If compressed, the pid of compressor, else zero */
518 };
519
520 /* A table where we store compression process states.  We clean up all
521    processes in a timely manner so as not to exhaust system resources,
522    so we store the info on whether the process is still running, or has
523    been reaped here.  */
524 static Hash_table *proctab;
525
526 enum { INIT_PROCTAB_SIZE = 47 };
527
528 enum procstate { ALIVE, ZOMBIE };
529
530 /* A proctab entry.  The COUNT field is there in case we fork a new
531    compression process that has the same PID as an old zombie process
532    that is still in the table (because the process to decompress the
533    temp file it was associated with hasn't started yet).  */
534 struct procnode
535 {
536   pid_t pid;
537   enum procstate state;
538   size_t count;
539 };
540
541 static size_t
542 proctab_hasher (const void *entry, size_t tabsize)
543 {
544   const struct procnode *node = entry;
545   return node->pid % tabsize;
546 }
547
548 static bool
549 proctab_comparator (const void *e1, const void *e2)
550 {
551   const struct procnode *n1 = e1, *n2 = e2;
552   return n1->pid == n2->pid;
553 }
554
555 /* The total number of forked processes (compressors and decompressors)
556    that have not been reaped yet. */
557 static size_t nprocs;
558
559 /* The number of child processes we'll allow before we try to reap some. */
560 enum { MAX_PROCS_BEFORE_REAP = 2 };
561
562 /* If 0 < PID, wait for the child process with that PID to exit.
563    If PID is -1, clean up a random child process which has finished and
564    return the process ID of that child.  If PID is -1 and no processes
565    have quit yet, return 0 without waiting.  */
566
567 static pid_t
568 reap (pid_t pid)
569 {
570   int status;
571   pid_t cpid = waitpid (pid, &status, pid < 0 ? WNOHANG : 0);
572
573   if (cpid < 0)
574     error (SORT_FAILURE, errno, _("waiting for %s [-d]"),
575            compress_program);
576   else if (0 < cpid)
577     {
578       if (! WIFEXITED (status) || WEXITSTATUS (status))
579         error (SORT_FAILURE, 0, _("%s [-d] terminated abnormally"),
580                compress_program);
581       --nprocs;
582     }
583
584   return cpid;
585 }
586
587 /* Add the PID of a running compression process to proctab, or update
588    the entry COUNT and STATE fields if it's already there.  This also
589    creates the table for us the first time it's called.  */
590
591 static void
592 register_proc (pid_t pid)
593 {
594   struct procnode test, *node;
595
596   if (! proctab)
597     {
598       proctab = hash_initialize (INIT_PROCTAB_SIZE, NULL,
599                                  proctab_hasher,
600                                  proctab_comparator,
601                                  free);
602       if (! proctab)
603         xalloc_die ();
604     }
605
606   test.pid = pid;
607   node = hash_lookup (proctab, &test);
608   if (node)
609     {
610       node->state = ALIVE;
611       ++node->count;
612     }
613   else
614     {
615       node = xmalloc (sizeof *node);
616       node->pid = pid;
617       node->state = ALIVE;
618       node->count = 1;
619       hash_insert (proctab, node);
620     }
621 }
622
623 /* This is called when we reap a random process.  We don't know
624    whether we have reaped a compression process or a decompression
625    process until we look in the table.  If there's an ALIVE entry for
626    it, then we have reaped a compression process, so change the state
627    to ZOMBIE.  Otherwise, it's a decompression processes, so ignore it.  */
628
629 static void
630 update_proc (pid_t pid)
631 {
632   struct procnode test, *node;
633
634   test.pid = pid;
635   node = hash_lookup (proctab, &test);
636   if (node)
637     node->state = ZOMBIE;
638 }
639
640 /* This is for when we need to wait for a compression process to exit.
641    If it has a ZOMBIE entry in the table then it's already dead and has
642    been reaped.  Note that if there's an ALIVE entry for it, it still may
643    already have died and been reaped if a second process was created with
644    the same PID.  This is probably exceedingly rare, but to be on the safe
645    side we will have to wait for any compression process with this PID.  */
646
647 static void
648 wait_proc (pid_t pid)
649 {
650   struct procnode test, *node;
651
652   test.pid = pid;
653   node = hash_lookup (proctab, &test);
654   if (node->state == ALIVE)
655     reap (pid);
656
657   node->state = ZOMBIE;
658   if (! --node->count)
659     {
660       hash_delete (proctab, node);
661       free (node);
662     }
663 }
664
665 /* Keep reaping finished children as long as there are more to reap.
666    This doesn't block waiting for any of them, it only reaps those
667    that are already dead.  */
668
669 static void
670 reap_some (void)
671 {
672   pid_t pid;
673
674   while (0 < nprocs && (pid = reap (-1)))
675     update_proc (pid);
676 }
677
678 /* Clean up any remaining temporary files.  */
679
680 static void
681 cleanup (void)
682 {
683   struct tempnode const *node;
684
685   for (node = temphead; node; node = node->next)
686     unlink (node->name);
687   temphead = NULL;
688 }
689
690 /* Cleanup actions to take when exiting.  */
691
692 static void
693 exit_cleanup (void)
694 {
695   if (temphead)
696     {
697       /* Clean up any remaining temporary files in a critical section so
698          that a signal handler does not try to clean them too.  */
699       struct cs_status cs = cs_enter ();
700       cleanup ();
701       cs_leave (cs);
702     }
703
704   close_stdout ();
705 }
706
707 /* Create a new temporary file, returning its newly allocated tempnode.
708    Store into *PFD the file descriptor open for writing.  */
709
710 static struct tempnode *
711 create_temp_file (int *pfd)
712 {
713   static char const slashbase[] = "/sortXXXXXX";
714   static size_t temp_dir_index;
715   int fd;
716   int saved_errno;
717   char const *temp_dir = temp_dirs[temp_dir_index];
718   size_t len = strlen (temp_dir);
719   struct tempnode *node =
720     xmalloc (offsetof (struct tempnode, name) + len + sizeof slashbase);
721   char *file = node->name;
722   struct cs_status cs;
723
724   memcpy (file, temp_dir, len);
725   memcpy (file + len, slashbase, sizeof slashbase);
726   node->next = NULL;
727   node->pid = 0;
728   if (++temp_dir_index == temp_dir_count)
729     temp_dir_index = 0;
730
731   /* Create the temporary file in a critical section, to avoid races.  */
732   cs = cs_enter ();
733   fd = mkstemp (file);
734   if (0 <= fd)
735     {
736       *temptail = node;
737       temptail = &node->next;
738     }
739   saved_errno = errno;
740   cs_leave (cs);
741   errno = saved_errno;
742
743   if (fd < 0)
744     die (_("cannot create temporary file"), file);
745
746   *pfd = fd;
747   return node;
748 }
749
750 /* Return a stream for FILE, opened with mode HOW.  A null FILE means
751    standard output; HOW should be "w".  When opening for input, "-"
752    means standard input.  To avoid confusion, do not return file
753    descriptors STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO when
754    opening an ordinary FILE.  */
755
756 static FILE *
757 xfopen (const char *file, const char *how)
758 {
759   FILE *fp;
760
761   if (!file)
762     fp = stdout;
763   else if (STREQ (file, "-") && *how == 'r')
764     {
765       have_read_stdin = true;
766       fp = stdin;
767     }
768   else
769     {
770       fp = fopen (file, how);
771       if (! fp)
772         die (_("open failed"), file);
773     }
774
775   return fp;
776 }
777
778 /* Close FP, whose name is FILE, and report any errors.  */
779
780 static void
781 xfclose (FILE *fp, char const *file)
782 {
783   switch (fileno (fp))
784     {
785     case STDIN_FILENO:
786       /* Allow reading stdin from tty more than once.  */
787       if (feof (fp))
788         clearerr (fp);
789       break;
790
791     case STDOUT_FILENO:
792       /* Don't close stdout just yet.  close_stdout does that.  */
793       if (fflush (fp) != 0)
794         die (_("fflush failed"), file);
795       break;
796
797     default:
798       if (fclose (fp) != 0)
799         die (_("close failed"), file);
800       break;
801     }
802 }
803
804 static void
805 dup2_or_die (int oldfd, int newfd)
806 {
807   if (dup2 (oldfd, newfd) < 0)
808     error (SORT_FAILURE, errno, _("dup2 failed"));
809 }
810
811 /* Fork a child process for piping to and do common cleanup.  The
812    TRIES parameter tells us how many times to try to fork before
813    giving up.  Return the PID of the child or -1 if fork failed.  */
814
815 static pid_t
816 pipe_fork (int pipefds[2], size_t tries)
817 {
818 #if HAVE_WORKING_FORK
819   struct tempnode *saved_temphead;
820   int saved_errno;
821   unsigned int wait_retry = 1;
822   pid_t pid IF_LINT (= -1);
823   struct cs_status cs;
824
825   if (pipe (pipefds) < 0)
826     return -1;
827
828   while (tries--)
829     {
830       /* This is so the child process won't delete our temp files
831          if it receives a signal before exec-ing.  */
832       cs = cs_enter ();
833       saved_temphead = temphead;
834       temphead = NULL;
835
836       pid = fork ();
837       saved_errno = errno;
838       if (pid)
839         temphead = saved_temphead;
840
841       cs_leave (cs);
842       errno = saved_errno;
843
844       if (0 <= pid || errno != EAGAIN)
845         break;
846       else
847         {
848           sleep (wait_retry);
849           wait_retry *= 2;
850           reap_some ();
851         }
852     }
853
854   if (pid < 0)
855     {
856       close (pipefds[0]);
857       close (pipefds[1]);
858     }
859   else if (pid == 0)
860     {
861       close (STDIN_FILENO);
862       close (STDOUT_FILENO);
863     }
864   else
865     ++nprocs;
866
867   return pid;
868
869 #else  /* ! HAVE_WORKING_FORK */
870   return -1;
871 #endif
872 }
873
874 /* Create a temporary file and start a compression program to filter output
875    to that file.  Set *PFP to the file handle and if *PPID is non-NULL,
876    set it to the PID of the newly-created process.  */
877
878 static char *
879 create_temp (FILE **pfp, pid_t *ppid)
880 {
881   int tempfd;
882   struct tempnode *node = create_temp_file (&tempfd);
883   char *name = node->name;
884
885   if (compress_program)
886     {
887       int pipefds[2];
888
889       node->pid = pipe_fork (pipefds, MAX_FORK_TRIES_COMPRESS);
890       if (0 < node->pid)
891         {
892           close (tempfd);
893           close (pipefds[0]);
894           tempfd = pipefds[1];
895
896           register_proc (node->pid);
897         }
898       else if (node->pid == 0)
899         {
900           close (pipefds[1]);
901           dup2_or_die (tempfd, STDOUT_FILENO);
902           close (tempfd);
903           dup2_or_die (pipefds[0], STDIN_FILENO);
904           close (pipefds[0]);
905
906           if (execlp (compress_program, compress_program, (char *) NULL) < 0)
907             error (SORT_FAILURE, errno, _("couldn't execute %s"),
908                    compress_program);
909         }
910       else
911         node->pid = 0;
912     }
913
914   *pfp = fdopen (tempfd, "w");
915   if (! *pfp)
916     die (_("couldn't create temporary file"), name);
917
918   if (ppid)
919     *ppid = node->pid;
920
921   return name;
922 }
923
924 /* Open a compressed temp file and start a decompression process through
925    which to filter the input.  PID must be the valid processes ID of the
926    process used to compress the file.  */
927
928 static FILE *
929 open_temp (const char *name, pid_t pid)
930 {
931   int tempfd, pipefds[2];
932   pid_t child_pid;
933   FILE *fp;
934
935   wait_proc (pid);
936
937   tempfd = open (name, O_RDONLY);
938   if (tempfd < 0)
939     die (_("couldn't open temporary file"), name);
940
941   child_pid = pipe_fork (pipefds, MAX_FORK_TRIES_DECOMPRESS);
942   if (0 < child_pid)
943     {
944       close (tempfd);
945       close (pipefds[1]);
946     }
947   else if (child_pid == 0)
948     {
949       close (pipefds[0]);
950       dup2_or_die (tempfd, STDIN_FILENO);
951       close (tempfd);
952       dup2_or_die (pipefds[1], STDOUT_FILENO);
953       close (pipefds[1]);
954
955       if (execlp (compress_program, compress_program, "-d", (char *) NULL) < 0)
956         error (SORT_FAILURE, errno, _("couldn't execute %s -d"),
957                compress_program);
958     }
959   else
960     error (SORT_FAILURE, errno, _("couldn't create process for %s -d"),
961            compress_program);
962
963   fp = fdopen (pipefds[0], "r");
964   if (! fp)
965     die (_("couldn't create temporary file"), name);
966
967   return fp;
968 }
969
970 static void
971 write_bytes (const char *buf, size_t n_bytes, FILE *fp, const char *output_file)
972 {
973   if (fwrite (buf, 1, n_bytes, fp) != n_bytes)
974     die (_("write failed"), output_file);
975 }
976
977 /* Append DIR to the array of temporary directory names.  */
978 static void
979 add_temp_dir (char const *dir)
980 {
981   if (temp_dir_count == temp_dir_alloc)
982     temp_dirs = X2NREALLOC (temp_dirs, &temp_dir_alloc);
983
984   temp_dirs[temp_dir_count++] = dir;
985 }
986
987 /* Remove NAME from the list of temporary files.  */
988
989 static void
990 zaptemp (const char *name)
991 {
992   struct tempnode *volatile *pnode;
993   struct tempnode *node;
994   struct tempnode *next;
995   int unlink_status;
996   int unlink_errno = 0;
997   struct cs_status cs;
998
999   for (pnode = &temphead; (node = *pnode)->name != name; pnode = &node->next)
1000     continue;
1001
1002   /* Unlink the temporary file in a critical section to avoid races.  */
1003   next = node->next;
1004   cs = cs_enter ();
1005   unlink_status = unlink (name);
1006   unlink_errno = errno;
1007   *pnode = next;
1008   cs_leave (cs);
1009
1010   if (unlink_status != 0)
1011     error (0, unlink_errno, _("warning: cannot remove: %s"), name);
1012   if (! next)
1013     temptail = pnode;
1014   free (node);
1015 }
1016
1017 #if HAVE_NL_LANGINFO
1018
1019 static int
1020 struct_month_cmp (const void *m1, const void *m2)
1021 {
1022   struct month const *month1 = m1;
1023   struct month const *month2 = m2;
1024   return strcmp (month1->name, month2->name);
1025 }
1026
1027 #endif
1028
1029 /* Initialize the character class tables. */
1030
1031 static void
1032 inittables (void)
1033 {
1034   size_t i;
1035
1036   for (i = 0; i < UCHAR_LIM; ++i)
1037     {
1038       blanks[i] = !! isblank (i);
1039       nonprinting[i] = ! isprint (i);
1040       nondictionary[i] = ! isalnum (i) && ! isblank (i);
1041       fold_toupper[i] = toupper (i);
1042     }
1043
1044 #if HAVE_NL_LANGINFO
1045   /* If we're not in the "C" locale, read different names for months.  */
1046   if (hard_LC_TIME)
1047     {
1048       for (i = 0; i < MONTHS_PER_YEAR; i++)
1049         {
1050           char const *s;
1051           size_t s_len;
1052           size_t j;
1053           char *name;
1054
1055           s = (char *) nl_langinfo (ABMON_1 + i);
1056           s_len = strlen (s);
1057           monthtab[i].name = name = xmalloc (s_len + 1);
1058           monthtab[i].val = i + 1;
1059
1060           for (j = 0; j < s_len; j++)
1061             name[j] = fold_toupper[to_uchar (s[j])];
1062           name[j] = '\0';
1063         }
1064       qsort ((void *) monthtab, MONTHS_PER_YEAR,
1065              sizeof *monthtab, struct_month_cmp);
1066     }
1067 #endif
1068 }
1069
1070 /* Specify how many inputs may be merged at once.
1071    This may be set on the command-line with the
1072    --batch-size option. */
1073 static void
1074 specify_nmerge (int oi, char c, char const *s)
1075 {
1076   uintmax_t n;
1077   struct rlimit rlimit;
1078   enum strtol_error e = xstrtoumax (s, NULL, 10, &n, NULL);
1079
1080   /* Try to find out how many file descriptors we'll be able
1081      to open.  We need at least nmerge + 3 (STDIN_FILENO,
1082      STDOUT_FILENO and STDERR_FILENO). */
1083   unsigned int max_nmerge = ((getrlimit (RLIMIT_NOFILE, &rlimit) == 0
1084                               ? rlimit.rlim_cur
1085                               : OPEN_MAX)
1086                              - 3);
1087
1088   if (e == LONGINT_OK)
1089     {
1090       nmerge = n;
1091       if (nmerge != n)
1092         e = LONGINT_OVERFLOW;
1093       else
1094         {
1095           if (nmerge < 2)
1096             {
1097               error (0, 0, _("invalid --%s argument %s"),
1098                      long_options[oi].name, quote(s));
1099               error (SORT_FAILURE, 0,
1100                      _("minimum --%s argument is %s"),
1101                      long_options[oi].name, quote("2"));
1102             }
1103           else if (max_nmerge < nmerge)
1104             {
1105               e = LONGINT_OVERFLOW;
1106             }
1107           else
1108             return;
1109         }
1110     }
1111
1112   if (e == LONGINT_OVERFLOW)
1113     {
1114       char max_nmerge_buf[INT_BUFSIZE_BOUND (unsigned int)];
1115       error (0, 0, _("--%s argument %s too large"),
1116              long_options[oi].name, quote(s));
1117       error (SORT_FAILURE, 0,
1118              _("maximum --%s argument with current rlimit is %s"),
1119              long_options[oi].name,
1120              uinttostr (max_nmerge, max_nmerge_buf));
1121     }
1122   else
1123     xstrtol_fatal (e, oi, c, long_options, s);
1124 }
1125
1126 /* Specify the amount of main memory to use when sorting.  */
1127 static void
1128 specify_sort_size (int oi, char c, char const *s)
1129 {
1130   uintmax_t n;
1131   char *suffix;
1132   enum strtol_error e = xstrtoumax (s, &suffix, 10, &n, "EgGkKmMPtTYZ");
1133
1134   /* The default unit is KiB.  */
1135   if (e == LONGINT_OK && ISDIGIT (suffix[-1]))
1136     {
1137       if (n <= UINTMAX_MAX / 1024)
1138         n *= 1024;
1139       else
1140         e = LONGINT_OVERFLOW;
1141     }
1142
1143   /* A 'b' suffix means bytes; a '%' suffix means percent of memory.  */
1144   if (e == LONGINT_INVALID_SUFFIX_CHAR && ISDIGIT (suffix[-1]) && ! suffix[1])
1145     switch (suffix[0])
1146       {
1147       case 'b':
1148         e = LONGINT_OK;
1149         break;
1150
1151       case '%':
1152         {
1153           double mem = physmem_total () * n / 100;
1154
1155           /* Use "<", not "<=", to avoid problems with rounding.  */
1156           if (mem < UINTMAX_MAX)
1157             {
1158               n = mem;
1159               e = LONGINT_OK;
1160             }
1161           else
1162             e = LONGINT_OVERFLOW;
1163         }
1164         break;
1165       }
1166
1167   if (e == LONGINT_OK)
1168     {
1169       /* If multiple sort sizes are specified, take the maximum, so
1170          that option order does not matter.  */
1171       if (n < sort_size)
1172         return;
1173
1174       sort_size = n;
1175       if (sort_size == n)
1176         {
1177           sort_size = MAX (sort_size, MIN_SORT_SIZE);
1178           return;
1179         }
1180
1181       e = LONGINT_OVERFLOW;
1182     }
1183
1184   xstrtol_fatal (e, oi, c, long_options, s);
1185 }
1186
1187 /* Return the default sort size.  */
1188 static size_t
1189 default_sort_size (void)
1190 {
1191   /* Let MEM be available memory or 1/8 of total memory, whichever
1192      is greater.  */
1193   double avail = physmem_available ();
1194   double total = physmem_total ();
1195   double mem = MAX (avail, total / 8);
1196   struct rlimit rlimit;
1197
1198   /* Let SIZE be MEM, but no more than the maximum object size or
1199      system resource limits.  Avoid the MIN macro here, as it is not
1200      quite right when only one argument is floating point.  Don't
1201      bother to check for values like RLIM_INFINITY since in practice
1202      they are not much less than SIZE_MAX.  */
1203   size_t size = SIZE_MAX;
1204   if (mem < size)
1205     size = mem;
1206   if (getrlimit (RLIMIT_DATA, &rlimit) == 0 && rlimit.rlim_cur < size)
1207     size = rlimit.rlim_cur;
1208 #ifdef RLIMIT_AS
1209   if (getrlimit (RLIMIT_AS, &rlimit) == 0 && rlimit.rlim_cur < size)
1210     size = rlimit.rlim_cur;
1211 #endif
1212
1213   /* Leave a large safety margin for the above limits, as failure can
1214      occur when they are exceeded.  */
1215   size /= 2;
1216
1217 #ifdef RLIMIT_RSS
1218   /* Leave a 1/16 margin for RSS to leave room for code, stack, etc.
1219      Exceeding RSS is not fatal, but can be quite slow.  */
1220   if (getrlimit (RLIMIT_RSS, &rlimit) == 0 && rlimit.rlim_cur / 16 * 15 < size)
1221     size = rlimit.rlim_cur / 16 * 15;
1222 #endif
1223
1224   /* Use no less than the minimum.  */
1225   return MAX (size, MIN_SORT_SIZE);
1226 }
1227
1228 /* Return the sort buffer size to use with the input files identified
1229    by FPS and FILES, which are alternate names of the same files.
1230    NFILES gives the number of input files; NFPS may be less.  Assume
1231    that each input line requires LINE_BYTES extra bytes' worth of line
1232    information.  Do not exceed the size bound specified by the user
1233    (or a default size bound, if the user does not specify one).  */
1234
1235 static size_t
1236 sort_buffer_size (FILE *const *fps, size_t nfps,
1237                   char *const *files, size_t nfiles,
1238                   size_t line_bytes)
1239 {
1240   /* A bound on the input size.  If zero, the bound hasn't been
1241      determined yet.  */
1242   static size_t size_bound;
1243
1244   /* In the worst case, each input byte is a newline.  */
1245   size_t worst_case_per_input_byte = line_bytes + 1;
1246
1247   /* Keep enough room for one extra input line and an extra byte.
1248      This extra room might be needed when preparing to read EOF.  */
1249   size_t size = worst_case_per_input_byte + 1;
1250
1251   size_t i;
1252
1253   for (i = 0; i < nfiles; i++)
1254     {
1255       struct stat st;
1256       off_t file_size;
1257       size_t worst_case;
1258
1259       if ((i < nfps ? fstat (fileno (fps[i]), &st)
1260            : STREQ (files[i], "-") ? fstat (STDIN_FILENO, &st)
1261            : stat (files[i], &st))
1262           != 0)
1263         die (_("stat failed"), files[i]);
1264
1265       if (S_ISREG (st.st_mode))
1266         file_size = st.st_size;
1267       else
1268         {
1269           /* The file has unknown size.  If the user specified a sort
1270              buffer size, use that; otherwise, guess the size.  */
1271           if (sort_size)
1272             return sort_size;
1273           file_size = INPUT_FILE_SIZE_GUESS;
1274         }
1275
1276       if (! size_bound)
1277         {
1278           size_bound = sort_size;
1279           if (! size_bound)
1280             size_bound = default_sort_size ();
1281         }
1282
1283       /* Add the amount of memory needed to represent the worst case
1284          where the input consists entirely of newlines followed by a
1285          single non-newline.  Check for overflow.  */
1286       worst_case = file_size * worst_case_per_input_byte + 1;
1287       if (file_size != worst_case / worst_case_per_input_byte
1288           || size_bound - size <= worst_case)
1289         return size_bound;
1290       size += worst_case;
1291     }
1292
1293   return size;
1294 }
1295
1296 /* Initialize BUF.  Reserve LINE_BYTES bytes for each line; LINE_BYTES
1297    must be at least sizeof (struct line).  Allocate ALLOC bytes
1298    initially.  */
1299
1300 static void
1301 initbuf (struct buffer *buf, size_t line_bytes, size_t alloc)
1302 {
1303   /* Ensure that the line array is properly aligned.  If the desired
1304      size cannot be allocated, repeatedly halve it until allocation
1305      succeeds.  The smaller allocation may hurt overall performance,
1306      but that's better than failing.  */
1307   for (;;)
1308     {
1309       alloc += sizeof (struct line) - alloc % sizeof (struct line);
1310       buf->buf = malloc (alloc);
1311       if (buf->buf)
1312         break;
1313       alloc /= 2;
1314       if (alloc <= line_bytes + 1)
1315         xalloc_die ();
1316     }
1317
1318   buf->line_bytes = line_bytes;
1319   buf->alloc = alloc;
1320   buf->used = buf->left = buf->nlines = 0;
1321   buf->eof = false;
1322 }
1323
1324 /* Return one past the limit of the line array.  */
1325
1326 static inline struct line *
1327 buffer_linelim (struct buffer const *buf)
1328 {
1329   return (struct line *) (buf->buf + buf->alloc);
1330 }
1331
1332 /* Return a pointer to the first character of the field specified
1333    by KEY in LINE. */
1334
1335 static char *
1336 begfield (const struct line *line, const struct keyfield *key)
1337 {
1338   char *ptr = line->text, *lim = ptr + line->length - 1;
1339   size_t sword = key->sword;
1340   size_t schar = key->schar;
1341   size_t remaining_bytes;
1342
1343   /* The leading field separator itself is included in a field when -t
1344      is absent.  */
1345
1346   if (tab != TAB_DEFAULT)
1347     while (ptr < lim && sword--)
1348       {
1349         while (ptr < lim && *ptr != tab)
1350           ++ptr;
1351         if (ptr < lim)
1352           ++ptr;
1353       }
1354   else
1355     while (ptr < lim && sword--)
1356       {
1357         while (ptr < lim && blanks[to_uchar (*ptr)])
1358           ++ptr;
1359         while (ptr < lim && !blanks[to_uchar (*ptr)])
1360           ++ptr;
1361       }
1362
1363   if (key->skipsblanks)
1364     while (ptr < lim && blanks[to_uchar (*ptr)])
1365       ++ptr;
1366
1367   /* Advance PTR by SCHAR (if possible), but no further than LIM.  */
1368   remaining_bytes = lim - ptr;
1369   if (schar < remaining_bytes)
1370     ptr += schar;
1371   else
1372     ptr = lim;
1373
1374   return ptr;
1375 }
1376
1377 /* Return the limit of (a pointer to the first character after) the field
1378    in LINE specified by KEY. */
1379
1380 static char *
1381 limfield (const struct line *line, const struct keyfield *key)
1382 {
1383   char *ptr = line->text, *lim = ptr + line->length - 1;
1384   size_t eword = key->eword, echar = key->echar;
1385   size_t remaining_bytes;
1386
1387   /* Move PTR past EWORD fields or to one past the last byte on LINE,
1388      whichever comes first.  If there are more than EWORD fields, leave
1389      PTR pointing at the beginning of the field having zero-based index,
1390      EWORD.  If a delimiter character was specified (via -t), then that
1391      `beginning' is the first character following the delimiting TAB.
1392      Otherwise, leave PTR pointing at the first `blank' character after
1393      the preceding field.  */
1394   if (tab != TAB_DEFAULT)
1395     while (ptr < lim && eword--)
1396       {
1397         while (ptr < lim && *ptr != tab)
1398           ++ptr;
1399         if (ptr < lim && (eword | echar))
1400           ++ptr;
1401       }
1402   else
1403     while (ptr < lim && eword--)
1404       {
1405         while (ptr < lim && blanks[to_uchar (*ptr)])
1406           ++ptr;
1407         while (ptr < lim && !blanks[to_uchar (*ptr)])
1408           ++ptr;
1409       }
1410
1411 #ifdef POSIX_UNSPECIFIED
1412   /* The following block of code makes GNU sort incompatible with
1413      standard Unix sort, so it's ifdef'd out for now.
1414      The POSIX spec isn't clear on how to interpret this.
1415      FIXME: request clarification.
1416
1417      From: kwzh@gnu.ai.mit.edu (Karl Heuer)
1418      Date: Thu, 30 May 96 12:20:41 -0400
1419      [Translated to POSIX 1003.1-2001 terminology by Paul Eggert.]
1420
1421      [...]I believe I've found another bug in `sort'.
1422
1423      $ cat /tmp/sort.in
1424      a b c 2 d
1425      pq rs 1 t
1426      $ textutils-1.15/src/sort -k1.7,1.7 </tmp/sort.in
1427      a b c 2 d
1428      pq rs 1 t
1429      $ /bin/sort -k1.7,1.7 </tmp/sort.in
1430      pq rs 1 t
1431      a b c 2 d
1432
1433      Unix sort produced the answer I expected: sort on the single character
1434      in column 7.  GNU sort produced different results, because it disagrees
1435      on the interpretation of the key-end spec "M.N".  Unix sort reads this
1436      as "skip M-1 fields, then N-1 characters"; but GNU sort wants it to mean
1437      "skip M-1 fields, then either N-1 characters or the rest of the current
1438      field, whichever comes first".  This extra clause applies only to
1439      key-ends, not key-starts.
1440      */
1441
1442   /* Make LIM point to the end of (one byte past) the current field.  */
1443   if (tab != TAB_DEFAULT)
1444     {
1445       char *newlim;
1446       newlim = memchr (ptr, tab, lim - ptr);
1447       if (newlim)
1448         lim = newlim;
1449     }
1450   else
1451     {
1452       char *newlim;
1453       newlim = ptr;
1454       while (newlim < lim && blanks[to_uchar (*newlim)])
1455         ++newlim;
1456       while (newlim < lim && !blanks[to_uchar (*newlim)])
1457         ++newlim;
1458       lim = newlim;
1459     }
1460 #endif
1461
1462   /* If we're ignoring leading blanks when computing the End
1463      of the field, don't start counting bytes until after skipping
1464      past any leading blanks. */
1465   if (key->skipeblanks)
1466     while (ptr < lim && blanks[to_uchar (*ptr)])
1467       ++ptr;
1468
1469   /* Advance PTR by ECHAR (if possible), but no further than LIM.  */
1470   remaining_bytes = lim - ptr;
1471   if (echar < remaining_bytes)
1472     ptr += echar;
1473   else
1474     ptr = lim;
1475
1476   return ptr;
1477 }
1478
1479 /* Fill BUF reading from FP, moving buf->left bytes from the end
1480    of buf->buf to the beginning first.  If EOF is reached and the
1481    file wasn't terminated by a newline, supply one.  Set up BUF's line
1482    table too.  FILE is the name of the file corresponding to FP.
1483    Return true if some input was read.  */
1484
1485 static bool
1486 fillbuf (struct buffer *buf, FILE *fp, char const *file)
1487 {
1488   struct keyfield const *key = keylist;
1489   char eol = eolchar;
1490   size_t line_bytes = buf->line_bytes;
1491   size_t mergesize = merge_buffer_size - MIN_MERGE_BUFFER_SIZE;
1492
1493   if (buf->eof)
1494     return false;
1495
1496   if (buf->used != buf->left)
1497     {
1498       memmove (buf->buf, buf->buf + buf->used - buf->left, buf->left);
1499       buf->used = buf->left;
1500       buf->nlines = 0;
1501     }
1502
1503   for (;;)
1504     {
1505       char *ptr = buf->buf + buf->used;
1506       struct line *linelim = buffer_linelim (buf);
1507       struct line *line = linelim - buf->nlines;
1508       size_t avail = (char *) linelim - buf->nlines * line_bytes - ptr;
1509       char *line_start = buf->nlines ? line->text + line->length : buf->buf;
1510
1511       while (line_bytes + 1 < avail)
1512         {
1513           /* Read as many bytes as possible, but do not read so many
1514              bytes that there might not be enough room for the
1515              corresponding line array.  The worst case is when the
1516              rest of the input file consists entirely of newlines,
1517              except that the last byte is not a newline.  */
1518           size_t readsize = (avail - 1) / (line_bytes + 1);
1519           size_t bytes_read = fread (ptr, 1, readsize, fp);
1520           char *ptrlim = ptr + bytes_read;
1521           char *p;
1522           avail -= bytes_read;
1523
1524           if (bytes_read != readsize)
1525             {
1526               if (ferror (fp))
1527                 die (_("read failed"), file);
1528               if (feof (fp))
1529                 {
1530                   buf->eof = true;
1531                   if (buf->buf == ptrlim)
1532                     return false;
1533                   if (ptrlim[-1] != eol)
1534                     *ptrlim++ = eol;
1535                 }
1536             }
1537
1538           /* Find and record each line in the just-read input.  */
1539           while ((p = memchr (ptr, eol, ptrlim - ptr)))
1540             {
1541               ptr = p + 1;
1542               line--;
1543               line->text = line_start;
1544               line->length = ptr - line_start;
1545               mergesize = MAX (mergesize, line->length);
1546               avail -= line_bytes;
1547
1548               if (key)
1549                 {
1550                   /* Precompute the position of the first key for
1551                      efficiency.  */
1552                   line->keylim = (key->eword == SIZE_MAX
1553                                   ? p
1554                                   : limfield (line, key));
1555
1556                   if (key->sword != SIZE_MAX)
1557                     line->keybeg = begfield (line, key);
1558                   else
1559                     {
1560                       if (key->skipsblanks)
1561                         while (blanks[to_uchar (*line_start)])
1562                           line_start++;
1563                       line->keybeg = line_start;
1564                     }
1565                 }
1566
1567               line_start = ptr;
1568             }
1569
1570           ptr = ptrlim;
1571           if (buf->eof)
1572             break;
1573         }
1574
1575       buf->used = ptr - buf->buf;
1576       buf->nlines = buffer_linelim (buf) - line;
1577       if (buf->nlines != 0)
1578         {
1579           buf->left = ptr - line_start;
1580           merge_buffer_size = mergesize + MIN_MERGE_BUFFER_SIZE;
1581           return true;
1582         }
1583
1584       {
1585         /* The current input line is too long to fit in the buffer.
1586            Double the buffer size and try again, keeping it properly
1587            aligned.  */
1588         size_t line_alloc = buf->alloc / sizeof (struct line);
1589         buf->buf = x2nrealloc (buf->buf, &line_alloc, sizeof (struct line));
1590         buf->alloc = line_alloc * sizeof (struct line);
1591       }
1592     }
1593 }
1594
1595 /* Compare strings A and B as numbers without explicitly converting them to
1596    machine numbers.  Comparatively slow for short strings, but asymptotically
1597    hideously fast. */
1598
1599 static int
1600 numcompare (const char *a, const char *b)
1601 {
1602   while (blanks[to_uchar (*a)])
1603     a++;
1604   while (blanks[to_uchar (*b)])
1605     b++;
1606
1607   return strnumcmp (a, b, decimal_point, thousands_sep);
1608 }
1609
1610 static int
1611 general_numcompare (const char *sa, const char *sb)
1612 {
1613   /* FIXME: add option to warn about failed conversions.  */
1614   /* FIXME: maybe add option to try expensive FP conversion
1615      only if A and B can't be compared more cheaply/accurately.  */
1616
1617   char *ea;
1618   char *eb;
1619   double a = strtod (sa, &ea);
1620   double b = strtod (sb, &eb);
1621
1622   /* Put conversion errors at the start of the collating sequence.  */
1623   if (sa == ea)
1624     return sb == eb ? 0 : -1;
1625   if (sb == eb)
1626     return 1;
1627
1628   /* Sort numbers in the usual way, where -0 == +0.  Put NaNs after
1629      conversion errors but before numbers; sort them by internal
1630      bit-pattern, for lack of a more portable alternative.  */
1631   return (a < b ? -1
1632           : a > b ? 1
1633           : a == b ? 0
1634           : b == b ? -1
1635           : a == a ? 1
1636           : memcmp ((char *) &a, (char *) &b, sizeof a));
1637 }
1638
1639 /* Return an integer in 1..12 of the month name MONTH with length LEN.
1640    Return 0 if the name in S is not recognized.  */
1641
1642 static int
1643 getmonth (char const *month, size_t len)
1644 {
1645   size_t lo = 0;
1646   size_t hi = MONTHS_PER_YEAR;
1647   char const *monthlim = month + len;
1648
1649   for (;;)
1650     {
1651       if (month == monthlim)
1652         return 0;
1653       if (!blanks[to_uchar (*month)])
1654         break;
1655       ++month;
1656     }
1657
1658   do
1659     {
1660       size_t ix = (lo + hi) / 2;
1661       char const *m = month;
1662       char const *n = monthtab[ix].name;
1663
1664       for (;; m++, n++)
1665         {
1666           if (!*n)
1667             return monthtab[ix].val;
1668           if (m == monthlim || fold_toupper[to_uchar (*m)] < to_uchar (*n))
1669             {
1670               hi = ix;
1671               break;
1672             }
1673           else if (fold_toupper[to_uchar (*m)] > to_uchar (*n))
1674             {
1675               lo = ix + 1;
1676               break;
1677             }
1678         }
1679     }
1680   while (lo < hi);
1681
1682   return 0;
1683 }
1684
1685 /* A source of random data.  */
1686 static struct randread_source *randread_source;
1687
1688 /* Return the Ith randomly-generated state.  The caller must invoke
1689    random_state (H) for all H less than I before invoking random_state
1690    (I).  */
1691
1692 static struct md5_ctx
1693 random_state (size_t i)
1694 {
1695   /* An array of states resulting from the random data, and counts of
1696      its used and allocated members.  */
1697   static struct md5_ctx *state;
1698   static size_t used;
1699   static size_t allocated;
1700
1701   struct md5_ctx *s = &state[i];
1702
1703   if (used <= i)
1704     {
1705       unsigned char buf[MD5_DIGEST_SIZE];
1706
1707       used++;
1708
1709       if (allocated <= i)
1710         {
1711           state = X2NREALLOC (state, &allocated);
1712           s = &state[i];
1713         }
1714
1715       randread (randread_source, buf, sizeof buf);
1716       md5_init_ctx (s);
1717       md5_process_bytes (buf, sizeof buf, s);
1718     }
1719
1720   return *s;
1721 }
1722
1723 /* Compare the hashes of TEXTA with length LENGTHA to those of TEXTB
1724    with length LENGTHB.  Return negative if less, zero if equal,
1725    positive if greater.  */
1726
1727 static int
1728 cmp_hashes (char const *texta, size_t lena,
1729             char const *textb, size_t lenb)
1730 {
1731   /* Try random hashes until a pair of hashes disagree.  But if the
1732      first pair of random hashes agree, check whether the keys are
1733      identical and if so report no difference.  */
1734   int diff;
1735   size_t i;
1736   for (i = 0; ; i++)
1737     {
1738       uint32_t dig[2][MD5_DIGEST_SIZE / sizeof (uint32_t)];
1739       struct md5_ctx s[2];
1740       s[0] = s[1] = random_state (i);
1741       md5_process_bytes (texta, lena, &s[0]);  md5_finish_ctx (&s[0], dig[0]);
1742       md5_process_bytes (textb, lenb, &s[1]);  md5_finish_ctx (&s[1], dig[1]);
1743       diff = memcmp (dig[0], dig[1], sizeof dig[0]);
1744       if (diff != 0)
1745         break;
1746       if (i == 0 && lena == lenb && memcmp (texta, textb, lena) == 0)
1747         break;
1748     }
1749
1750   return diff;
1751 }
1752
1753 /* Compare the keys TEXTA (of length LENA) and TEXTB (of length LENB)
1754    using one or more random hash functions.  */
1755
1756 static int
1757 compare_random (char *restrict texta, size_t lena,
1758                 char *restrict textb, size_t lenb)
1759 {
1760   int diff;
1761
1762   if (! hard_LC_COLLATE)
1763     diff = cmp_hashes (texta, lena, textb, lenb);
1764   else
1765     {
1766       /* Transform the text into the basis of comparison, so that byte
1767          strings that would otherwise considered to be equal are
1768          considered equal here even if their bytes differ.  */
1769
1770       char *buf = NULL;
1771       char stackbuf[4000];
1772       size_t tlena = xmemxfrm (stackbuf, sizeof stackbuf, texta, lena);
1773       bool a_fits = tlena <= sizeof stackbuf;
1774       size_t tlenb = xmemxfrm ((a_fits ? stackbuf + tlena : NULL),
1775                                (a_fits ? sizeof stackbuf - tlena : 0),
1776                                textb, lenb);
1777
1778       if (a_fits && tlena + tlenb <= sizeof stackbuf)
1779         buf = stackbuf;
1780       else
1781         {
1782           /* Adding 1 to the buffer size lets xmemxfrm run a bit
1783              faster by avoiding the need for an extra buffer copy.  */
1784           buf = xmalloc (tlena + tlenb + 1);
1785           xmemxfrm (buf, tlena + 1, texta, lena);
1786           xmemxfrm (buf + tlena, tlenb + 1, textb, lenb);
1787         }
1788
1789       diff = cmp_hashes (buf, tlena, buf + tlena, tlenb);
1790
1791       if (buf != stackbuf)
1792         free (buf);
1793     }
1794
1795   return diff;
1796 }
1797
1798 /* Compare two lines A and B trying every key in sequence until there
1799    are no more keys or a difference is found. */
1800
1801 static int
1802 keycompare (const struct line *a, const struct line *b)
1803 {
1804   struct keyfield const *key = keylist;
1805
1806   /* For the first iteration only, the key positions have been
1807      precomputed for us. */
1808   char *texta = a->keybeg;
1809   char *textb = b->keybeg;
1810   char *lima = a->keylim;
1811   char *limb = b->keylim;
1812
1813   int diff;
1814
1815   for (;;)
1816     {
1817       char const *translate = key->translate;
1818       bool const *ignore = key->ignore;
1819
1820       /* Find the lengths. */
1821       size_t lena = lima <= texta ? 0 : lima - texta;
1822       size_t lenb = limb <= textb ? 0 : limb - textb;
1823
1824       /* Actually compare the fields. */
1825
1826       if (key->random)
1827         diff = compare_random (texta, lena, textb, lenb);
1828       else if (key->numeric | key->general_numeric)
1829         {
1830           char savea = *lima, saveb = *limb;
1831
1832           *lima = *limb = '\0';
1833           diff = ((key->numeric ? numcompare : general_numcompare)
1834                   (texta, textb));
1835           *lima = savea, *limb = saveb;
1836         }
1837       else if (key->month)
1838         diff = getmonth (texta, lena) - getmonth (textb, lenb);
1839       /* Sorting like this may become slow, so in a simple locale the user
1840          can select a faster sort that is similar to ascii sort.  */
1841       else if (hard_LC_COLLATE)
1842         {
1843           if (ignore || translate)
1844             {
1845               char buf[4000];
1846               size_t size = lena + 1 + lenb + 1;
1847               char *copy_a = (size <= sizeof buf ? buf : xmalloc (size));
1848               char *copy_b = copy_a + lena + 1;
1849               size_t new_len_a, new_len_b, i;
1850
1851               /* Ignore and/or translate chars before comparing.  */
1852               for (new_len_a = new_len_b = i = 0; i < MAX (lena, lenb); i++)
1853                 {
1854                   if (i < lena)
1855                     {
1856                       copy_a[new_len_a] = (translate
1857                                            ? translate[to_uchar (texta[i])]
1858                                            : texta[i]);
1859                       if (!ignore || !ignore[to_uchar (texta[i])])
1860                         ++new_len_a;
1861                     }
1862                   if (i < lenb)
1863                     {
1864                       copy_b[new_len_b] = (translate
1865                                            ? translate[to_uchar (textb[i])]
1866                                            : textb [i]);
1867                       if (!ignore || !ignore[to_uchar (textb[i])])
1868                         ++new_len_b;
1869                     }
1870                 }
1871
1872               diff = xmemcoll (copy_a, new_len_a, copy_b, new_len_b);
1873
1874               if (sizeof buf < size)
1875                 free (copy_a);
1876             }
1877           else if (lena == 0)
1878             diff = - NONZERO (lenb);
1879           else if (lenb == 0)
1880             goto greater;
1881           else
1882             diff = xmemcoll (texta, lena, textb, lenb);
1883         }
1884       else if (ignore)
1885         {
1886 #define CMP_WITH_IGNORE(A, B)                                           \
1887   do                                                                    \
1888     {                                                                   \
1889           for (;;)                                                      \
1890             {                                                           \
1891               while (texta < lima && ignore[to_uchar (*texta)])         \
1892                 ++texta;                                                \
1893               while (textb < limb && ignore[to_uchar (*textb)])         \
1894                 ++textb;                                                \
1895               if (! (texta < lima && textb < limb))                     \
1896                 break;                                                  \
1897               diff = to_uchar (A) - to_uchar (B);                       \
1898               if (diff)                                                 \
1899                 goto not_equal;                                         \
1900               ++texta;                                                  \
1901               ++textb;                                                  \
1902             }                                                           \
1903                                                                         \
1904           diff = (texta < lima) - (textb < limb);                       \
1905     }                                                                   \
1906   while (0)
1907
1908           if (translate)
1909             CMP_WITH_IGNORE (translate[to_uchar (*texta)],
1910                              translate[to_uchar (*textb)]);
1911           else
1912             CMP_WITH_IGNORE (*texta, *textb);
1913         }
1914       else if (lena == 0)
1915         diff = - NONZERO (lenb);
1916       else if (lenb == 0)
1917         goto greater;
1918       else
1919         {
1920           if (translate)
1921             {
1922               while (texta < lima && textb < limb)
1923                 {
1924                   diff = (to_uchar (translate[to_uchar (*texta++)])
1925                           - to_uchar (translate[to_uchar (*textb++)]));
1926                   if (diff)
1927                     goto not_equal;
1928                 }
1929             }
1930           else
1931             {
1932               diff = memcmp (texta, textb, MIN (lena, lenb));
1933               if (diff)
1934                 goto not_equal;
1935             }
1936           diff = lena < lenb ? -1 : lena != lenb;
1937         }
1938
1939       if (diff)
1940         goto not_equal;
1941
1942       key = key->next;
1943       if (! key)
1944         break;
1945
1946       /* Find the beginning and limit of the next field.  */
1947       if (key->eword != SIZE_MAX)
1948         lima = limfield (a, key), limb = limfield (b, key);
1949       else
1950         lima = a->text + a->length - 1, limb = b->text + b->length - 1;
1951
1952       if (key->sword != SIZE_MAX)
1953         texta = begfield (a, key), textb = begfield (b, key);
1954       else
1955         {
1956           texta = a->text, textb = b->text;
1957           if (key->skipsblanks)
1958             {
1959               while (texta < lima && blanks[to_uchar (*texta)])
1960                 ++texta;
1961               while (textb < limb && blanks[to_uchar (*textb)])
1962                 ++textb;
1963             }
1964         }
1965     }
1966
1967   return 0;
1968
1969  greater:
1970   diff = 1;
1971  not_equal:
1972   return key->reverse ? -diff : diff;
1973 }
1974
1975 /* Compare two lines A and B, returning negative, zero, or positive
1976    depending on whether A compares less than, equal to, or greater than B. */
1977
1978 static int
1979 compare (const struct line *a, const struct line *b)
1980 {
1981   int diff;
1982   size_t alen, blen;
1983
1984   /* First try to compare on the specified keys (if any).
1985      The only two cases with no key at all are unadorned sort,
1986      and unadorned sort -r. */
1987   if (keylist)
1988     {
1989       diff = keycompare (a, b);
1990       if (diff | unique | stable)
1991         return diff;
1992     }
1993
1994   /* If the keys all compare equal (or no keys were specified)
1995      fall through to the default comparison.  */
1996   alen = a->length - 1, blen = b->length - 1;
1997
1998   if (alen == 0)
1999     diff = - NONZERO (blen);
2000   else if (blen == 0)
2001     diff = 1;
2002   else if (hard_LC_COLLATE)
2003     diff = xmemcoll (a->text, alen, b->text, blen);
2004   else if (! (diff = memcmp (a->text, b->text, MIN (alen, blen))))
2005     diff = alen < blen ? -1 : alen != blen;
2006
2007   return reverse ? -diff : diff;
2008 }
2009
2010 /* Check that the lines read from FILE_NAME come in order.  Return
2011    true if they are in order.  If CHECKONLY == 'c', also print a
2012    diagnostic (FILE_NAME, line number, contents of line) to stderr if
2013    they are not in order.  */
2014
2015 static bool
2016 check (char const *file_name, char checkonly)
2017 {
2018   FILE *fp = xfopen (file_name, "r");
2019   struct buffer buf;            /* Input buffer. */
2020   struct line temp;             /* Copy of previous line. */
2021   size_t alloc = 0;
2022   uintmax_t line_number = 0;
2023   struct keyfield const *key = keylist;
2024   bool nonunique = ! unique;
2025   bool ordered = true;
2026
2027   initbuf (&buf, sizeof (struct line),
2028            MAX (merge_buffer_size, sort_size));
2029   temp.text = NULL;
2030
2031   while (fillbuf (&buf, fp, file_name))
2032     {
2033       struct line const *line = buffer_linelim (&buf);
2034       struct line const *linebase = line - buf.nlines;
2035
2036       /* Make sure the line saved from the old buffer contents is
2037          less than or equal to the first line of the new buffer. */
2038       if (alloc && nonunique <= compare (&temp, line - 1))
2039         {
2040         found_disorder:
2041           {
2042             if (checkonly == 'c')
2043               {
2044                 struct line const *disorder_line = line - 1;
2045                 uintmax_t disorder_line_number =
2046                   buffer_linelim (&buf) - disorder_line + line_number;
2047                 char hr_buf[INT_BUFSIZE_BOUND (uintmax_t)];
2048                 fprintf (stderr, _("%s: %s:%s: disorder: "),
2049                          program_name, file_name,
2050                          umaxtostr (disorder_line_number, hr_buf));
2051                 write_bytes (disorder_line->text, disorder_line->length,
2052                              stderr, _("standard error"));
2053               }
2054
2055             ordered = false;
2056             break;
2057           }
2058         }
2059
2060       /* Compare each line in the buffer with its successor.  */
2061       while (linebase < --line)
2062         if (nonunique <= compare (line, line - 1))
2063           goto found_disorder;
2064
2065       line_number += buf.nlines;
2066
2067       /* Save the last line of the buffer.  */
2068       if (alloc < line->length)
2069         {
2070           do
2071             {
2072               alloc *= 2;
2073               if (! alloc)
2074                 {
2075                   alloc = line->length;
2076                   break;
2077                 }
2078             }
2079           while (alloc < line->length);
2080
2081           temp.text = xrealloc (temp.text, alloc);
2082         }
2083       memcpy (temp.text, line->text, line->length);
2084       temp.length = line->length;
2085       if (key)
2086         {
2087           temp.keybeg = temp.text + (line->keybeg - line->text);
2088           temp.keylim = temp.text + (line->keylim - line->text);
2089         }
2090     }
2091
2092   xfclose (fp, file_name);
2093   free (buf.buf);
2094   free (temp.text);
2095   return ordered;
2096 }
2097
2098 /* Merge lines from FILES onto OFP.  NTEMPS is the number of temporary
2099    files (all of which are at the start of the FILES array), and
2100    NFILES is the number of files; 0 <= NTEMPS <= NFILES <= NMERGE.
2101    Close input and output files before returning.
2102    OUTPUT_FILE gives the name of the output file.  If it is NULL,
2103    the output file is standard output.  If OFP is NULL, the output
2104    file has not been opened yet (or written to, if standard output).  */
2105
2106 static void
2107 mergefps (struct sortfile *files, size_t ntemps, size_t nfiles,
2108           FILE *ofp, char const *output_file)
2109 {
2110   FILE **fps = xnmalloc (nmerge, sizeof *fps);
2111                                 /* Input streams for each file.  */
2112   struct buffer *buffer = xnmalloc (nmerge, sizeof *buffer);
2113                                 /* Input buffers for each file. */
2114   struct line saved;            /* Saved line storage for unique check. */
2115   struct line const *savedline = NULL;
2116                                 /* &saved if there is a saved line. */
2117   size_t savealloc = 0;         /* Size allocated for the saved line. */
2118   struct line const **cur = xnmalloc (nmerge, sizeof *cur);
2119                                 /* Current line in each line table. */
2120   struct line const **base = xnmalloc (nmerge, sizeof *base);
2121                                 /* Base of each line table.  */
2122   size_t *ord = xnmalloc (nmerge, sizeof *ord);
2123                                 /* Table representing a permutation of fps,
2124                                    such that cur[ord[0]] is the smallest line
2125                                    and will be next output. */
2126   size_t i;
2127   size_t j;
2128   size_t t;
2129   struct keyfield const *key = keylist;
2130   saved.text = NULL;
2131
2132   /* Read initial lines from each input file. */
2133   for (i = 0; i < nfiles; )
2134     {
2135       fps[i] = (files[i].pid
2136                 ? open_temp (files[i].name, files[i].pid)
2137                 : xfopen (files[i].name, "r"));
2138       initbuf (&buffer[i], sizeof (struct line),
2139                MAX (merge_buffer_size, sort_size / nfiles));
2140       if (fillbuf (&buffer[i], fps[i], files[i].name))
2141         {
2142           struct line const *linelim = buffer_linelim (&buffer[i]);
2143           cur[i] = linelim - 1;
2144           base[i] = linelim - buffer[i].nlines;
2145           i++;
2146         }
2147       else
2148         {
2149           /* fps[i] is empty; eliminate it from future consideration.  */
2150           xfclose (fps[i], files[i].name);
2151           if (i < ntemps)
2152             {
2153               ntemps--;
2154               zaptemp (files[i].name);
2155             }
2156           free (buffer[i].buf);
2157           --nfiles;
2158           for (j = i; j < nfiles; ++j)
2159             files[j] = files[j + 1];
2160         }
2161     }
2162
2163   if (! ofp)
2164     ofp = xfopen (output_file, "w");
2165
2166   /* Set up the ord table according to comparisons among input lines.
2167      Since this only reorders two items if one is strictly greater than
2168      the other, it is stable. */
2169   for (i = 0; i < nfiles; ++i)
2170     ord[i] = i;
2171   for (i = 1; i < nfiles; ++i)
2172     if (0 < compare (cur[ord[i - 1]], cur[ord[i]]))
2173       t = ord[i - 1], ord[i - 1] = ord[i], ord[i] = t, i = 0;
2174
2175   /* Repeatedly output the smallest line until no input remains. */
2176   while (nfiles)
2177     {
2178       struct line const *smallest = cur[ord[0]];
2179
2180       /* If uniquified output is turned on, output only the first of
2181          an identical series of lines. */
2182       if (unique)
2183         {
2184           if (savedline && compare (savedline, smallest))
2185             {
2186               savedline = NULL;
2187               write_bytes (saved.text, saved.length, ofp, output_file);
2188             }
2189           if (!savedline)
2190             {
2191               savedline = &saved;
2192               if (savealloc < smallest->length)
2193                 {
2194                   do
2195                     if (! savealloc)
2196                       {
2197                         savealloc = smallest->length;
2198                         break;
2199                       }
2200                   while ((savealloc *= 2) < smallest->length);
2201
2202                   saved.text = xrealloc (saved.text, savealloc);
2203                 }
2204               saved.length = smallest->length;
2205               memcpy (saved.text, smallest->text, saved.length);
2206               if (key)
2207                 {
2208                   saved.keybeg =
2209                     saved.text + (smallest->keybeg - smallest->text);
2210                   saved.keylim =
2211                     saved.text + (smallest->keylim - smallest->text);
2212                 }
2213             }
2214         }
2215       else
2216         write_bytes (smallest->text, smallest->length, ofp, output_file);
2217
2218       /* Check if we need to read more lines into core. */
2219       if (base[ord[0]] < smallest)
2220         cur[ord[0]] = smallest - 1;
2221       else
2222         {
2223           if (fillbuf (&buffer[ord[0]], fps[ord[0]], files[ord[0]].name))
2224             {
2225               struct line const *linelim = buffer_linelim (&buffer[ord[0]]);
2226               cur[ord[0]] = linelim - 1;
2227               base[ord[0]] = linelim - buffer[ord[0]].nlines;
2228             }
2229           else
2230             {
2231               /* We reached EOF on fps[ord[0]].  */
2232               for (i = 1; i < nfiles; ++i)
2233                 if (ord[i] > ord[0])
2234                   --ord[i];
2235               --nfiles;
2236               xfclose (fps[ord[0]], files[ord[0]].name);
2237               if (ord[0] < ntemps)
2238                 {
2239                   ntemps--;
2240                   zaptemp (files[ord[0]].name);
2241                 }
2242               free (buffer[ord[0]].buf);
2243               for (i = ord[0]; i < nfiles; ++i)
2244                 {
2245                   fps[i] = fps[i + 1];
2246                   files[i] = files[i + 1];
2247                   buffer[i] = buffer[i + 1];
2248                   cur[i] = cur[i + 1];
2249                   base[i] = base[i + 1];
2250                 }
2251               for (i = 0; i < nfiles; ++i)
2252                 ord[i] = ord[i + 1];
2253               continue;
2254             }
2255         }
2256
2257       /* The new line just read in may be larger than other lines
2258          already in main memory; push it back in the queue until we
2259          encounter a line larger than it.  Optimize for the common
2260          case where the new line is smallest.  */
2261       {
2262         size_t lo = 1;
2263         size_t hi = nfiles;
2264         size_t probe = lo;
2265         size_t ord0 = ord[0];
2266         size_t count_of_smaller_lines;
2267
2268         while (lo < hi)
2269           {
2270             int cmp = compare (cur[ord0], cur[ord[probe]]);
2271             if (cmp < 0 || (cmp == 0 && ord0 < ord[probe]))
2272               hi = probe;
2273             else
2274               lo = probe + 1;
2275             probe = (lo + hi) / 2;
2276           }
2277
2278         count_of_smaller_lines = lo - 1;
2279         for (j = 0; j < count_of_smaller_lines; j++)
2280           ord[j] = ord[j + 1];
2281         ord[count_of_smaller_lines] = ord0;
2282       }
2283
2284       /* Free up some resources every once in a while.  */
2285       if (MAX_PROCS_BEFORE_REAP < nprocs)
2286         reap_some ();
2287     }
2288
2289   if (unique && savedline)
2290     {
2291       write_bytes (saved.text, saved.length, ofp, output_file);
2292       free (saved.text);
2293     }
2294
2295   xfclose (ofp, output_file);
2296   free(fps);
2297   free(buffer);
2298   free(ord);
2299   free(base);
2300   free(cur);
2301 }
2302
2303 /* Merge into T the two sorted arrays of lines LO (with NLO members)
2304    and HI (with NHI members).  T, LO, and HI point just past their
2305    respective arrays, and the arrays are in reverse order.  NLO and
2306    NHI must be positive, and HI - NHI must equal T - (NLO + NHI).  */
2307
2308 static inline void
2309 mergelines (struct line *t,
2310             struct line const *lo, size_t nlo,
2311             struct line const *hi, size_t nhi)
2312 {
2313   for (;;)
2314     if (compare (lo - 1, hi - 1) <= 0)
2315       {
2316         *--t = *--lo;
2317         if (! --nlo)
2318           {
2319             /* HI - NHI equalled T - (NLO + NHI) when this function
2320                began.  Therefore HI must equal T now, and there is no
2321                need to copy from HI to T.  */
2322             return;
2323           }
2324       }
2325     else
2326       {
2327         *--t = *--hi;
2328         if (! --nhi)
2329           {
2330             do
2331               *--t = *--lo;
2332             while (--nlo);
2333
2334             return;
2335           }
2336       }
2337 }
2338
2339 /* Sort the array LINES with NLINES members, using TEMP for temporary space.
2340    NLINES must be at least 2.
2341    The input and output arrays are in reverse order, and LINES and
2342    TEMP point just past the end of their respective arrays.
2343
2344    Use a recursive divide-and-conquer algorithm, in the style
2345    suggested by Knuth volume 3 (2nd edition), exercise 5.2.4-23.  Use
2346    the optimization suggested by exercise 5.2.4-10; this requires room
2347    for only 1.5*N lines, rather than the usual 2*N lines.  Knuth
2348    writes that this memory optimization was originally published by
2349    D. A. Bell, Comp J. 1 (1958), 75.  */
2350
2351 static void
2352 sortlines (struct line *lines, size_t nlines, struct line *temp)
2353 {
2354   if (nlines == 2)
2355     {
2356       if (0 < compare (&lines[-1], &lines[-2]))
2357         {
2358           struct line tmp = lines[-1];
2359           lines[-1] = lines[-2];
2360           lines[-2] = tmp;
2361         }
2362     }
2363   else
2364     {
2365       size_t nlo = nlines / 2;
2366       size_t nhi = nlines - nlo;
2367       struct line *lo = lines;
2368       struct line *hi = lines - nlo;
2369       struct line *sorted_lo = temp;
2370
2371       sortlines (hi, nhi, temp);
2372       if (1 < nlo)
2373         sortlines_temp (lo, nlo, sorted_lo);
2374       else
2375         sorted_lo[-1] = lo[-1];
2376
2377       mergelines (lines, sorted_lo, nlo, hi, nhi);
2378     }
2379 }
2380
2381 /* Like sortlines (LINES, NLINES, TEMP), except output into TEMP
2382    rather than sorting in place.  */
2383
2384 static void
2385 sortlines_temp (struct line *lines, size_t nlines, struct line *temp)
2386 {
2387   if (nlines == 2)
2388     {
2389       /* Declare `swap' as int, not bool, to work around a bug
2390          <http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html>
2391          in the IBM xlc 6.0.0.0 compiler in 64-bit mode.  */
2392       int swap = (0 < compare (&lines[-1], &lines[-2]));
2393       temp[-1] = lines[-1 - swap];
2394       temp[-2] = lines[-2 + swap];
2395     }
2396   else
2397     {
2398       size_t nlo = nlines / 2;
2399       size_t nhi = nlines - nlo;
2400       struct line *lo = lines;
2401       struct line *hi = lines - nlo;
2402       struct line *sorted_hi = temp - nlo;
2403
2404       sortlines_temp (hi, nhi, sorted_hi);
2405       if (1 < nlo)
2406         sortlines (lo, nlo, temp);
2407
2408       mergelines (temp, lo, nlo, sorted_hi, nhi);
2409     }
2410 }
2411
2412 /* Scan through FILES[NTEMPS .. NFILES-1] looking for a file that is
2413    the same as OUTFILE.  If found, merge the found instances (and perhaps
2414    some other files) into a temporary file so that it can in turn be
2415    merged into OUTFILE without destroying OUTFILE before it is completely
2416    read.  Return the new value of NFILES, which differs from the old if
2417    some merging occurred.
2418
2419    This test ensures that an otherwise-erroneous use like
2420    "sort -m -o FILE ... FILE ..." copies FILE before writing to it.
2421    It's not clear that POSIX requires this nicety.
2422    Detect common error cases, but don't try to catch obscure cases like
2423    "cat ... FILE ... | sort -m -o FILE"
2424    where traditional "sort" doesn't copy the input and where
2425    people should know that they're getting into trouble anyway.
2426    Catching these obscure cases would slow down performance in
2427    common cases.  */
2428
2429 static size_t
2430 avoid_trashing_input (struct sortfile *files, size_t ntemps,
2431                       size_t nfiles, char const *outfile)
2432 {
2433   size_t i;
2434   bool got_outstat = false;
2435   struct stat outstat;
2436
2437   for (i = ntemps; i < nfiles; i++)
2438     {
2439       bool is_stdin = STREQ (files[i].name, "-");
2440       bool same;
2441       struct stat instat;
2442
2443       if (outfile && STREQ (outfile, files[i].name) && !is_stdin)
2444         same = true;
2445       else
2446         {
2447           if (! got_outstat)
2448             {
2449               if ((outfile
2450                    ? stat (outfile, &outstat)
2451                    : fstat (STDOUT_FILENO, &outstat))
2452                   != 0)
2453                 break;
2454               got_outstat = true;
2455             }
2456
2457           same = (((is_stdin
2458                     ? fstat (STDIN_FILENO, &instat)
2459                     : stat (files[i].name, &instat))
2460                    == 0)
2461                   && SAME_INODE (instat, outstat));
2462         }
2463
2464       if (same)
2465         {
2466           FILE *tftp;
2467           pid_t pid;
2468           char *temp = create_temp (&tftp, &pid);
2469           mergefps (&files[i],0, nfiles - i, tftp, temp);
2470           files[i].name = temp;
2471           files[i].pid = pid;
2472           return i + 1;
2473         }
2474     }
2475
2476   return nfiles;
2477 }
2478
2479 /* Merge the input FILES.  NTEMPS is the number of files at the
2480    start of FILES that are temporary; it is zero at the top level.
2481    NFILES is the total number of files.  Put the output in
2482    OUTPUT_FILE; a null OUTPUT_FILE stands for standard output.  */
2483
2484 static void
2485 merge (struct sortfile *files, size_t ntemps, size_t nfiles,
2486        char const *output_file)
2487 {
2488   while (nmerge < nfiles)
2489     {
2490       /* Number of input files processed so far.  */
2491       size_t in;
2492
2493       /* Number of output files generated so far.  */
2494       size_t out;
2495
2496       /* nfiles % NMERGE; this counts input files that are left over
2497          after all full-sized merges have been done.  */
2498       size_t remainder;
2499
2500       /* Number of easily-available slots at the next loop iteration.  */
2501       size_t cheap_slots;
2502
2503       /* Do as many NMERGE-size merges as possible.  */
2504       for (out = in = 0; out < nfiles / nmerge; out++, in += nmerge)
2505         {
2506           FILE *tfp;
2507           pid_t pid;
2508           char *temp = create_temp (&tfp, &pid);
2509           size_t nt = MIN (ntemps, nmerge);
2510           ntemps -= nt;
2511           mergefps (&files[in], nt, nmerge, tfp, temp);
2512           files[out].name = temp;
2513           files[out].pid = pid;
2514         }
2515
2516       remainder = nfiles - in;
2517       cheap_slots = nmerge - out % nmerge;
2518
2519       if (cheap_slots < remainder)
2520         {
2521           /* So many files remain that they can't all be put into the last
2522              NMERGE-sized output window.  Do one more merge.  Merge as few
2523              files as possible, to avoid needless I/O.  */
2524           size_t nshortmerge = remainder - cheap_slots + 1;
2525           FILE *tfp;
2526           pid_t pid;
2527           char *temp = create_temp (&tfp, &pid);
2528           size_t nt = MIN (ntemps, nshortmerge);
2529           ntemps -= nt;
2530           mergefps (&files[in], nt, nshortmerge, tfp, temp);
2531           files[out].name = temp;
2532           files[out++].pid = pid;
2533           in += nshortmerge;
2534         }
2535
2536       /* Put the remaining input files into the last NMERGE-sized output
2537          window, so they will be merged in the next pass.  */
2538       memmove(&files[out], &files[in], (nfiles - in) * sizeof *files);
2539       ntemps += out;
2540       nfiles -= in - out;
2541     }
2542
2543   nfiles = avoid_trashing_input (files, ntemps, nfiles, output_file);
2544   mergefps (files, ntemps, nfiles, NULL, output_file);
2545 }
2546
2547 /* Sort NFILES FILES onto OUTPUT_FILE. */
2548
2549 static void
2550 sort (char * const *files, size_t nfiles, char const *output_file)
2551 {
2552   struct buffer buf;
2553   size_t ntemps = 0;
2554   bool output_file_created = false;
2555
2556   buf.alloc = 0;
2557
2558   while (nfiles)
2559     {
2560       char const *temp_output;
2561       char const *file = *files;
2562       FILE *fp = xfopen (file, "r");
2563       FILE *tfp;
2564       size_t bytes_per_line = (2 * sizeof (struct line)
2565                                - sizeof (struct line) / 2);
2566
2567       if (! buf.alloc)
2568         initbuf (&buf, bytes_per_line,
2569                  sort_buffer_size (&fp, 1, files, nfiles, bytes_per_line));
2570       buf.eof = false;
2571       files++;
2572       nfiles--;
2573
2574       while (fillbuf (&buf, fp, file))
2575         {
2576           struct line *line;
2577           struct line *linebase;
2578
2579           if (buf.eof && nfiles
2580               && (bytes_per_line + 1
2581                   < (buf.alloc - buf.used - bytes_per_line * buf.nlines)))
2582             {
2583               /* End of file, but there is more input and buffer room.
2584                  Concatenate the next input file; this is faster in
2585                  the usual case.  */
2586               buf.left = buf.used;
2587               break;
2588             }
2589
2590           line = buffer_linelim (&buf);
2591           linebase = line - buf.nlines;
2592           if (1 < buf.nlines)
2593             sortlines (line, buf.nlines, linebase);
2594           if (buf.eof && !nfiles && !ntemps && !buf.left)
2595             {
2596               xfclose (fp, file);
2597               tfp = xfopen (output_file, "w");
2598               temp_output = output_file;
2599               output_file_created = true;
2600             }
2601           else
2602             {
2603               ++ntemps;
2604               temp_output = create_temp (&tfp, NULL);
2605             }
2606
2607           do
2608             {
2609               line--;
2610               write_bytes (line->text, line->length, tfp, temp_output);
2611               if (unique)
2612                 while (linebase < line && compare (line, line - 1) == 0)
2613                   line--;
2614             }
2615           while (linebase < line);
2616
2617           xfclose (tfp, temp_output);
2618
2619           /* Free up some resources every once in a while.  */
2620           if (MAX_PROCS_BEFORE_REAP < nprocs)
2621             reap_some ();
2622
2623           if (output_file_created)
2624             goto finish;
2625         }
2626       xfclose (fp, file);
2627     }
2628
2629  finish:
2630   free (buf.buf);
2631
2632   if (! output_file_created)
2633     {
2634       size_t i;
2635       struct tempnode *node = temphead;
2636       struct sortfile *tempfiles = xnmalloc (ntemps, sizeof *tempfiles);
2637       for (i = 0; node; i++)
2638         {
2639           tempfiles[i].name = node->name;
2640           tempfiles[i].pid = node->pid;
2641           node = node->next;
2642         }
2643       merge (tempfiles, ntemps, ntemps, output_file);
2644       free (tempfiles);
2645     }
2646 }
2647
2648 /* Insert a malloc'd copy of key KEY_ARG at the end of the key list.  */
2649
2650 static void
2651 insertkey (struct keyfield *key_arg)
2652 {
2653   struct keyfield **p;
2654   struct keyfield *key = xmemdup (key_arg, sizeof *key);
2655
2656   for (p = &keylist; *p; p = &(*p)->next)
2657     continue;
2658   *p = key;
2659   key->next = NULL;
2660 }
2661
2662 /* Report a bad field specification SPEC, with extra info MSGID.  */
2663
2664 static void badfieldspec (char const *, char const *)
2665      ATTRIBUTE_NORETURN;
2666 static void
2667 badfieldspec (char const *spec, char const *msgid)
2668 {
2669   error (SORT_FAILURE, 0, _("%s: invalid field specification %s"),
2670          _(msgid), quote (spec));
2671   abort ();
2672 }
2673
2674 /* Report incompatible options.  */
2675
2676 static void incompatible_options (char const *) ATTRIBUTE_NORETURN;
2677 static void
2678 incompatible_options (char const *opts)
2679 {
2680   error (SORT_FAILURE, 0, _("options `-%s' are incompatible"), opts);
2681   abort ();
2682 }
2683
2684 /* Check compatibility of ordering options.  */
2685
2686 static void
2687 check_ordering_compatibility (void)
2688 {
2689   struct keyfield const *key;
2690
2691   for (key = keylist; key; key = key->next)
2692     if ((1 < (key->random + key->numeric + key->general_numeric + key->month
2693               + !!key->ignore))
2694         || (key->random && key->translate))
2695       {
2696         char opts[7];
2697         char *p = opts;
2698         if (key->ignore == nondictionary)
2699           *p++ = 'd';
2700         if (key->translate)
2701           *p++ = 'f';
2702         if (key->general_numeric)
2703           *p++ = 'g';
2704         if (key->ignore == nonprinting)
2705           *p++ = 'i';
2706         if (key->month)
2707           *p++ = 'M';
2708         if (key->numeric)
2709           *p++ = 'n';
2710         if (key->random)
2711           *p++ = 'R';
2712         *p = '\0';
2713         incompatible_options (opts);
2714       }
2715 }
2716
2717 /* Parse the leading integer in STRING and store the resulting value
2718    (which must fit into size_t) into *VAL.  Return the address of the
2719    suffix after the integer.  If the value is too large, silently
2720    substitute SIZE_MAX.  If MSGID is NULL, return NULL after
2721    failure; otherwise, report MSGID and exit on failure.  */
2722
2723 static char const *
2724 parse_field_count (char const *string, size_t *val, char const *msgid)
2725 {
2726   char *suffix;
2727   uintmax_t n;
2728
2729   switch (xstrtoumax (string, &suffix, 10, &n, ""))
2730     {
2731     case LONGINT_OK:
2732     case LONGINT_INVALID_SUFFIX_CHAR:
2733       *val = n;
2734       if (*val == n)
2735         break;
2736       /* Fall through.  */
2737     case LONGINT_OVERFLOW:
2738     case LONGINT_OVERFLOW | LONGINT_INVALID_SUFFIX_CHAR:
2739       *val = SIZE_MAX;
2740       break;
2741
2742     case LONGINT_INVALID:
2743       if (msgid)
2744         error (SORT_FAILURE, 0, _("%s: invalid count at start of %s"),
2745                _(msgid), quote (string));
2746       return NULL;
2747     }
2748
2749   return suffix;
2750 }
2751
2752 /* Handle interrupts and hangups. */
2753
2754 static void
2755 sighandler (int sig)
2756 {
2757   if (! SA_NOCLDSTOP)
2758     signal (sig, SIG_IGN);
2759
2760   cleanup ();
2761
2762   signal (sig, SIG_DFL);
2763   raise (sig);
2764 }
2765
2766 /* Set the ordering options for KEY specified in S.
2767    Return the address of the first character in S that
2768    is not a valid ordering option.
2769    BLANKTYPE is the kind of blanks that 'b' should skip. */
2770
2771 static char *
2772 set_ordering (const char *s, struct keyfield *key, enum blanktype blanktype)
2773 {
2774   while (*s)
2775     {
2776       switch (*s)
2777         {
2778         case 'b':
2779           if (blanktype == bl_start || blanktype == bl_both)
2780             key->skipsblanks = true;
2781           if (blanktype == bl_end || blanktype == bl_both)
2782             key->skipeblanks = true;
2783           break;
2784         case 'd':
2785           key->ignore = nondictionary;
2786           break;
2787         case 'f':
2788           key->translate = fold_toupper;
2789           break;
2790         case 'g':
2791           key->general_numeric = true;
2792           break;
2793         case 'i':
2794           /* Option order should not matter, so don't let -i override
2795              -d.  -d implies -i, but -i does not imply -d.  */
2796           if (! key->ignore)
2797             key->ignore = nonprinting;
2798           break;
2799         case 'M':
2800           key->month = true;
2801           break;
2802         case 'n':
2803           key->numeric = true;
2804           break;
2805         case 'R':
2806           key->random = true;
2807           break;
2808         case 'r':
2809           key->reverse = true;
2810           break;
2811         default:
2812           return (char *) s;
2813         }
2814       ++s;
2815     }
2816   return (char *) s;
2817 }
2818
2819 static struct keyfield *
2820 key_init (struct keyfield *key)
2821 {
2822   memset (key, 0, sizeof *key);
2823   key->eword = SIZE_MAX;
2824   return key;
2825 }
2826
2827 int
2828 main (int argc, char **argv)
2829 {
2830   struct keyfield *key;
2831   struct keyfield key_buf;
2832   struct keyfield gkey;
2833   char const *s;
2834   int c = 0;
2835   char checkonly = 0;
2836   bool mergeonly = false;
2837   char *random_source = NULL;
2838   bool need_random = false;
2839   size_t nfiles = 0;
2840   bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
2841   bool obsolete_usage = (posix2_version () < 200112);
2842   char **files;
2843   char *files_from = NULL;
2844   struct Tokens tok;
2845   char const *outfile = NULL;
2846
2847   initialize_main (&argc, &argv);
2848   set_program_name (argv[0]);
2849   setlocale (LC_ALL, "");
2850   bindtextdomain (PACKAGE, LOCALEDIR);
2851   textdomain (PACKAGE);
2852
2853   initialize_exit_failure (SORT_FAILURE);
2854
2855   hard_LC_COLLATE = hard_locale (LC_COLLATE);
2856 #if HAVE_NL_LANGINFO
2857   hard_LC_TIME = hard_locale (LC_TIME);
2858 #endif
2859
2860   /* Get locale's representation of the decimal point.  */
2861   {
2862     struct lconv const *locale = localeconv ();
2863
2864     /* If the locale doesn't define a decimal point, or if the decimal
2865        point is multibyte, use the C locale's decimal point.  FIXME:
2866        add support for multibyte decimal points.  */
2867     decimal_point = to_uchar (locale->decimal_point[0]);
2868     if (! decimal_point || locale->decimal_point[1])
2869       decimal_point = '.';
2870
2871     /* FIXME: add support for multibyte thousands separators.  */
2872     thousands_sep = to_uchar (*locale->thousands_sep);
2873     if (! thousands_sep || locale->thousands_sep[1])
2874       thousands_sep = -1;
2875   }
2876
2877   have_read_stdin = false;
2878   inittables ();
2879
2880   {
2881     size_t i;
2882     static int const sig[] =
2883       {
2884         /* The usual suspects.  */
2885         SIGALRM, SIGHUP, SIGINT, SIGPIPE, SIGQUIT, SIGTERM,
2886 #ifdef SIGPOLL
2887         SIGPOLL,
2888 #endif
2889 #ifdef SIGPROF
2890         SIGPROF,
2891 #endif
2892 #ifdef SIGVTALRM
2893         SIGVTALRM,
2894 #endif
2895 #ifdef SIGXCPU
2896         SIGXCPU,
2897 #endif
2898 #ifdef SIGXFSZ
2899         SIGXFSZ,
2900 #endif
2901       };
2902     enum { nsigs = sizeof sig / sizeof sig[0] };
2903
2904 #if SA_NOCLDSTOP
2905     struct sigaction act;
2906
2907     sigemptyset (&caught_signals);
2908     for (i = 0; i < nsigs; i++)
2909       {
2910         sigaction (sig[i], NULL, &act);
2911         if (act.sa_handler != SIG_IGN)
2912           sigaddset (&caught_signals, sig[i]);
2913       }
2914
2915     act.sa_handler = sighandler;
2916     act.sa_mask = caught_signals;
2917     act.sa_flags = 0;
2918
2919     for (i = 0; i < nsigs; i++)
2920       if (sigismember (&caught_signals, sig[i]))
2921         sigaction (sig[i], &act, NULL);
2922 #else
2923     for (i = 0; i < nsigs; i++)
2924       if (signal (sig[i], SIG_IGN) != SIG_IGN)
2925         {
2926           signal (sig[i], sighandler);
2927           siginterrupt (sig[i], 1);
2928         }
2929 #endif
2930   }
2931
2932   /* The signal mask is known, so it is safe to invoke exit_cleanup.  */
2933   atexit (exit_cleanup);
2934
2935   gkey.sword = gkey.eword = SIZE_MAX;
2936   gkey.ignore = NULL;
2937   gkey.translate = NULL;
2938   gkey.numeric = gkey.general_numeric = gkey.random = false;
2939   gkey.month = gkey.reverse = false;
2940   gkey.skipsblanks = gkey.skipeblanks = false;
2941
2942   files = xnmalloc (argc, sizeof *files);
2943
2944   for (;;)
2945     {
2946       /* Parse an operand as a file after "--" was seen; or if
2947          pedantic and a file was seen, unless the POSIX version
2948          predates 1003.1-2001 and -c was not seen and the operand is
2949          "-o FILE" or "-oFILE".  */
2950       int oi = -1;
2951
2952       if (c == -1
2953           || (posixly_correct && nfiles != 0
2954               && ! (obsolete_usage
2955                     && ! checkonly
2956                     && optind != argc
2957                     && argv[optind][0] == '-' && argv[optind][1] == 'o'
2958                     && (argv[optind][2] || optind + 1 != argc)))
2959           || ((c = getopt_long (argc, argv, short_options,
2960                                 long_options, &oi))
2961               == -1))
2962         {
2963           if (argc <= optind)
2964             break;
2965           files[nfiles++] = argv[optind++];
2966         }
2967       else switch (c)
2968         {
2969         case 1:
2970           key = NULL;
2971           if (optarg[0] == '+')
2972             {
2973               bool minus_pos_usage = (optind != argc && argv[optind][0] == '-'
2974                                       && ISDIGIT (argv[optind][1]));
2975               obsolete_usage |= minus_pos_usage & ~posixly_correct;
2976               if (obsolete_usage)
2977                 {
2978                   /* Treat +POS1 [-POS2] as a key if possible; but silently
2979                      treat an operand as a file if it is not a valid +POS1.  */
2980                   key = key_init (&key_buf);
2981                   s = parse_field_count (optarg + 1, &key->sword, NULL);
2982                   if (s && *s == '.')
2983                     s = parse_field_count (s + 1, &key->schar, NULL);
2984                   if (! (key->sword | key->schar))
2985                     key->sword = SIZE_MAX;
2986                   if (! s || *set_ordering (s, key, bl_start))
2987                     key = NULL;
2988                   else
2989                     {
2990                       if (minus_pos_usage)
2991                         {
2992                           char const *optarg1 = argv[optind++];
2993                           s = parse_field_count (optarg1 + 1, &key->eword,
2994                                              N_("invalid number after `-'"));
2995                           if (*s == '.')
2996                             s = parse_field_count (s + 1, &key->echar,
2997                                                N_("invalid number after `.'"));
2998                           if (*set_ordering (s, key, bl_end))
2999                             badfieldspec (optarg1,
3000                                       N_("stray character in field spec"));
3001                         }
3002                       insertkey (key);
3003                     }
3004                 }
3005             }
3006           if (! key)
3007             files[nfiles++] = optarg;
3008           break;
3009
3010         case SORT_OPTION:
3011           c = XARGMATCH ("--sort", optarg, sort_args, sort_types);
3012           /* Fall through. */
3013         case 'b':
3014         case 'd':
3015         case 'f':
3016         case 'g':
3017         case 'i':
3018         case 'M':
3019         case 'n':
3020         case 'r':
3021         case 'R':
3022           {
3023             char str[2];
3024             str[0] = c;
3025             str[1] = '\0';
3026             set_ordering (str, &gkey, bl_both);
3027           }
3028           break;
3029
3030         case CHECK_OPTION:
3031           c = (optarg
3032                ? XARGMATCH ("--check", optarg, check_args, check_types)
3033                : 'c');
3034           /* Fall through.  */
3035         case 'c':
3036         case 'C':
3037           if (checkonly && checkonly != c)
3038             incompatible_options ("cC");
3039           checkonly = c;
3040           break;
3041
3042         case COMPRESS_PROGRAM_OPTION:
3043           if (compress_program && !STREQ (compress_program, optarg))
3044             error (SORT_FAILURE, 0, _("multiple compress programs specified"));
3045           compress_program = optarg;
3046           break;
3047
3048         case FILES0_FROM_OPTION:
3049           files_from = optarg;
3050           break;
3051
3052         case 'k':
3053           key = key_init (&key_buf);
3054
3055           /* Get POS1. */
3056           s = parse_field_count (optarg, &key->sword,
3057                                  N_("invalid number at field start"));
3058           if (! key->sword--)
3059             {
3060               /* Provoke with `sort -k0' */
3061               badfieldspec (optarg, N_("field number is zero"));
3062             }
3063           if (*s == '.')
3064             {
3065               s = parse_field_count (s + 1, &key->schar,
3066                                      N_("invalid number after `.'"));
3067               if (! key->schar--)
3068                 {
3069                   /* Provoke with `sort -k1.0' */
3070                   badfieldspec (optarg, N_("character offset is zero"));
3071                 }
3072             }
3073           if (! (key->sword | key->schar))
3074             key->sword = SIZE_MAX;
3075           s = set_ordering (s, key, bl_start);
3076           if (*s != ',')
3077             {
3078               key->eword = SIZE_MAX;
3079               key->echar = 0;
3080             }
3081           else
3082             {
3083               /* Get POS2. */
3084               s = parse_field_count (s + 1, &key->eword,
3085                                      N_("invalid number after `,'"));
3086               if (! key->eword--)
3087                 {
3088                   /* Provoke with `sort -k1,0' */
3089                   badfieldspec (optarg, N_("field number is zero"));
3090                 }
3091               if (*s == '.')
3092                 s = parse_field_count (s + 1, &key->echar,
3093                                        N_("invalid number after `.'"));
3094               else
3095                 {
3096                   /* `-k 2,3' is equivalent to `+1 -3'.  */
3097                   key->eword++;
3098                 }
3099               s = set_ordering (s, key, bl_end);
3100             }
3101           if (*s)
3102             badfieldspec (optarg, N_("stray character in field spec"));
3103           insertkey (key);
3104           break;
3105
3106         case 'm':
3107           mergeonly = true;
3108           break;
3109
3110         case NMERGE_OPTION:
3111           specify_nmerge (oi, c, optarg);
3112           break;
3113
3114         case 'o':
3115           if (outfile && !STREQ (outfile, optarg))
3116             error (SORT_FAILURE, 0, _("multiple output files specified"));
3117           outfile = optarg;
3118           break;
3119
3120         case RANDOM_SOURCE_OPTION:
3121           if (random_source && !STREQ (random_source, optarg))
3122             error (SORT_FAILURE, 0, _("multiple random sources specified"));
3123           random_source = optarg;
3124           break;
3125
3126         case 's':
3127           stable = true;
3128           break;
3129
3130         case 'S':
3131           specify_sort_size (oi, c, optarg);
3132           break;
3133
3134         case 't':
3135           {
3136             char newtab = optarg[0];
3137             if (! newtab)
3138               error (SORT_FAILURE, 0, _("empty tab"));
3139             if (optarg[1])
3140               {
3141                 if (STREQ (optarg, "\\0"))
3142                   newtab = '\0';
3143                 else
3144                   {
3145                     /* Provoke with `sort -txx'.  Complain about
3146                        "multi-character tab" instead of "multibyte tab", so
3147                        that the diagnostic's wording does not need to be
3148                        changed once multibyte characters are supported.  */
3149                     error (SORT_FAILURE, 0, _("multi-character tab %s"),
3150                            quote (optarg));
3151                   }
3152               }
3153             if (tab != TAB_DEFAULT && tab != newtab)
3154               error (SORT_FAILURE, 0, _("incompatible tabs"));
3155             tab = newtab;
3156           }
3157           break;
3158
3159         case 'T':
3160           add_temp_dir (optarg);
3161           break;
3162
3163         case 'u':
3164           unique = true;
3165           break;
3166
3167         case 'y':
3168           /* Accept and ignore e.g. -y0 for compatibility with Solaris 2.x
3169              through Solaris 7.  It is also accepted by many non-Solaris
3170              "sort" implementations, e.g., AIX 5.2, HP-UX 11i v2, IRIX 6.5.
3171              -y is marked as obsolete starting with Solaris 8 (1999), but is
3172              still accepted as of Solaris 10 prerelease (2004).
3173
3174              Solaris 2.5.1 "sort -y 100" reads the input file "100", but
3175              emulate Solaris 8 and 9 "sort -y 100" which ignores the "100",
3176              and which in general ignores the argument after "-y" if it
3177              consists entirely of digits (it can even be empty).  */
3178           if (optarg == argv[optind - 1])
3179             {
3180               char const *p;
3181               for (p = optarg; ISDIGIT (*p); p++)
3182                 continue;
3183               optind -= (*p != '\0');
3184             }
3185           break;
3186
3187         case 'z':
3188           eolchar = 0;
3189           break;
3190
3191         case_GETOPT_HELP_CHAR;
3192
3193         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
3194
3195         default:
3196           usage (SORT_FAILURE);
3197         }
3198     }
3199
3200   if (files_from)
3201     {
3202       FILE *stream;
3203
3204       /* When using --files0-from=F, you may not specify any files
3205          on the command-line.  */
3206       if (nfiles)
3207         {
3208           error (0, 0, _("extra operand %s"), quote (files[0]));
3209           fprintf (stderr, "%s\n",
3210                    _("file operands cannot be combined with --files0-from"));
3211           usage (SORT_FAILURE);
3212         }
3213
3214       if (STREQ (files_from, "-"))
3215         stream = stdin;
3216       else
3217         {
3218           stream = fopen (files_from, "r");
3219           if (stream == NULL)
3220             error (SORT_FAILURE, errno, _("cannot open %s for reading"),
3221                    quote (files_from));
3222         }
3223
3224       readtokens0_init (&tok);
3225
3226       if (! readtokens0 (stream, &tok) || fclose (stream) != 0)
3227         error (SORT_FAILURE, 0, _("cannot read file names from %s"),
3228                quote (files_from));
3229
3230       if (tok.n_tok)
3231         {
3232           size_t i;
3233           free (files);
3234           files = tok.tok;
3235           nfiles = tok.n_tok;
3236           for (i = 0; i < nfiles; i++)
3237           {
3238               if (STREQ (files[i], "-"))
3239                 error (SORT_FAILURE, 0, _("when reading file names from stdin, "
3240                                           "no file name of %s allowed"),
3241                        quote (files[i]));
3242               else if (files[i][0] == '\0')
3243                 {
3244                   /* Using the standard `filename:line-number:' prefix here is
3245                      not totally appropriate, since NUL is the separator, not NL,
3246                      but it might be better than nothing.  */
3247                   unsigned long int file_number = i + 1;
3248                   error (SORT_FAILURE, 0,
3249                          _("%s:%lu: invalid zero-length file name"),
3250                          quotearg_colon (files_from), file_number);
3251                 }
3252           }
3253         }
3254       else
3255         error (SORT_FAILURE, 0, _("no input from %s"),
3256                quote (files_from));
3257     }
3258
3259   /* Inheritance of global options to individual keys. */
3260   for (key = keylist; key; key = key->next)
3261     {
3262       if (! (key->ignore || key->translate
3263              || (key->skipsblanks | key->reverse
3264                  | key->skipeblanks | key->month | key->numeric
3265                  | key->general_numeric
3266                  | key->random)))
3267         {
3268           key->ignore = gkey.ignore;
3269           key->translate = gkey.translate;
3270           key->skipsblanks = gkey.skipsblanks;
3271           key->skipeblanks = gkey.skipeblanks;
3272           key->month = gkey.month;
3273           key->numeric = gkey.numeric;
3274           key->general_numeric = gkey.general_numeric;
3275           key->random = gkey.random;
3276           key->reverse = gkey.reverse;
3277         }
3278
3279       need_random |= key->random;
3280     }
3281
3282   if (!keylist && (gkey.ignore || gkey.translate
3283                    || (gkey.skipsblanks | gkey.skipeblanks | gkey.month
3284                        | gkey.numeric | gkey.general_numeric
3285                        | gkey.random)))
3286     {
3287       insertkey (&gkey);
3288       need_random |= gkey.random;
3289     }
3290
3291   check_ordering_compatibility ();
3292
3293   reverse = gkey.reverse;
3294
3295   if (need_random)
3296     {
3297       randread_source = randread_new (random_source, MD5_DIGEST_SIZE);
3298       if (! randread_source)
3299         die (_("open failed"), random_source);
3300     }
3301
3302   if (temp_dir_count == 0)
3303     {
3304       char const *tmp_dir = getenv ("TMPDIR");
3305       add_temp_dir (tmp_dir ? tmp_dir : DEFAULT_TMPDIR);
3306     }
3307
3308   if (nfiles == 0)
3309     {
3310       static char *minus = "-";
3311       nfiles = 1;
3312       free (files);
3313       files = &minus;
3314     }
3315
3316   /* Need to re-check that we meet the minimum requirement for memory
3317      usage with the final value for NMERGE. */
3318   if (0 < sort_size)
3319     sort_size = MAX (sort_size, MIN_SORT_SIZE);
3320
3321   if (checkonly)
3322     {
3323       if (nfiles > 1)
3324         error (SORT_FAILURE, 0, _("extra operand %s not allowed with -%c"),
3325                quote (files[1]), checkonly);
3326
3327       if (outfile)
3328         {
3329           static char opts[] = {0, 'o', 0};
3330           opts[0] = checkonly;
3331           incompatible_options (opts);
3332         }
3333
3334       /* POSIX requires that sort return 1 IFF invoked with -c or -C and the
3335          input is not properly sorted.  */
3336       exit (check (files[0], checkonly) ? EXIT_SUCCESS : SORT_OUT_OF_ORDER);
3337     }
3338
3339   if (mergeonly)
3340     {
3341       struct sortfile *sortfiles = xcalloc (nfiles, sizeof *sortfiles);
3342       size_t i;
3343
3344       for (i = 0; i < nfiles; ++i)
3345         sortfiles[i].name = files[i];
3346
3347       merge (sortfiles, 0, nfiles, outfile);
3348       IF_LINT (free (sortfiles));
3349     }
3350   else
3351     sort (files, nfiles, outfile);
3352
3353   if (have_read_stdin && fclose (stdin) == EOF)
3354     die (_("close failed"), "-");
3355
3356   exit (EXIT_SUCCESS);
3357 }