Update AUTHORS definition to be a comma-separated list of strings and/or update
[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 AUTHORS "Stuart Kemp", "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) || fclose (output_stream) == EOF)
990         {
991           error (0, errno, _("write error for `%s'"), output_filename);
992           output_stream = NULL;
993           cleanup_fatal ();
994         }
995       if (bytes_written == 0 && elide_empty_files)
996         {
997           if (unlink (output_filename))
998             error (0, errno, "%s", output_filename);
999           files_created--;
1000         }
1001       else
1002         {
1003           /* FIXME: if we write to stdout here, we have to close stdout
1004              and check for errors.  */
1005           if (!suppress_count)
1006             fprintf (stdout, "%d\n", bytes_written);
1007         }
1008       output_stream = NULL;
1009     }
1010 }
1011
1012 /* Save line LINE to the output file and
1013    increment the character count for the current file. */
1014
1015 static void
1016 save_line_to_file (const struct cstring *line)
1017 {
1018   fwrite (line->str, sizeof (char), line->len, output_stream);
1019   bytes_written += line->len;
1020 }
1021
1022 /* Return a new, initialized control record. */
1023
1024 static struct control *
1025 new_control_record (void)
1026 {
1027   static unsigned control_allocated = 0; /* Total space allocated. */
1028   struct control *p;
1029
1030   if (control_allocated == 0)
1031     {
1032       control_allocated = ALLOC_SIZE;
1033       controls = (struct control *)
1034         xmalloc (sizeof (struct control) * control_allocated);
1035     }
1036   else if (control_used == control_allocated)
1037     {
1038       control_allocated += ALLOC_SIZE;
1039       controls = (struct control *)
1040         xrealloc (controls,
1041                   sizeof (struct control) * control_allocated);
1042     }
1043   p = &controls[control_used++];
1044   p->regexpr = NULL;
1045   p->repeat = 0;
1046   p->repeat_forever = 0;
1047   p->lines_required = 0;
1048   p->offset = 0;
1049   return p;
1050 }
1051
1052 /* Check if there is a numeric offset after a regular expression.
1053    STR is the entire command line argument.
1054    P is the control record for this regular expression.
1055    NUM is the numeric part of STR. */
1056
1057 static void
1058 check_for_offset (struct control *p, const char *str, const char *num)
1059 {
1060   unsigned long val;
1061
1062   if (*num != '-' && *num != '+')
1063     error (EXIT_FAILURE, 0, _("%s: `+' or `-' expected after delimeter"), str);
1064
1065   if (xstrtoul (num + 1, NULL, 10, &val, "") != LONGINT_OK
1066       || val > UINT_MAX)
1067     error (EXIT_FAILURE, 0, _("%s: integer expected after `%c'"), str, *num);
1068   p->offset = (unsigned int) val;
1069
1070   if (*num == '-')
1071     p->offset = -p->offset;
1072 }
1073
1074 /* Given that the first character of command line arg STR is '{',
1075    make sure that the rest of the string is a valid repeat count
1076    and store its value in P.
1077    ARGNUM is the ARGV index of STR. */
1078
1079 static void
1080 parse_repeat_count (int argnum, struct control *p, char *str)
1081 {
1082   uintmax_t val;
1083   char *end;
1084
1085   end = str + strlen (str) - 1;
1086   if (*end != '}')
1087     error (EXIT_FAILURE, 0, _("%s: `}' is required in repeat count"), str);
1088   *end = '\0';
1089
1090   if (str+1 == end-1 && *(str+1) == '*')
1091     p->repeat_forever = 1;
1092   else
1093     {
1094       if (xstrtoumax (str + 1, NULL, 10, &val, "") != LONGINT_OK)
1095         {
1096           error (EXIT_FAILURE, 0,
1097                  _("%s}: integer required between `{' and `}'"),
1098                  global_argv[argnum]);
1099         }
1100       p->repeat = val;
1101     }
1102
1103   *end = '}';
1104 }
1105
1106 /* Extract the regular expression from STR and check for a numeric offset.
1107    STR should start with the regexp delimiter character.
1108    Return a new control record for the regular expression.
1109    ARGNUM is the ARGV index of STR.
1110    Unless IGNORE is TRUE, mark these lines for output. */
1111
1112 static struct control *
1113 extract_regexp (int argnum, boolean ignore, char *str)
1114 {
1115   int len;                      /* Number of chars in this regexp. */
1116   char delim = *str;
1117   char *closing_delim;
1118   struct control *p;
1119   const char *err;
1120
1121   closing_delim = strrchr (str + 1, delim);
1122   if (closing_delim == NULL)
1123     error (EXIT_FAILURE, 0,
1124            _("%s: closing delimeter `%c' missing"), str, delim);
1125
1126   len = closing_delim - str - 1;
1127   p = new_control_record ();
1128   p->argnum = argnum;
1129   p->ignore = ignore;
1130
1131   p->regexpr = xmalloc ((unsigned) (len + 1));
1132   strncpy (p->regexpr, str + 1, len);
1133   p->re_compiled.allocated = len * 2;
1134   p->re_compiled.buffer = xmalloc (p->re_compiled.allocated);
1135   p->re_compiled.fastmap = xmalloc (256);
1136   p->re_compiled.translate = 0;
1137   err = re_compile_pattern (p->regexpr, len, &p->re_compiled);
1138   if (err)
1139     {
1140       error (0, 0, _("%s: invalid regular expression: %s"), str, err);
1141       cleanup_fatal ();
1142     }
1143
1144   if (closing_delim[1])
1145     check_for_offset (p, str, closing_delim + 1);
1146
1147   return p;
1148 }
1149
1150 /* Extract the break patterns from args START through ARGC - 1 of ARGV.
1151    After each pattern, check if the next argument is a repeat count. */
1152
1153 static void
1154 parse_patterns (int argc, int start, char **argv)
1155 {
1156   int i;                        /* Index into ARGV. */
1157   struct control *p;            /* New control record created. */
1158   uintmax_t val;
1159   static uintmax_t last_val = 0;
1160
1161   for (i = start; i < argc; i++)
1162     {
1163       if (*argv[i] == '/' || *argv[i] == '%')
1164         {
1165           p = extract_regexp (i, *argv[i] == '%', argv[i]);
1166         }
1167       else
1168         {
1169           p = new_control_record ();
1170           p->argnum = i;
1171
1172           if (xstrtoumax (argv[i], NULL, 10, &val, "") != LONGINT_OK)
1173             error (EXIT_FAILURE, 0, _("%s: invalid pattern"), argv[i]);
1174           if (val == 0)
1175             error (EXIT_FAILURE, 0,
1176                    _("%s: line number must be greater than zero"),
1177                    argv[i]);
1178           if (val < last_val)
1179             {
1180               char buf[INT_BUFSIZE_BOUND (uintmax_t)];
1181               error (EXIT_FAILURE, 0,
1182                _("line number `%s' is smaller than preceding line number, %s"),
1183                      argv[i], umaxtostr (last_val, buf));
1184             }
1185
1186           if (val == last_val)
1187             error (0, 0,
1188            _("warning: line number `%s' is the same as preceding line number"),
1189                    argv[i]);
1190
1191           last_val = val;
1192
1193           p->lines_required = val;
1194         }
1195
1196       if (i + 1 < argc && *argv[i + 1] == '{')
1197         {
1198           /* We have a repeat count. */
1199           i++;
1200           parse_repeat_count (i, p, argv[i]);
1201         }
1202     }
1203 }
1204
1205 static unsigned
1206 get_format_flags (char **format_ptr)
1207 {
1208   unsigned count = 0;
1209
1210   for (; **format_ptr; (*format_ptr)++)
1211     {
1212       switch (**format_ptr)
1213         {
1214         case '-':
1215           break;
1216
1217         case '+':
1218         case ' ':
1219           count++;
1220           break;
1221
1222         case '#':
1223           count += 2;   /* Allow for 0x prefix preceeding an `x' conversion.  */
1224           break;
1225
1226         default:
1227           return count;
1228         }
1229     }
1230   return count;
1231 }
1232
1233 static unsigned
1234 get_format_width (char **format_ptr)
1235 {
1236   unsigned count = 0;
1237   char *start;
1238   int ch_save;
1239
1240   start = *format_ptr;
1241   for (; ISDIGIT (**format_ptr); (*format_ptr)++)
1242     continue;
1243
1244   ch_save = **format_ptr;
1245   **format_ptr = '\0';
1246   /* In the case where no minimum field width is explicitly specified,
1247      allow for enough octal digits to represent the value of LONG_MAX.  */
1248   count = ((*format_ptr == start)
1249            ? bytes_to_octal_digits[sizeof (long)]
1250            /* FIXME: don't use atoi, it may silently overflow.
1251               Besides, we know the result is non-negative, so shouldn't
1252               need that cast.  */
1253            : (unsigned) atoi (start));
1254   **format_ptr = ch_save;
1255   return count;
1256 }
1257
1258 static unsigned
1259 get_format_prec (char **format_ptr)
1260 {
1261   unsigned count = 0;
1262   char *start;
1263   int ch_save;
1264   int is_negative;
1265
1266   if (**format_ptr != '.')
1267     return 0;
1268   (*format_ptr)++;
1269
1270   if (**format_ptr == '-' || **format_ptr == '+')
1271     {
1272       is_negative = (**format_ptr == '-');
1273       (*format_ptr)++;
1274     }
1275   else
1276     {
1277       is_negative = 0;
1278     }
1279
1280   start = *format_ptr;
1281   for (; ISDIGIT (**format_ptr); (*format_ptr)++)
1282     continue;
1283
1284   /* ANSI 4.9.6.1 says that if the precision is negative, it's as good as
1285      not there. */
1286   if (is_negative)
1287     start = *format_ptr;
1288
1289   ch_save = **format_ptr;
1290   **format_ptr = '\0';
1291   count = (*format_ptr == start) ? 11 : atoi (start);
1292   **format_ptr = ch_save;
1293
1294   return count;
1295 }
1296
1297 static void
1298 get_format_conv_type (char **format_ptr)
1299 {
1300   int ch = *((*format_ptr)++);
1301
1302   switch (ch)
1303     {
1304     case 'd':
1305     case 'i':
1306     case 'o':
1307     case 'u':
1308     case 'x':
1309     case 'X':
1310       break;
1311
1312     case 0:
1313       error (EXIT_FAILURE, 0, _("missing conversion specifier in suffix"));
1314       break;
1315
1316     default:
1317       if (ISPRINT (ch))
1318         error (EXIT_FAILURE, 0,
1319                _("invalid conversion specifier in suffix: %c"), ch);
1320       else
1321         error (EXIT_FAILURE, 0,
1322                _("invalid conversion specifier in suffix: \\%.3o"), ch);
1323     }
1324 }
1325
1326 static unsigned
1327 max_out (char *format)
1328 {
1329   unsigned out_count = 0;
1330   unsigned percents = 0;
1331
1332   for (; *format; )
1333     {
1334       int ch = *format++;
1335
1336       if (ch != '%')
1337         out_count++;
1338       else
1339         {
1340           percents++;
1341           out_count += get_format_flags (&format);
1342           {
1343             int width = get_format_width (&format);
1344             int prec = get_format_prec (&format);
1345
1346             out_count += MAX (width, prec);
1347           }
1348           get_format_conv_type (&format);
1349         }
1350     }
1351
1352   if (percents == 0)
1353     error (EXIT_FAILURE, 0,
1354            _("missing %% conversion specification in suffix"));
1355   else if (percents > 1)
1356     error (EXIT_FAILURE, 0,
1357            _("too many %% conversion specifications in suffix"));
1358
1359   return out_count;
1360 }
1361
1362 int
1363 main (int argc, char **argv)
1364 {
1365   int optc;
1366   unsigned long val;
1367 #ifdef SA_NOCLDSTOP
1368   struct sigaction oldact, newact;
1369 #endif
1370
1371   initialize_main (&argc, &argv);
1372   program_name = argv[0];
1373   setlocale (LC_ALL, "");
1374   bindtextdomain (PACKAGE, LOCALEDIR);
1375   textdomain (PACKAGE);
1376
1377   atexit (close_stdout);
1378
1379   global_argv = argv;
1380   controls = NULL;
1381   control_used = 0;
1382   suppress_count = FALSE;
1383   remove_files = TRUE;
1384   prefix = DEFAULT_PREFIX;
1385
1386   /* Change the way xmalloc and xrealloc fail.  */
1387   xalloc_fail_func = cleanup;
1388
1389 #ifdef SA_NOCLDSTOP
1390   newact.sa_handler = interrupt_handler;
1391   sigemptyset (&newact.sa_mask);
1392   newact.sa_flags = 0;
1393
1394   sigaction (SIGHUP, NULL, &oldact);
1395   if (oldact.sa_handler != SIG_IGN)
1396     sigaction (SIGHUP, &newact, NULL);
1397
1398   sigaction (SIGINT, NULL, &oldact);
1399   if (oldact.sa_handler != SIG_IGN)
1400     sigaction (SIGINT, &newact, NULL);
1401
1402   sigaction (SIGQUIT, NULL, &oldact);
1403   if (oldact.sa_handler != SIG_IGN)
1404     sigaction (SIGQUIT, &newact, NULL);
1405
1406   sigaction (SIGTERM, NULL, &oldact);
1407   if (oldact.sa_handler != SIG_IGN)
1408     sigaction (SIGTERM, &newact, NULL);
1409 #else
1410   if (signal (SIGHUP, SIG_IGN) != SIG_IGN)
1411     signal (SIGHUP, interrupt_handler);
1412   if (signal (SIGINT, SIG_IGN) != SIG_IGN)
1413     signal (SIGINT, interrupt_handler);
1414   if (signal (SIGQUIT, SIG_IGN) != SIG_IGN)
1415     signal (SIGQUIT, interrupt_handler);
1416   if (signal (SIGTERM, SIG_IGN) != SIG_IGN)
1417     signal (SIGTERM, interrupt_handler);
1418 #endif
1419
1420   while ((optc = getopt_long (argc, argv, "f:b:kn:sqz", longopts, NULL)) != -1)
1421     switch (optc)
1422       {
1423       case 0:
1424         break;
1425
1426       case 'f':
1427         prefix = optarg;
1428         break;
1429
1430       case 'b':
1431         suffix = optarg;
1432         break;
1433
1434       case 'k':
1435         remove_files = FALSE;
1436         break;
1437
1438       case 'n':
1439         if (xstrtoul (optarg, NULL, 10, &val, "") != LONGINT_OK
1440             || val > INT_MAX)
1441           error (EXIT_FAILURE, 0, _("%s: invalid number"), optarg);
1442         digits = (int) val;
1443         break;
1444
1445       case 's':
1446       case 'q':
1447         suppress_count = TRUE;
1448         break;
1449
1450       case 'z':
1451         elide_empty_files = TRUE;
1452         break;
1453
1454       case_GETOPT_HELP_CHAR;
1455
1456       case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1457
1458       default:
1459         usage (EXIT_FAILURE);
1460       }
1461
1462   if (argc - optind < 2)
1463     {
1464       error (0, 0, _("too few arguments"));
1465       usage (EXIT_FAILURE);
1466     }
1467
1468   if (suffix)
1469     filename_space = xmalloc (strlen (prefix) + max_out (suffix) + 2);
1470   else
1471     filename_space = xmalloc (strlen (prefix) + digits + 2);
1472
1473   set_input_file (argv[optind++]);
1474
1475   parse_patterns (argc, optind, argv);
1476
1477   split_file ();
1478
1479   if (close (input_desc) < 0)
1480     {
1481       error (0, errno, _("read error"));
1482       cleanup_fatal ();
1483     }
1484
1485   exit (EXIT_SUCCESS);
1486 }
1487
1488 void
1489 usage (int status)
1490 {
1491   if (status != 0)
1492     fprintf (stderr, _("Try `%s --help' for more information.\n"),
1493              program_name);
1494   else
1495     {
1496       printf (_("\
1497 Usage: %s [OPTION]... FILE PATTERN...\n\
1498 "),
1499               program_name);
1500       fputs (_("\
1501 Output pieces of FILE separated by PATTERN(s) to files `xx01', `xx02', ...,\n\
1502 and output byte counts of each piece to standard output.\n\
1503 \n\
1504 "), stdout);
1505       fputs (_("\
1506 Mandatory arguments to long options are mandatory for short options too.\n\
1507 "), stdout);
1508       fputs (_("\
1509   -b, --suffix-format=FORMAT use sprintf FORMAT instead of %d\n\
1510   -f, --prefix=PREFIX        use PREFIX instead of `xx'\n\
1511   -k, --keep-files           do not remove output files on errors\n\
1512 "), stdout);
1513       fputs (_("\
1514   -n, --digits=DIGITS        use specified number of digits instead of 2\n\
1515   -s, --quiet, --silent      do not print counts of output file sizes\n\
1516   -z, --elide-empty-files    remove empty output files\n\
1517 "), stdout);
1518       fputs (HELP_OPTION_DESCRIPTION, stdout);
1519       fputs (VERSION_OPTION_DESCRIPTION, stdout);
1520       fputs (_("\
1521 \n\
1522 Read standard input if FILE is -.  Each PATTERN may be:\n\
1523 "), stdout);
1524       fputs (_("\
1525 \n\
1526   INTEGER            copy up to but not including specified line number\n\
1527   /REGEXP/[OFFSET]   copy up to but not including a matching line\n\
1528   %REGEXP%[OFFSET]   skip to, but not including a matching line\n\
1529   {INTEGER}          repeat the previous pattern specified number of times\n\
1530   {*}                repeat the previous pattern as many times as possible\n\
1531 \n\
1532 A line OFFSET is a required `+' or `-' followed by a positive integer.\n\
1533 "), stdout);
1534       printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
1535     }
1536   exit (status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
1537 }