Include fd-reopen.h.
[platform/upstream/coreutils.git] / src / csplit.c
1 /* csplit - split a file into sections determined by context lines
2    Copyright (C) 91, 1995-2005 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 2, or (at your option)
7    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, write to the Free Software Foundation,
16    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18 /* Written by Stuart Kemp, cpsrk@groper.jcu.edu.au.
19    Modified by David MacKenzie, djm@gnu.ai.mit.edu. */
20
21 #include <config.h>
22
23 #include <stdio.h>
24 #include <getopt.h>
25 #include <sys/types.h>
26 #include <signal.h>
27
28 #include "system.h"
29
30 #include <regex.h>
31
32 #include "error.h"
33 #include "fd-reopen.h"
34 #include "inttostr.h"
35 #include "quote.h"
36 #include "safe-read.h"
37 #include "stdio--.h"
38 #include "xstrtol.h"
39
40 /* Use SA_NOCLDSTOP as a proxy for whether the sigaction machinery is
41    present.  */
42 #ifndef SA_NOCLDSTOP
43 # define SA_NOCLDSTOP 0
44 # define sigprocmask(How, Set, Oset) /* empty */
45 # define sigset_t int
46 # if ! HAVE_SIGINTERRUPT
47 #  define siginterrupt(sig, flag) /* empty */
48 # endif
49 #endif
50
51 /* The official name of this program (e.g., no `g' prefix).  */
52 #define PROGRAM_NAME "csplit"
53
54 #define AUTHORS "Stuart Kemp", "David MacKenzie"
55
56 /* Increment size of area for control records. */
57 #define ALLOC_SIZE 20
58
59 /* The default prefix for output file names. */
60 #define DEFAULT_PREFIX  "xx"
61
62 /* A compiled pattern arg. */
63 struct control
64 {
65   char *regexpr;                /* Non-compiled regular expression. */
66   struct re_pattern_buffer re_compiled; /* Compiled regular expression. */
67   intmax_t offset;              /* Offset from regexp to split at. */
68   uintmax_t lines_required;     /* Number of lines required. */
69   uintmax_t repeat;             /* Repeat count. */
70   int argnum;                   /* ARGV index. */
71   bool repeat_forever;          /* True if `*' used as a repeat count. */
72   bool ignore;                  /* If true, produce no output (for regexp). */
73 };
74
75 /* Initial size of data area in buffers. */
76 #define START_SIZE      8191
77
78 /* Increment size for data area. */
79 #define INCR_SIZE       2048
80
81 /* Number of lines kept in each node in line list. */
82 #define CTRL_SIZE       80
83
84 #ifdef DEBUG
85 /* Some small values to test the algorithms. */
86 # define START_SIZE     200
87 # define INCR_SIZE      10
88 # define CTRL_SIZE      1
89 #endif
90
91 /* A string with a length count. */
92 struct cstring
93 {
94   size_t len;
95   char *str;
96 };
97
98 /* Pointers to the beginnings of lines in the buffer area.
99    These structures are linked together if needed. */
100 struct line
101 {
102   size_t used;                  /* Number of offsets used in this struct. */
103   size_t insert_index;          /* Next offset to use when inserting line. */
104   size_t retrieve_index;        /* Next index to use when retrieving line. */
105   struct cstring starts[CTRL_SIZE]; /* Lines in the data area. */
106   struct line *next;            /* Next in linked list. */
107 };
108
109 /* The structure to hold the input lines.
110    Contains a pointer to the data area and a list containing
111    pointers to the individual lines. */
112 struct buffer_record
113 {
114   size_t bytes_alloc;           /* Size of the buffer area. */
115   size_t bytes_used;            /* Bytes used in the buffer area. */
116   uintmax_t start_line;         /* First line number in this buffer. */
117   uintmax_t first_available;    /* First line that can be retrieved. */
118   size_t num_lines;             /* Number of complete lines in this buffer. */
119   char *buffer;                 /* Data area. */
120   struct line *line_start;      /* Head of list of pointers to lines. */
121   struct line *curr_line;       /* The line start record currently in use. */
122   struct buffer_record *next;
123 };
124
125 static void close_output_file (void);
126 static void create_output_file (void);
127 static void delete_all_files (bool);
128 static void save_line_to_file (const struct cstring *line);
129 void usage (int status);
130
131 /* The name this program was run with. */
132 char *program_name;
133
134 /* Start of buffer list. */
135 static struct buffer_record *head = NULL;
136
137 /* Partially read line. */
138 static char *hold_area = NULL;
139
140 /* Number of bytes in `hold_area'. */
141 static size_t hold_count = 0;
142
143 /* Number of the last line in the buffers. */
144 static uintmax_t last_line_number = 0;
145
146 /* Number of the line currently being examined. */
147 static uintmax_t current_line = 0;
148
149 /* If true, we have read EOF. */
150 static bool have_read_eof = false;
151
152 /* Name of output files. */
153 static char * volatile filename_space = NULL;
154
155 /* Prefix part of output file names. */
156 static char * volatile prefix = NULL;
157
158 /* Suffix part of output file names. */
159 static char * volatile suffix = NULL;
160
161 /* Number of digits to use in output file names. */
162 static int volatile digits = 2;
163
164 /* Number of files created so far. */
165 static unsigned int volatile files_created = 0;
166
167 /* Number of bytes written to current file. */
168 static uintmax_t bytes_written;
169
170 /* Output file pointer. */
171 static FILE *output_stream = NULL;
172
173 /* Output file name. */
174 static char *output_filename = NULL;
175
176 /* Perhaps it would be cleaner to pass arg values instead of indexes. */
177 static char **global_argv;
178
179 /* If true, do not print the count of bytes in each output file. */
180 static bool suppress_count;
181
182 /* If true, remove output files on error. */
183 static bool volatile remove_files;
184
185 /* If true, remove all output files which have a zero length. */
186 static bool elide_empty_files;
187
188 /* The compiled pattern arguments, which determine how to split
189    the input file. */
190 static struct control *controls;
191
192 /* Number of elements in `controls'. */
193 static size_t control_used;
194
195 /* The set of signals that are caught.  */
196 static sigset_t caught_signals;
197
198 static struct option const longopts[] =
199 {
200   {"digits", required_argument, NULL, 'n'},
201   {"quiet", no_argument, NULL, 'q'},
202   {"silent", no_argument, NULL, 's'},
203   {"keep-files", no_argument, NULL, 'k'},
204   {"elide-empty-files", no_argument, NULL, 'z'},
205   {"prefix", required_argument, NULL, 'f'},
206   {"suffix-format", required_argument, NULL, 'b'},
207   {GETOPT_HELP_OPTION_DECL},
208   {GETOPT_VERSION_OPTION_DECL},
209   {NULL, 0, NULL, 0}
210 };
211
212 /* Optionally remove files created so far; then exit.
213    Called when an error detected. */
214
215 static void
216 cleanup (void)
217 {
218   sigset_t oldset;
219
220   close_output_file ();
221
222   sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
223   delete_all_files (false);
224   sigprocmask (SIG_SETMASK, &oldset, NULL);
225 }
226
227 static void cleanup_fatal (void) ATTRIBUTE_NORETURN;
228 static void
229 cleanup_fatal (void)
230 {
231   cleanup ();
232   exit (EXIT_FAILURE);
233 }
234
235 extern void
236 xalloc_die (void)
237 {
238   error (0, 0, "%s", _("memory exhausted"));
239   cleanup_fatal ();
240 }
241
242 static void
243 interrupt_handler (int sig)
244 {
245   if (! SA_NOCLDSTOP)
246     signal (sig, SIG_IGN);
247
248   delete_all_files (true);
249
250   signal (sig, SIG_DFL);
251   raise (sig);
252 }
253
254 /* Keep track of NUM bytes of a partial line in buffer START.
255    These bytes will be retrieved later when another large buffer is read.
256    It is not necessary to create a new buffer for these bytes; instead,
257    we keep a pointer to the existing buffer.  This buffer *is* on the
258    free list, and when the next buffer is obtained from this list
259    (even if it is this one), these bytes will be placed at the
260    start of the new buffer. */
261
262 static void
263 save_to_hold_area (char *start, size_t num)
264 {
265   hold_area = start;
266   hold_count = num;
267 }
268
269 /* Read up to MAX_N_BYTES bytes from the input stream into DEST.
270    Return the number of bytes read. */
271
272 static size_t
273 read_input (char *dest, size_t max_n_bytes)
274 {
275   size_t bytes_read;
276
277   if (max_n_bytes == 0)
278     return 0;
279
280   bytes_read = safe_read (STDIN_FILENO, dest, max_n_bytes);
281
282   if (bytes_read == 0)
283     have_read_eof = true;
284
285   if (bytes_read == SAFE_READ_ERROR)
286     {
287       error (0, errno, _("read error"));
288       cleanup_fatal ();
289     }
290
291   return bytes_read;
292 }
293
294 /* Initialize existing line record P. */
295
296 static void
297 clear_line_control (struct line *p)
298 {
299   p->used = 0;
300   p->insert_index = 0;
301   p->retrieve_index = 0;
302 }
303
304 /* Return a new, initialized line record. */
305
306 static struct line *
307 new_line_control (void)
308 {
309   struct line *p = xmalloc (sizeof *p);
310
311   p->next = NULL;
312   clear_line_control (p);
313
314   return p;
315 }
316
317 /* Record LINE_START, which is the address of the start of a line
318    of length LINE_LEN in the large buffer, in the lines buffer of B. */
319
320 static void
321 keep_new_line (struct buffer_record *b, char *line_start, size_t line_len)
322 {
323   struct line *l;
324
325   /* If there is no existing area to keep line info, get some. */
326   if (b->line_start == NULL)
327     b->line_start = b->curr_line = new_line_control ();
328
329   /* If existing area for lines is full, get more. */
330   if (b->curr_line->used == CTRL_SIZE)
331     {
332       b->curr_line->next = new_line_control ();
333       b->curr_line = b->curr_line->next;
334     }
335
336   l = b->curr_line;
337
338   /* Record the start of the line, and update counters. */
339   l->starts[l->insert_index].str = line_start;
340   l->starts[l->insert_index].len = line_len;
341   l->used++;
342   l->insert_index++;
343 }
344
345 /* Scan the buffer in B for newline characters
346    and record the line start locations and lengths in B.
347    Return the number of lines found in this buffer.
348
349    There may be an incomplete line at the end of the buffer;
350    a pointer is kept to this area, which will be used when
351    the next buffer is filled. */
352
353 static size_t
354 record_line_starts (struct buffer_record *b)
355 {
356   char *line_start;             /* Start of current line. */
357   char *line_end;               /* End of each line found. */
358   size_t bytes_left;            /* Length of incomplete last line. */
359   size_t lines;                 /* Number of lines found. */
360   size_t line_length;           /* Length of each line found. */
361
362   if (b->bytes_used == 0)
363     return 0;
364
365   lines = 0;
366   line_start = b->buffer;
367   bytes_left = b->bytes_used;
368
369   for (;;)
370     {
371       line_end = memchr (line_start, '\n', bytes_left);
372       if (line_end == NULL)
373         break;
374       line_length = line_end - line_start + 1;
375       keep_new_line (b, line_start, line_length);
376       bytes_left -= line_length;
377       line_start = line_end + 1;
378       lines++;
379     }
380
381   /* Check for an incomplete last line. */
382   if (bytes_left)
383     {
384       if (have_read_eof)
385         {
386           keep_new_line (b, line_start, bytes_left);
387           lines++;
388         }
389       else
390         save_to_hold_area (line_start, bytes_left);
391     }
392
393   b->num_lines = lines;
394   b->first_available = b->start_line = last_line_number + 1;
395   last_line_number += lines;
396
397   return lines;
398 }
399
400 /* Return a new buffer with room to store SIZE bytes, plus
401    an extra byte for safety. */
402
403 static struct buffer_record *
404 create_new_buffer (size_t size)
405 {
406   struct buffer_record *new_buffer = xmalloc (sizeof *new_buffer);
407
408   new_buffer->buffer = xmalloc (size + 1);
409
410   new_buffer->bytes_alloc = size;
411   new_buffer->line_start = new_buffer->curr_line = NULL;
412
413   return new_buffer;
414 }
415
416 /* Return a new buffer of at least MINSIZE bytes.  If a buffer of at
417    least that size is currently free, use it, otherwise create a new one. */
418
419 static struct buffer_record *
420 get_new_buffer (size_t min_size)
421 {
422   struct buffer_record *new_buffer; /* Buffer to return. */
423   size_t alloc_size;    /* Actual size that will be requested. */
424
425   alloc_size = START_SIZE;
426   if (alloc_size < min_size)
427     {
428       size_t s = min_size - alloc_size + INCR_SIZE - 1;
429       alloc_size += s - s % INCR_SIZE;
430     }
431
432   new_buffer = create_new_buffer (alloc_size);
433
434   new_buffer->num_lines = 0;
435   new_buffer->bytes_used = 0;
436   new_buffer->start_line = new_buffer->first_available = last_line_number + 1;
437   new_buffer->next = NULL;
438
439   return new_buffer;
440 }
441
442 static void
443 free_buffer (struct buffer_record *buf)
444 {
445   free (buf->buffer);
446 }
447
448 /* Append buffer BUF to the linked list of buffers that contain
449    some data yet to be processed. */
450
451 static void
452 save_buffer (struct buffer_record *buf)
453 {
454   struct buffer_record *p;
455
456   buf->next = NULL;
457   buf->curr_line = buf->line_start;
458
459   if (head == NULL)
460     head = buf;
461   else
462     {
463       for (p = head; p->next; p = p->next)
464         /* Do nothing. */ ;
465       p->next = buf;
466     }
467 }
468
469 /* Fill a buffer of input.
470
471    Set the initial size of the buffer to a default.
472    Fill the buffer (from the hold area and input stream)
473    and find the individual lines.
474    If no lines are found (the buffer is too small to hold the next line),
475    release the current buffer (whose contents would have been put in the
476    hold area) and repeat the process with another large buffer until at least
477    one entire line has been read.
478
479    Return true if a new buffer was obtained, otherwise false
480    (in which case end-of-file must have been encountered). */
481
482 static bool
483 load_buffer (void)
484 {
485   struct buffer_record *b;
486   size_t bytes_wanted = START_SIZE; /* Minimum buffer size. */
487   size_t bytes_avail;           /* Size of new buffer created. */
488   size_t lines_found;           /* Number of lines in this new buffer. */
489   char *p;                      /* Place to load into buffer. */
490
491   if (have_read_eof)
492     return false;
493
494   /* We must make the buffer at least as large as the amount of data
495      in the partial line left over from the last call. */
496   if (bytes_wanted < hold_count)
497     bytes_wanted = hold_count;
498
499   do
500     {
501       b = get_new_buffer (bytes_wanted);
502       bytes_avail = b->bytes_alloc; /* Size of buffer returned. */
503       p = b->buffer;
504
505       /* First check the `holding' area for a partial line. */
506       if (hold_count)
507         {
508           if (p != hold_area)
509             memcpy (p, hold_area, hold_count);
510           p += hold_count;
511           b->bytes_used += hold_count;
512           bytes_avail -= hold_count;
513           hold_count = 0;
514         }
515
516       b->bytes_used += read_input (p, bytes_avail);
517
518       lines_found = record_line_starts (b);
519       bytes_wanted = b->bytes_alloc * 2;
520       if (!lines_found)
521         free_buffer (b);
522     }
523   while (!lines_found && !have_read_eof);
524
525   if (lines_found)
526     save_buffer (b);
527
528   return lines_found != 0;
529 }
530
531 /* Return the line number of the first line that has not yet been retrieved. */
532
533 static uintmax_t
534 get_first_line_in_buffer (void)
535 {
536   if (head == NULL && !load_buffer ())
537     error (EXIT_FAILURE, errno, _("input disappeared"));
538
539   return head->first_available;
540 }
541
542 /* Return a pointer to the logical first line in the buffer and make the
543    next line the logical first line.
544    Return NULL if there is no more input. */
545
546 static struct cstring *
547 remove_line (void)
548 {
549   /* If non-NULL, this is the buffer for which the previous call
550      returned the final line.  So now, presuming that line has been
551      processed, we can free the buffer and reset this pointer.  */
552   static struct buffer_record *prev_buf = NULL;
553
554   struct cstring *line;         /* Return value. */
555   struct line *l;               /* For convenience. */
556
557   if (prev_buf)
558     {
559       free_buffer (prev_buf);
560       prev_buf = NULL;
561     }
562
563   if (head == NULL && !load_buffer ())
564     return NULL;
565
566   if (current_line < head->first_available)
567     current_line = head->first_available;
568
569   ++(head->first_available);
570
571   l = head->curr_line;
572
573   line = &l->starts[l->retrieve_index];
574
575   /* Advance index to next line. */
576   if (++l->retrieve_index == l->used)
577     {
578       /* Go on to the next line record. */
579       head->curr_line = l->next;
580       if (head->curr_line == NULL || head->curr_line->used == 0)
581         {
582           /* Go on to the next data block.
583              but first record the current one so we can free it
584              once the line we're returning has been processed.  */
585           prev_buf = head;
586           head = head->next;
587         }
588     }
589
590   return line;
591 }
592
593 /* Search the buffers for line LINENUM, reading more input if necessary.
594    Return a pointer to the line, or NULL if it is not found in the file. */
595
596 static struct cstring *
597 find_line (uintmax_t linenum)
598 {
599   struct buffer_record *b;
600
601   if (head == NULL && !load_buffer ())
602     return NULL;
603
604   if (linenum < head->start_line)
605     return NULL;
606
607   for (b = head;;)
608     {
609       if (linenum < b->start_line + b->num_lines)
610         {
611           /* The line is in this buffer. */
612           struct line *l;
613           size_t offset;        /* How far into the buffer the line is. */
614
615           l = b->line_start;
616           offset = linenum - b->start_line;
617           /* Find the control record. */
618           while (offset >= CTRL_SIZE)
619             {
620               l = l->next;
621               offset -= CTRL_SIZE;
622             }
623           return &l->starts[offset];
624         }
625       if (b->next == NULL && !load_buffer ())
626         return NULL;
627       b = b->next;              /* Try the next data block. */
628     }
629 }
630
631 /* Return true if at least one more line is available for input. */
632
633 static bool
634 no_more_lines (void)
635 {
636   return find_line (current_line + 1) == NULL;
637 }
638
639 /* Open NAME as standard input.  */
640
641 static void
642 set_input_file (const char *name)
643 {
644   if (! STREQ (name, "-") && fd_reopen (STDIN_FILENO, name, O_RDONLY, 0) < 0)
645     error (EXIT_FAILURE, errno, _("cannot open %s for reading"), quote (name));
646 }
647
648 /* Write all lines from the beginning of the buffer up to, but
649    not including, line LAST_LINE, to the current output file.
650    If IGNORE is true, do not output lines selected here.
651    ARGNUM is the index in ARGV of the current pattern. */
652
653 static void
654 write_to_file (uintmax_t last_line, bool ignore, int argnum)
655 {
656   struct cstring *line;
657   uintmax_t first_line;         /* First available input line. */
658   uintmax_t lines;              /* Number of lines to output. */
659   uintmax_t i;
660
661   first_line = get_first_line_in_buffer ();
662
663   if (first_line > last_line)
664     {
665       error (0, 0, _("%s: line number out of range"), global_argv[argnum]);
666       cleanup_fatal ();
667     }
668
669   lines = last_line - first_line;
670
671   for (i = 0; i < lines; i++)
672     {
673       line = remove_line ();
674       if (line == NULL)
675         {
676           error (0, 0, _("%s: line number out of range"), global_argv[argnum]);
677           cleanup_fatal ();
678         }
679       if (!ignore)
680         save_line_to_file (line);
681     }
682 }
683
684 /* Output any lines left after all regexps have been processed. */
685
686 static void
687 dump_rest_of_file (void)
688 {
689   struct cstring *line;
690
691   while ((line = remove_line ()) != NULL)
692     save_line_to_file (line);
693 }
694
695 /* Handle an attempt to read beyond EOF under the control of record P,
696    on iteration REPETITION if nonzero. */
697
698 static void handle_line_error (const struct control *, uintmax_t)
699      ATTRIBUTE_NORETURN;
700 static void
701 handle_line_error (const struct control *p, uintmax_t repetition)
702 {
703   char buf[INT_BUFSIZE_BOUND (uintmax_t)];
704
705   fprintf (stderr, _("%s: %s: line number out of range"),
706            program_name, quote (umaxtostr (p->lines_required, buf)));
707   if (repetition)
708     fprintf (stderr, _(" on repetition %s\n"), umaxtostr (repetition, buf));
709   else
710     fprintf (stderr, "\n");
711
712   cleanup_fatal ();
713 }
714
715 /* Determine the line number that marks the end of this file,
716    then get those lines and save them to the output file.
717    P is the control record.
718    REPETITION is the repetition number. */
719
720 static void
721 process_line_count (const struct control *p, uintmax_t repetition)
722 {
723   uintmax_t linenum;
724   uintmax_t last_line_to_save = p->lines_required * (repetition + 1);
725   struct cstring *line;
726
727   create_output_file ();
728
729   linenum = get_first_line_in_buffer ();
730
731   while (linenum++ < last_line_to_save)
732     {
733       line = remove_line ();
734       if (line == NULL)
735         handle_line_error (p, repetition);
736       save_line_to_file (line);
737     }
738
739   close_output_file ();
740
741   /* Ensure that the line number specified is not 1 greater than
742      the number of lines in the file. */
743   if (no_more_lines ())
744     handle_line_error (p, repetition);
745 }
746
747 static void regexp_error (struct control *, uintmax_t, bool) ATTRIBUTE_NORETURN;
748 static void
749 regexp_error (struct control *p, uintmax_t repetition, bool ignore)
750 {
751   fprintf (stderr, _("%s: %s: match not found"),
752            program_name, quote (global_argv[p->argnum]));
753
754   if (repetition)
755     {
756       char buf[INT_BUFSIZE_BOUND (uintmax_t)];
757       fprintf (stderr, _(" on repetition %s\n"), umaxtostr (repetition, buf));
758     }
759   else
760     fprintf (stderr, "\n");
761
762   if (!ignore)
763     {
764       dump_rest_of_file ();
765       close_output_file ();
766     }
767   cleanup_fatal ();
768 }
769
770 /* Read the input until a line matches the regexp in P, outputting
771    it unless P->IGNORE is true.
772    REPETITION is this repeat-count; 0 means the first time. */
773
774 static void
775 process_regexp (struct control *p, uintmax_t repetition)
776 {
777   struct cstring *line;         /* From input file. */
778   size_t line_len;              /* To make "$" in regexps work. */
779   uintmax_t break_line;         /* First line number of next file. */
780   bool ignore = p->ignore;      /* If true, skip this section. */
781   int ret;
782
783   if (!ignore)
784     create_output_file ();
785
786   /* If there is no offset for the regular expression, or
787      it is positive, then it is not necessary to buffer the lines. */
788
789   if (p->offset >= 0)
790     {
791       for (;;)
792         {
793           line = find_line (++current_line);
794           if (line == NULL)
795             {
796               if (p->repeat_forever)
797                 {
798                   if (!ignore)
799                     {
800                       dump_rest_of_file ();
801                       close_output_file ();
802                     }
803                   exit (EXIT_SUCCESS);
804                 }
805               else
806                 regexp_error (p, repetition, ignore);
807             }
808           line_len = line->len;
809           if (line->str[line_len - 1] == '\n')
810             line_len--;
811           ret = re_search (&p->re_compiled, line->str, line_len,
812                            0, line_len, NULL);
813           if (ret == -2)
814             {
815               error (0, 0, _("error in regular expression search"));
816               cleanup_fatal ();
817             }
818           if (ret == -1)
819             {
820               line = remove_line ();
821               if (!ignore)
822                 save_line_to_file (line);
823             }
824           else
825             break;
826         }
827     }
828   else
829     {
830       /* Buffer the lines. */
831       for (;;)
832         {
833           line = find_line (++current_line);
834           if (line == NULL)
835             {
836               if (p->repeat_forever)
837                 {
838                   if (!ignore)
839                     {
840                       dump_rest_of_file ();
841                       close_output_file ();
842                     }
843                   exit (EXIT_SUCCESS);
844                 }
845               else
846                 regexp_error (p, repetition, ignore);
847             }
848           line_len = line->len;
849           if (line->str[line_len - 1] == '\n')
850             line_len--;
851           ret = re_search (&p->re_compiled, line->str, line_len,
852                            0, line_len, NULL);
853           if (ret == -2)
854             {
855               error (0, 0, _("error in regular expression search"));
856               cleanup_fatal ();
857             }
858           if (ret >= 0)
859             break;
860         }
861     }
862
863   /* Account for any offset from this regexp. */
864   break_line = current_line + p->offset;
865
866   write_to_file (break_line, ignore, p->argnum);
867
868   if (!ignore)
869     close_output_file ();
870
871   if (p->offset > 0)
872     current_line = break_line;
873 }
874
875 /* Split the input file according to the control records we have built. */
876
877 static void
878 split_file (void)
879 {
880   size_t i;
881
882   for (i = 0; i < control_used; i++)
883     {
884       uintmax_t j;
885       if (controls[i].regexpr)
886         {
887           for (j = 0; (controls[i].repeat_forever
888                        || j <= controls[i].repeat); j++)
889             process_regexp (&controls[i], j);
890         }
891       else
892         {
893           for (j = 0; (controls[i].repeat_forever
894                        || j <= controls[i].repeat); j++)
895             process_line_count (&controls[i], j);
896         }
897     }
898
899   create_output_file ();
900   dump_rest_of_file ();
901   close_output_file ();
902 }
903
904 /* Return the name of output file number NUM.
905
906    This function is called from a signal handler, so it should invoke
907    only reentrant functions that are async-signal-safe.  POSIX does
908    not guarantee this for the functions called below, but we don't
909    know of any hosts where this implementation isn't safe.  */
910
911 static char *
912 make_filename (unsigned int num)
913 {
914   strcpy (filename_space, prefix);
915   if (suffix)
916     sprintf (filename_space + strlen (prefix), suffix, num);
917   else
918     sprintf (filename_space + strlen (prefix), "%0*u", digits, num);
919   return filename_space;
920 }
921
922 /* Create the next output file. */
923
924 static void
925 create_output_file (void)
926 {
927   sigset_t oldset;
928   bool fopen_ok;
929   int fopen_errno;
930
931   output_filename = make_filename (files_created);
932
933   /* Create the output file in a critical section, to avoid races.  */
934   sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
935   output_stream = fopen (output_filename, "w");
936   fopen_ok = (output_stream != NULL);
937   fopen_errno = errno;
938   files_created += fopen_ok;
939   sigprocmask (SIG_SETMASK, &oldset, NULL);
940
941   if (! fopen_ok)
942     {
943       error (0, fopen_errno, "%s", output_filename);
944       cleanup_fatal ();
945     }
946   bytes_written = 0;
947 }
948
949 /* If requested, delete all the files we have created.  This function
950    must be called only from critical sections.  */
951
952 static void
953 delete_all_files (bool in_signal_handler)
954 {
955   unsigned int i;
956
957   if (! remove_files)
958     return;
959
960   for (i = 0; i < files_created; i++)
961     {
962       const char *name = make_filename (i);
963       if (unlink (name) != 0 && !in_signal_handler)
964         error (0, errno, "%s", name);
965     }
966
967   files_created = 0;
968 }
969
970 /* Close the current output file and print the count
971    of characters in this file. */
972
973 static void
974 close_output_file (void)
975 {
976   if (output_stream)
977     {
978       if (ferror (output_stream))
979         {
980           error (0, 0, _("write error for %s"), quote (output_filename));
981           output_stream = NULL;
982           cleanup_fatal ();
983         }
984       if (fclose (output_stream) != 0)
985         {
986           error (0, errno, "%s", output_filename);
987           output_stream = NULL;
988           cleanup_fatal ();
989         }
990       if (bytes_written == 0 && elide_empty_files)
991         {
992           sigset_t oldset;
993           bool unlink_ok;
994           int unlink_errno;
995
996           /* Remove the output file in a critical section, to avoid races.  */
997           sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
998           unlink_ok = (unlink (output_filename) == 0);
999           unlink_errno = errno;
1000           files_created -= unlink_ok;
1001           sigprocmask (SIG_SETMASK, &oldset, NULL);
1002
1003           if (! unlink_ok)
1004             error (0, unlink_errno, "%s", output_filename);
1005         }
1006       else
1007         {
1008           if (!suppress_count)
1009             {
1010               char buf[INT_BUFSIZE_BOUND (uintmax_t)];
1011               fprintf (stdout, "%s\n", umaxtostr (bytes_written, buf));
1012             }
1013         }
1014       output_stream = NULL;
1015     }
1016 }
1017
1018 /* Save line LINE to the output file and
1019    increment the character count for the current file. */
1020
1021 static void
1022 save_line_to_file (const struct cstring *line)
1023 {
1024   fwrite (line->str, sizeof (char), line->len, output_stream);
1025   bytes_written += line->len;
1026 }
1027
1028 /* Return a new, initialized control record. */
1029
1030 static struct control *
1031 new_control_record (void)
1032 {
1033   static size_t control_allocated = 0; /* Total space allocated. */
1034   struct control *p;
1035
1036   if (control_used == control_allocated)
1037     controls = x2nrealloc (controls, &control_allocated, sizeof *controls);
1038   p = &controls[control_used++];
1039   p->regexpr = NULL;
1040   p->repeat = 0;
1041   p->repeat_forever = false;
1042   p->lines_required = 0;
1043   p->offset = 0;
1044   return p;
1045 }
1046
1047 /* Check if there is a numeric offset after a regular expression.
1048    STR is the entire command line argument.
1049    P is the control record for this regular expression.
1050    NUM is the numeric part of STR. */
1051
1052 static void
1053 check_for_offset (struct control *p, const char *str, const char *num)
1054 {
1055   if (xstrtoimax (num, NULL, 10, &p->offset, "") != LONGINT_OK)
1056     error (EXIT_FAILURE, 0, _("%s: integer expected after delimiter"), str);
1057 }
1058
1059 /* Given that the first character of command line arg STR is '{',
1060    make sure that the rest of the string is a valid repeat count
1061    and store its value in P.
1062    ARGNUM is the ARGV index of STR. */
1063
1064 static void
1065 parse_repeat_count (int argnum, struct control *p, char *str)
1066 {
1067   uintmax_t val;
1068   char *end;
1069
1070   end = str + strlen (str) - 1;
1071   if (*end != '}')
1072     error (EXIT_FAILURE, 0, _("%s: `}' is required in repeat count"), str);
1073   *end = '\0';
1074
1075   if (str+1 == end-1 && *(str+1) == '*')
1076     p->repeat_forever = true;
1077   else
1078     {
1079       if (xstrtoumax (str + 1, NULL, 10, &val, "") != LONGINT_OK)
1080         {
1081           error (EXIT_FAILURE, 0,
1082                  _("%s}: integer required between `{' and `}'"),
1083                  global_argv[argnum]);
1084         }
1085       p->repeat = val;
1086     }
1087
1088   *end = '}';
1089 }
1090
1091 /* Extract the regular expression from STR and check for a numeric offset.
1092    STR should start with the regexp delimiter character.
1093    Return a new control record for the regular expression.
1094    ARGNUM is the ARGV index of STR.
1095    Unless IGNORE is true, mark these lines for output. */
1096
1097 static struct control *
1098 extract_regexp (int argnum, bool ignore, char *str)
1099 {
1100   size_t len;                   /* Number of bytes in this regexp. */
1101   char delim = *str;
1102   char *closing_delim;
1103   struct control *p;
1104   const char *err;
1105
1106   closing_delim = strrchr (str + 1, delim);
1107   if (closing_delim == NULL)
1108     error (EXIT_FAILURE, 0,
1109            _("%s: closing delimiter `%c' missing"), str, delim);
1110
1111   len = closing_delim - str - 1;
1112   p = new_control_record ();
1113   p->argnum = argnum;
1114   p->ignore = ignore;
1115
1116   p->regexpr = xmalloc (len + 1);
1117   strncpy (p->regexpr, str + 1, len);
1118   p->re_compiled.allocated = len * 2;
1119   p->re_compiled.buffer = xmalloc (p->re_compiled.allocated);
1120   p->re_compiled.fastmap = xmalloc (1 << CHAR_BIT);
1121   p->re_compiled.translate = NULL;
1122   err = re_compile_pattern (p->regexpr, len, &p->re_compiled);
1123   if (err)
1124     {
1125       error (0, 0, _("%s: invalid regular expression: %s"), str, err);
1126       cleanup_fatal ();
1127     }
1128
1129   if (closing_delim[1])
1130     check_for_offset (p, str, closing_delim + 1);
1131
1132   return p;
1133 }
1134
1135 /* Extract the break patterns from args START through ARGC - 1 of ARGV.
1136    After each pattern, check if the next argument is a repeat count. */
1137
1138 static void
1139 parse_patterns (int argc, int start, char **argv)
1140 {
1141   int i;                        /* Index into ARGV. */
1142   struct control *p;            /* New control record created. */
1143   uintmax_t val;
1144   static uintmax_t last_val = 0;
1145
1146   for (i = start; i < argc; i++)
1147     {
1148       if (*argv[i] == '/' || *argv[i] == '%')
1149         {
1150           p = extract_regexp (i, *argv[i] == '%', argv[i]);
1151         }
1152       else
1153         {
1154           p = new_control_record ();
1155           p->argnum = i;
1156
1157           if (xstrtoumax (argv[i], NULL, 10, &val, "") != LONGINT_OK)
1158             error (EXIT_FAILURE, 0, _("%s: invalid pattern"), argv[i]);
1159           if (val == 0)
1160             error (EXIT_FAILURE, 0,
1161                    _("%s: line number must be greater than zero"),
1162                    argv[i]);
1163           if (val < last_val)
1164             {
1165               char buf[INT_BUFSIZE_BOUND (uintmax_t)];
1166               error (EXIT_FAILURE, 0,
1167                _("line number %s is smaller than preceding line number, %s"),
1168                      quote (argv[i]), umaxtostr (last_val, buf));
1169             }
1170
1171           if (val == last_val)
1172             error (0, 0,
1173            _("warning: line number %s is the same as preceding line number"),
1174                    quote (argv[i]));
1175
1176           last_val = val;
1177
1178           p->lines_required = val;
1179         }
1180
1181       if (i + 1 < argc && *argv[i + 1] == '{')
1182         {
1183           /* We have a repeat count. */
1184           i++;
1185           parse_repeat_count (i, p, argv[i]);
1186         }
1187     }
1188 }
1189
1190 static unsigned int
1191 get_format_flags (char **format_ptr)
1192 {
1193   unsigned int count = 0;
1194
1195   for (; **format_ptr; (*format_ptr)++)
1196     {
1197       switch (**format_ptr)
1198         {
1199         case '-':
1200           break;
1201
1202         case '+':
1203         case ' ':
1204           count |= 1;
1205           break;
1206
1207         case '#':
1208           count |= 2;   /* Allow for 0x prefix preceding an `x' conversion.  */
1209           break;
1210
1211         default:
1212           return count;
1213         }
1214     }
1215   return count;
1216 }
1217
1218 static size_t
1219 get_format_width (char **format_ptr)
1220 {
1221   unsigned long int val = 0;
1222
1223   if (ISDIGIT (**format_ptr)
1224       && (xstrtoul (*format_ptr, format_ptr, 10, &val, NULL) != LONGINT_OK
1225           || SIZE_MAX < val))
1226     error (EXIT_FAILURE, 0, _("invalid format width"));
1227
1228   /* Allow for enough octal digits to represent the value of UINT_MAX,
1229      even if the field width is less than that.  */
1230   return MAX (val, (sizeof (unsigned int) * CHAR_BIT + 2) / 3);
1231 }
1232
1233 static size_t
1234 get_format_prec (char **format_ptr)
1235 {
1236   if (**format_ptr != '.')
1237     return 0;
1238   (*format_ptr)++;
1239
1240   if (! ISDIGIT (**format_ptr))
1241     return 0;
1242   else
1243     {
1244       unsigned long int val;
1245       if (xstrtoul (*format_ptr, format_ptr, 10, &val, NULL) != LONGINT_OK
1246           || SIZE_MAX < val)
1247         error (EXIT_FAILURE, 0, _("invalid format precision"));
1248       return val;
1249     }
1250 }
1251
1252 static void
1253 get_format_conv_type (char **format_ptr)
1254 {
1255   unsigned char ch = *(*format_ptr)++;
1256
1257   switch (ch)
1258     {
1259     case 'd':
1260     case 'i':
1261     case 'o':
1262     case 'u':
1263     case 'x':
1264     case 'X':
1265       break;
1266
1267     case 0:
1268       error (EXIT_FAILURE, 0, _("missing conversion specifier in suffix"));
1269       break;
1270
1271     default:
1272       if (ISPRINT (ch))
1273         error (EXIT_FAILURE, 0,
1274                _("invalid conversion specifier in suffix: %c"), ch);
1275       else
1276         error (EXIT_FAILURE, 0,
1277                _("invalid conversion specifier in suffix: \\%.3o"), ch);
1278     }
1279 }
1280
1281 static size_t
1282 max_out (char *format)
1283 {
1284   size_t out_count = 0;
1285   bool percent = false;
1286
1287   while (*format)
1288     {
1289       if (*format++ != '%')
1290         out_count++;
1291       else if (*format == '%')
1292         {
1293           format++;
1294           out_count++;
1295         }
1296       else
1297         {
1298           if (percent)
1299             error (EXIT_FAILURE, 0,
1300                    _("too many %% conversion specifications in suffix"));
1301           percent = true;
1302           out_count += get_format_flags (&format);
1303           {
1304             size_t width = get_format_width (&format);
1305             size_t prec = get_format_prec (&format);
1306
1307             out_count += MAX (width, prec);
1308           }
1309           get_format_conv_type (&format);
1310         }
1311     }
1312
1313   if (! percent)
1314     error (EXIT_FAILURE, 0,
1315            _("missing %% conversion specification in suffix"));
1316
1317   return out_count;
1318 }
1319
1320 int
1321 main (int argc, char **argv)
1322 {
1323   int optc;
1324   unsigned long int val;
1325
1326   initialize_main (&argc, &argv);
1327   program_name = argv[0];
1328   setlocale (LC_ALL, "");
1329   bindtextdomain (PACKAGE, LOCALEDIR);
1330   textdomain (PACKAGE);
1331
1332   atexit (close_stdout);
1333
1334   global_argv = argv;
1335   controls = NULL;
1336   control_used = 0;
1337   suppress_count = false;
1338   remove_files = true;
1339   prefix = DEFAULT_PREFIX;
1340
1341   while ((optc = getopt_long (argc, argv, "f:b:kn:sqz", longopts, NULL)) != -1)
1342     switch (optc)
1343       {
1344       case 'f':
1345         prefix = optarg;
1346         break;
1347
1348       case 'b':
1349         suffix = optarg;
1350         break;
1351
1352       case 'k':
1353         remove_files = false;
1354         break;
1355
1356       case 'n':
1357         if (xstrtoul (optarg, NULL, 10, &val, "") != LONGINT_OK
1358             || val > INT_MAX)
1359           error (EXIT_FAILURE, 0, _("%s: invalid number"), optarg);
1360         digits = val;
1361         break;
1362
1363       case 's':
1364       case 'q':
1365         suppress_count = true;
1366         break;
1367
1368       case 'z':
1369         elide_empty_files = true;
1370         break;
1371
1372       case_GETOPT_HELP_CHAR;
1373
1374       case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1375
1376       default:
1377         usage (EXIT_FAILURE);
1378       }
1379
1380   if (argc - optind < 2)
1381     {
1382       if (argc <= optind)
1383         error (0, 0, _("missing operand"));
1384       else
1385         error (0, 0, _("missing operand after %s"), quote (argv[argc - 1]));
1386       usage (EXIT_FAILURE);
1387     }
1388
1389   if (suffix)
1390     filename_space = xmalloc (strlen (prefix) + max_out (suffix) + 2);
1391   else
1392     filename_space = xmalloc (strlen (prefix) + digits + 2);
1393
1394   set_input_file (argv[optind++]);
1395
1396   parse_patterns (argc, optind, argv);
1397
1398   {
1399     int i;
1400     static int const sig[] = { SIGHUP, SIGINT, SIGQUIT, SIGTERM };
1401     enum { nsigs = sizeof sig / sizeof sig[0] };
1402
1403 #if SA_NOCLDSTOP
1404     struct sigaction act;
1405
1406     sigemptyset (&caught_signals);
1407     for (i = 0; i < nsigs; i++)
1408       {
1409         sigaction (sig[i], NULL, &act);
1410         if (act.sa_handler != SIG_IGN)
1411           sigaddset (&caught_signals, sig[i]);
1412       }
1413
1414     act.sa_handler = interrupt_handler;
1415     act.sa_mask = caught_signals;
1416     act.sa_flags = 0;
1417
1418     for (i = 0; i < nsigs; i++)
1419       if (sigismember (&caught_signals, sig[i]))
1420         sigaction (sig[i], &act, NULL);
1421 #else
1422     for (i = 0; i < nsigs; i++)
1423       if (signal (sig[i], SIG_IGN) != SIG_IGN)
1424         {
1425           signal (sig[i], interrupt_handler);
1426           siginterrupt (sig[i], 1);
1427         }
1428 #endif
1429   }
1430
1431   split_file ();
1432
1433   if (close (STDIN_FILENO) != 0)
1434     {
1435       error (0, errno, _("read error"));
1436       cleanup_fatal ();
1437     }
1438
1439   exit (EXIT_SUCCESS);
1440 }
1441
1442 void
1443 usage (int status)
1444 {
1445   if (status != EXIT_SUCCESS)
1446     fprintf (stderr, _("Try `%s --help' for more information.\n"),
1447              program_name);
1448   else
1449     {
1450       printf (_("\
1451 Usage: %s [OPTION]... FILE PATTERN...\n\
1452 "),
1453               program_name);
1454       fputs (_("\
1455 Output pieces of FILE separated by PATTERN(s) to files `xx00', `xx01', ...,\n\
1456 and output byte counts of each piece to standard output.\n\
1457 \n\
1458 "), stdout);
1459       fputs (_("\
1460 Mandatory arguments to long options are mandatory for short options too.\n\
1461 "), stdout);
1462       fputs (_("\
1463   -b, --suffix-format=FORMAT use sprintf FORMAT instead of %02d\n\
1464   -f, --prefix=PREFIX        use PREFIX instead of `xx'\n\
1465   -k, --keep-files           do not remove output files on errors\n\
1466 "), stdout);
1467       fputs (_("\
1468   -n, --digits=DIGITS        use specified number of digits instead of 2\n\
1469   -s, --quiet, --silent      do not print counts of output file sizes\n\
1470   -z, --elide-empty-files    remove empty output files\n\
1471 "), stdout);
1472       fputs (HELP_OPTION_DESCRIPTION, stdout);
1473       fputs (VERSION_OPTION_DESCRIPTION, stdout);
1474       fputs (_("\
1475 \n\
1476 Read standard input if FILE is -.  Each PATTERN may be:\n\
1477 "), stdout);
1478       fputs (_("\
1479 \n\
1480   INTEGER            copy up to but not including specified line number\n\
1481   /REGEXP/[OFFSET]   copy up to but not including a matching line\n\
1482   %REGEXP%[OFFSET]   skip to, but not including a matching line\n\
1483   {INTEGER}          repeat the previous pattern specified number of times\n\
1484   {*}                repeat the previous pattern as many times as possible\n\
1485 \n\
1486 A line OFFSET is a required `+' or `-' followed by a positive integer.\n\
1487 "), stdout);
1488       printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
1489     }
1490   exit (status);
1491 }