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