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