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