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