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