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