maint: with split lines, don't leave an operator at end of line
[platform/upstream/coreutils.git] / src / pr.c
1 /* pr -- convert text files for printing.
2    Copyright (C) 1988-2012 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 3 of the License, or
7    (at your option) 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, see <http://www.gnu.org/licenses/>.  */
16
17 /*  By Pete TerMaat, with considerable refinement by Roland Huebner.  */
18 \f
19 /* Things to watch: Sys V screws up on ...
20    pr -n -3 -s: /usr/dict/words
21    pr -m -o10 -n /usr/dict/words{,,,}
22    pr -6 -a -n -o5 /usr/dict/words
23
24    Ideas:
25
26    Keep a things_to_do list of functions to call when we know we have
27    something to print.  Cleaner than current series of checks.
28
29    Improve the printing of control prefixes.
30
31    Expand the file name in the centered header line to a full file name.
32
33
34    Concept:
35
36    If the input_tab_char differs from the default value TAB
37    ('-e[CHAR[...]]' is used), any input text tab is expanded to the
38    default width of 8 spaces (compare char_to_clump). - Same as SunOS
39    does.
40
41    The treatment of the number_separator (compare add_line_number):
42    The default value TAB of the number_separator ('-n[SEP[...]]') doesn't
43    be thought to be an input character. An optional '-e'-input has no
44    effect.
45    -  With single column output
46       only one POSIX requirement has to be met:
47    The default n-separator should be a TAB. The consequence is a
48    different width between the number and the text if the output position
49    of the separator changes, i.e. it depends upon the left margin used.
50    That's not nice but easy-to-use together with the defaults of other
51    utilities, e.g. sort or cut. - Same as SunOS does.
52    -  With multicolumn output
53       two conflicting POSIX requirements exist:
54    First "default n-separator is TAB", second "output text columns shall
55    be of equal width". Moreover POSIX specifies the number+separator a
56    part of the column, together with '-COLUMN' and '-a -COLUMN'.
57    (With -m output the number shall occupy each line only once. Exactly
58    the same situation as single column output exists.)
59       GNU pr gives priority to the 2nd requirement and observes POSIX
60    column definition. The n-separator TAB is expanded to the same number
61    of spaces in each column using the default value 8. Tabification is
62    only performed if it is compatible with the output position.
63    Consequence: The output text columns are of equal width. The layout
64    of a page does not change if the left margin varies. - Looks better
65    than the SunOS approach.
66       SunOS pr gives priority to the 1st requirement. n-separator TAB
67    width varies with each column. Only the width of text part of the
68    column is fixed.
69    Consequence: The output text columns don't have equal width. The
70    widths and the layout of the whole page varies with the left margin.
71    An overflow of the line length (without margin) over the input value
72    PAGE_WIDTH may occur.
73
74    The interference of the POSIX-compliant small letter options -w and -s:
75    ("interference" means "setting a _separator_ with -s switches off the
76    column structure and the default - not generally - page_width,
77    acts on -w option")
78        options:       text form  / separator:     equivalent new options:
79        -w l   -s[x]
80     --------------------------------------------------------------------
81     1.  --     --     columns    / space          --
82                       trunc. to page_width = 72
83     2.  --    -s[:]   full lines / TAB[:]         -J  --sep-string[="<TAB>"|:]
84                       no truncation
85     3.  -w l   --     columns    / space          -W l
86                       trunc. to page_width = l
87     4.  -w l  -s[:]   columns    / no sep.[:]     -W l  --sep-string[=:]
88                       trunc. to page_width = l
89     --------------------------------------------------------------------
90
91
92    Options:
93
94    Including version 1.22i:
95    Some SMALL LETTER options have been redefined with the object of a
96    better POSIX compliance. The output of some further cases has been
97    adapted to other UNIXes. A violation of downward compatibility has to
98    be accepted.
99    Some NEW CAPITAL LETTER options ( -J, -S, -W) has been introduced to
100    turn off unexpected interferences of small letter options (-s and -w
101    together with the three column options).
102    -N option and the second argument LAST_PAGE of +FIRST_PAGE offer more
103    flexibility; The detailed handling of form feeds set in the input
104    files requires -T option.
105
106    Capital letter options dominate small letter ones.
107
108    Some of the option-arguments cannot be specified as separate arguments
109    from the preceding option letter (already stated in POSIX specification).
110
111    Form feeds in the input cause page breaks in the output. Multiple
112    form feeds produce empty pages.
113
114    +FIRST_PAGE[:LAST_PAGE], --pages=FIRST_PAGE[:LAST_PAGE]
115                 begin [stop] printing with page FIRST_[LAST_]PAGE
116
117    -COLUMN, --columns=COLUMN
118                 Produce output that is COLUMN columns wide and
119                 print columns down, unless -a is used. Balance number of
120                 lines in the columns on each page.
121
122    -a, --across         Print columns across rather than down, used
123                 together with -COLUMN. The input
124                 one
125                 two
126                 three
127                 four
128                 will be printed with '-a -3' as
129                 one     two     three
130                 four
131
132    -b           Balance columns on the last page.
133                 -b is no longer an independent option. It's always used
134                 together with -COLUMN (unless -a is used) to get a
135                 consistent formulation with "FF set by hand" in input
136                 files. Each formfeed found terminates the number of lines
137                 to be read with the actual page. The situation for
138                 printing columns down is equivalent to that on the last
139                 page. So we need a balancing.
140
141                 Keeping -b as an underground option guarantees some
142                 downward compatibility. Utilities using pr with -b
143                 (a most frequently used form) still work as usual.
144
145    -c, --show-control-chars
146                 Print unprintable characters as control prefixes.
147                 Control-g is printed as ^G (use hat notation) and
148                 octal backslash notation.
149
150    -d, --double-space   Double space the output.
151
152    -D FORMAT, --date-format=FORMAT  Use FORMAT for the header date.
153
154    -e[CHAR[WIDTH]], --expand-tabs[=CHAR[WIDTH]]
155                 Expand tabs to spaces on input.  Optional argument CHAR
156                 is the input TAB character. (Default is TAB).  Optional
157                 argument WIDTH is the input TAB character's width.
158                 (Default is 8.)
159
160    -F, -f, --form-feed  Use formfeeds instead of newlines to separate
161                 pages. A three line HEADER is used, no TRAILER with -F,
162                 without -F both HEADER and TRAILER are made of five lines.
163
164    -h HEADER, --header=HEADER
165                 Replace the filename in the header with the string HEADER.
166                 A centered header is used.
167
168    -i[CHAR[WIDTH]], --output-tabs[=CHAR[WIDTH]]
169                 Replace spaces with tabs on output.  Optional argument
170                 CHAR is the output TAB character. (Default is TAB).
171                 Optional argument WIDTH is the output TAB character's
172                 width. (Default is 8)
173
174    -J, --join-lines     Merge lines of full length, turns off -W/-w
175                 line truncation, no column alignment, --sep-string[=STRING]
176                 sets separators, works with all column options
177                 (-COLUMN | -a -COLUMN | -m).
178                 -J has been introduced (together with -W and --sep-string) to
179                 disentangle the old (POSIX compliant) options -w, -s
180                 along with the 3 column options.
181
182    -l PAGE_LENGTH, --length=PAGE_LENGTH
183                 Set the page length to PAGE_LENGTH lines. Default is 66,
184                 including 5 lines of HEADER and 5 lines of TRAILER
185                 without -F, but only 3 lines of HEADER and no TRAILER
186                 with -F (i.e the number of text lines defaults to 56 or
187                 63 respectively).
188
189    -m, --merge          Print files in parallel; pad_across_to align
190                 columns; truncate lines and print separator strings;
191                 Do it also with empty columns to get a continuous line
192                 numbering and column marking by separators throughout
193                 the whole merged file.
194
195                 Empty pages in some input files produce empty columns
196                 [marked by separators] in the merged pages. Completely
197                 empty merged pages show no column separators at all.
198
199                 The layout of a merged page is ruled by the largest form
200                 feed distance of the single pages at that page. Shorter
201                 columns will be filled up with empty lines.
202
203                 Together with -J option join lines of full length and
204                 set separators when -S option is used.
205
206    -n[SEP[DIGITS]], --number-lines[=SEP[DIGITS]]
207                 Provide DIGITS digit line numbering (default for DIGITS
208                 is 5). With multicolumn output the number occupies the
209                 first DIGITS column positions of each text column or only
210                 each line of -m output.
211                 With single column output the number precedes each line
212                 just as -m output.
213                 Optional argument SEP is the character appended to the
214                 line number to separate it from the text followed.
215                 The default separator is a TAB. In a strict sense a TAB
216                 is always printed with single column output only. The
217                 TAB-width varies with the TAB-position, e.g. with the
218                 left margin specified by -o option.
219                 With multicolumn output priority is given to "equal width
220                 of output columns" (a POSIX specification). The TAB-width
221                 is fixed to the value of the 1st column and does not
222                 change with different values of left margin. That means a
223                 fixed number of spaces is always printed in the place of
224                 a TAB. The tabification depends upon the output
225                 position.
226
227                 Default counting of the line numbers starts with 1st
228                 line of the input file (not the 1st line printed,
229                 compare the --page option and -N option).
230
231    -N NUMBER, --first-line-number=NUMBER
232                 Start line counting with the number NUMBER at the 1st
233                 line of first page printed (mostly not the 1st line of
234                 the input file).
235
236    -o MARGIN, --indent=MARGIN
237                 Offset each line with a margin MARGIN spaces wide.
238                 Total page width is the size of the margin plus the
239                 PAGE_WIDTH set with -W/-w option.
240
241    -r, --no-file-warnings
242                 Omit warning when a file cannot be opened.
243
244    -s[CHAR], --separator[=CHAR]
245                 Separate columns by a single character CHAR, default for
246                 CHAR is the TAB character without -w and 'no char' with -w.
247                 Without '-s' default separator 'space' is set.
248                 -s[CHAR] turns off line truncation of all 3 column options
249                 (-COLUMN|-a -COLUMN|-m) except -w is set. That is a POSIX
250                 compliant formulation. The source code translates -s into
251                 the new options -S and -J, also -W if required.
252
253    -S[STRING], --sep-string[=STRING]
254                 Separate columns by any string STRING. The -S option
255                 doesn't react upon the -W/-w option (unlike -s option
256                 does). It defines a separator nothing else.
257                 Without -S: Default separator TAB is used with -J and
258                 'space' otherwise (same as -S" ").
259                 With -S "": No separator is used.
260                 Quotes should be used with blanks and some shell active
261                 characters.
262                 -S is problematic because in its obsolete form you
263                 cannot use -S "STRING", but in its standard form you
264                 must use -S "STRING" if STRING is empty.  Use
265                 --sep-string to avoid the ambiguity.
266
267    -t, --omit-header    Do not print headers or footers but retain form
268                 feeds set in the input files.
269
270    -T, --omit-pagination
271                 Do not print headers or footers, eliminate any pagination
272                 by form feeds set in the input files.
273
274    -v, --show-nonprinting
275                 Print unprintable characters as escape sequences. Use
276                 octal backslash notation. Control-G becomes \007.
277
278    -w PAGE_WIDTH, --width=PAGE_WIDTH
279                 Set page width to PAGE_WIDTH characters for multiple
280                 text-column output only (default for PAGE_WIDTH is 72).
281                 -s[CHAR] turns off the default page width and any line
282                 truncation. Lines of full length will be merged,
283                 regardless of the column options set. A POSIX compliant
284                 formulation.
285
286    -W PAGE_WIDTH, --page-width=PAGE_WIDTH
287                 Set the page width to PAGE_WIDTH characters. That's valid
288                 with and without a column option. Text lines will be
289                 truncated, unless -J is used. Together with one of the
290                 column options (-COLUMN| -a -COLUMN| -m) column alignment
291                 is always used.
292                 Default is 72 characters.
293                 Without -W PAGE_WIDTH
294                 - but with one of the column options default truncation of
295                   72 characters is used (to keep downward compatibility
296                   and to simplify most frequently met column tasks).
297                   Column alignment and column separators are used.
298                 - and without any of the column options NO line truncation
299                   is used (to keep downward compatibility and to meet most
300                   frequent tasks). That's equivalent to  -W 72 -J .
301
302                 With/without  -W PAGE_WIDTH  the header line is always
303                 truncated to avoid line overflow.
304
305                 (In pr versions newer than 1.14 -S option does no longer
306                 affect -W option.)
307
308 */
309 \f
310
311 #include <config.h>
312
313 #include <getopt.h>
314 #include <sys/types.h>
315 #include "system.h"
316 #include "error.h"
317 #include "fadvise.h"
318 #include "hard-locale.h"
319 #include "mbswidth.h"
320 #include "quote.h"
321 #include "stat-time.h"
322 #include "stdio--.h"
323 #include "strftime.h"
324 #include "xstrtol.h"
325
326 /* The official name of this program (e.g., no 'g' prefix).  */
327 #define PROGRAM_NAME "pr"
328
329 #define AUTHORS \
330   proper_name ("Pete TerMaat"), \
331   proper_name ("Roland Huebner")
332
333 /* Used with start_position in the struct COLUMN described below.
334    If start_position == ANYWHERE, we aren't truncating columns and
335    can begin printing a column anywhere.  Otherwise we must pad to
336    the horizontal position start_position. */
337 #define ANYWHERE        0
338
339 /* Each column has one of these structures allocated for it.
340    If we're only dealing with one file, fp is the same for all
341    columns.
342
343    The general strategy is to spend time setting up these column
344    structures (storing columns if necessary), after which printing
345    is a matter of flitting from column to column and calling
346    print_func.
347
348    Parallel files, single files printing across in multiple
349    columns, and single files printing down in multiple columns all
350    fit the same printing loop.
351
352    print_func           Function used to print lines in this column.
353                         If we're storing this column it will be
354                         print_stored(), Otherwise it will be read_line().
355
356    char_func            Function used to process characters in this column.
357                         If we're storing this column it will be store_char(),
358                         otherwise it will be print_char().
359
360    current_line         Index of the current entry in line_vector, which
361                         contains the index of the first character of the
362                         current line in buff[].
363
364    lines_stored         Number of lines in this column which are stored in
365                         buff.
366
367    lines_to_print       If we're storing this column, lines_to_print is
368                         the number of stored_lines which remain to be
369                         printed.  Otherwise it is the number of lines
370                         we can print without exceeding lines_per_body.
371
372    start_position       The horizontal position we want to be in before we
373                         print the first character in this column.
374
375    numbered             True means precede this column with a line number. */
376
377 /* FIXME: There are many unchecked integer overflows in this file,
378    that will cause this command to misbehave given large inputs or
379    options.  Many of the "int" values below should be "size_t" or
380    something else like that.  */
381
382 struct COLUMN;
383 struct COLUMN
384   {
385     FILE *fp;                   /* Input stream for this column. */
386     char const *name;           /* File name. */
387     enum
388       {
389         OPEN,
390         FF_FOUND,               /* used with -b option, set with \f, changed
391                                    to ON_HOLD after print_header */
392         ON_HOLD,                /* Hit a form feed. */
393         CLOSED
394       }
395     status;                     /* Status of the file pointer. */
396
397     /* Func to print lines in this col. */
398     bool (*print_func) (struct COLUMN *);
399
400     /* Func to print/store chars in this col. */
401     void (*char_func) (char);
402
403     int current_line;           /* Index of current place in line_vector. */
404     int lines_stored;           /* Number of lines stored in buff. */
405     int lines_to_print;         /* No. lines stored or space left on page. */
406     int start_position;         /* Horizontal position of first char. */
407     bool numbered;
408     bool full_page_printed;     /* True means printed without a FF found. */
409
410     /* p->full_page_printed  controls a special case of "FF set by hand":
411        True means a full page has been printed without FF found. To avoid an
412        additional empty page we have to ignore a FF immediately following in
413        the next line. */
414   };
415
416 typedef struct COLUMN COLUMN;
417
418 static int char_to_clump (char c);
419 static bool read_line (COLUMN *p);
420 static bool print_page (void);
421 static bool print_stored (COLUMN *p);
422 static bool open_file (char *name, COLUMN *p);
423 static bool skip_to_page (uintmax_t page);
424 static void print_header (void);
425 static void pad_across_to (int position);
426 static void add_line_number (COLUMN *p);
427 static void getoptarg (char *arg, char switch_char, char *character,
428                        int *number);
429 static void print_files (int number_of_files, char **av);
430 static void init_parameters (int number_of_files);
431 static void init_header (char const *filename, int desc);
432 static bool init_fps (int number_of_files, char **av);
433 static void init_funcs (void);
434 static void init_store_cols (void);
435 static void store_columns (void);
436 static void balance (int total_stored);
437 static void store_char (char c);
438 static void pad_down (int lines);
439 static void read_rest_of_line (COLUMN *p);
440 static void skip_read (COLUMN *p, int column_number);
441 static void print_char (char c);
442 static void cleanup (void);
443 static void print_sep_string (void);
444 static void separator_string (const char *optarg_S);
445
446 /* All of the columns to print.  */
447 static COLUMN *column_vector;
448
449 /* When printing a single file in multiple downward columns,
450    we store the leftmost columns contiguously in buff.
451    To print a line from buff, get the index of the first character
452    from line_vector[i], and print up to line_vector[i + 1]. */
453 static char *buff;
454
455 /* Index of the position in buff where the next character
456    will be stored. */
457 static unsigned int buff_current;
458
459 /* The number of characters in buff.
460    Used for allocation of buff and to detect overflow of buff. */
461 static size_t buff_allocated;
462
463 /* Array of indices into buff.
464    Each entry is an index of the first character of a line.
465    This is used when storing lines to facilitate shuffling when
466    we do column balancing on the last page. */
467 static int *line_vector;
468
469 /* Array of horizonal positions.
470    For each line in line_vector, end_vector[line] is the horizontal
471    position we are in after printing that line.  We keep track of this
472    so that we know how much we need to pad to prepare for the next
473    column. */
474 static int *end_vector;
475
476 /* (-m) True means we're printing multiple files in parallel. */
477 static bool parallel_files = false;
478
479 /* (-m) True means a line starts with some empty columns (some files
480    already CLOSED or ON_HOLD) which we have to align. */
481 static bool align_empty_cols;
482
483 /* (-m) True means we have not yet found any printable column in a line.
484    align_empty_cols = true  has to be maintained. */
485 static bool empty_line;
486
487 /* (-m) False means printable column output precedes a form feed found.
488    Column alignment is done only once. No additional action with that form
489    feed.
490    True means we found only a form feed in a column. Maybe we have to do
491    some column alignment with that form feed. */
492 static bool FF_only;
493
494 /* (-[0-9]+) True means we're given an option explicitly specifying
495    number of columns.  Used to detect when this option is used with -m
496    and when translating old options to new/long options. */
497 static bool explicit_columns = false;
498
499 /* (-t|-T) False means we aren't printing headers and footers. */
500 static bool extremities = true;
501
502 /* (-t) True means we retain all FF set by hand in input files.
503    False is set with -T option. */
504 static bool keep_FF = false;
505 static bool print_a_FF = false;
506
507 /* True means we need to print a header as soon as we know we've got input
508    to print after it. */
509 static bool print_a_header;
510
511 /* (-f) True means use formfeeds instead of newlines to separate pages. */
512 static bool use_form_feed = false;
513
514 /* True means we have read the standard input. */
515 static bool have_read_stdin = false;
516
517 /* True means the -a flag has been given. */
518 static bool print_across_flag = false;
519
520 /* True means we're printing one file in multiple (>1) downward columns. */
521 static bool storing_columns = true;
522
523 /* (-b) True means balance columns on the last page as Sys V does. */
524 /* That's no longer an independent option. With storing_columns = true
525    balance_columns = true is used too (s. function init_parameters).
526    We get a consistent formulation with "FF set by hand" in input files. */
527 static bool balance_columns = false;
528
529 /* (-l) Number of lines on a page, including header and footer lines. */
530 static int lines_per_page = 66;
531
532 /* Number of lines in the header and footer can be reset to 0 using
533    the -t flag. */
534 enum { lines_per_header = 5 };
535 static int lines_per_body;
536 enum { lines_per_footer = 5 };
537
538 /* (-w|-W) Width in characters of the page.  Does not include the width of
539    the margin. */
540 static int chars_per_line = 72;
541
542 /* (-w|W) True means we truncate lines longer than chars_per_column. */
543 static bool truncate_lines = false;
544
545 /* (-J) True means we join lines without any line truncation. -J
546    dominates -w option. */
547 static bool join_lines = false;
548
549 /* Number of characters in a column.  Based on col_sep_length and
550    page width. */
551 static int chars_per_column;
552
553 /* (-e) True means convert tabs to spaces on input. */
554 static bool untabify_input = false;
555
556 /* (-e) The input tab character. */
557 static char input_tab_char = '\t';
558
559 /* (-e) Tabstops are at chars_per_tab, 2*chars_per_tab, 3*chars_per_tab, ...
560    where the leftmost column is 1. */
561 static int chars_per_input_tab = 8;
562
563 /* (-i) True means convert spaces to tabs on output. */
564 static bool tabify_output = false;
565
566 /* (-i) The output tab character. */
567 static char output_tab_char = '\t';
568
569 /* (-i) The width of the output tab. */
570 static int chars_per_output_tab = 8;
571
572 /* Keeps track of pending white space.  When we hit a nonspace
573    character after some whitespace, we print whitespace, tabbing
574    if necessary to get to output_position + spaces_not_printed. */
575 static int spaces_not_printed;
576
577 /* (-o) Number of spaces in the left margin (tabs used when possible). */
578 static int chars_per_margin = 0;
579
580 /* Position where the next character will fall.
581    Leftmost position is 0 + chars_per_margin.
582    Rightmost position is chars_per_margin + chars_per_line - 1.
583    This is important for converting spaces to tabs on output. */
584 static int output_position;
585
586 /* Horizontal position relative to the current file.
587    (output_position depends on where we are on the page;
588    input_position depends on where we are in the file.)
589    Important for converting tabs to spaces on input. */
590 static int input_position;
591
592 /* True if there were any failed opens so we can exit with nonzero
593    status.  */
594 static bool failed_opens = false;
595
596 /* The number of spaces taken up if we print a tab character with width
597    c_ from position h_. */
598 #define TAB_WIDTH(c_, h_) ((c_) - ((h_) % (c_)))
599
600 /* The horizontal position we'll be at after printing a tab character
601    of width c_ from the position h_. */
602 #define POS_AFTER_TAB(c_, h_) ((h_) + TAB_WIDTH (c_, h_))
603
604 /* (-NNN) Number of columns of text to print. */
605 static int columns = 1;
606
607 /* (+NNN:MMM) Page numbers on which to begin and stop printing.
608    first_page_number = 0  will be used to check input only. */
609 static uintmax_t first_page_number = 0;
610 static uintmax_t last_page_number = UINTMAX_MAX;
611
612 /* Number of files open (not closed, not on hold). */
613 static int files_ready_to_read = 0;
614
615 /* Current page number.  Displayed in header. */
616 static uintmax_t page_number;
617
618 /* Current line number.  Displayed when -n flag is specified.
619
620    When printing files in parallel (-m flag), line numbering is as follows:
621    1    foo     goo     moo
622    2    hoo     too     zoo
623
624    When printing files across (-a flag), ...
625    1    foo     2       moo     3       goo
626    4    hoo     5       too     6       zoo
627
628    Otherwise, line numbering is as follows:
629    1    foo     3       goo     5       too
630    2    moo     4       hoo     6       zoo */
631 static int line_number;
632
633 /* With line_number overflow, we use power_10 to cut off the higher-order
634    digits of the line_number */
635 static int power_10;
636
637 /* (-n) True means lines should be preceded by numbers. */
638 static bool numbered_lines = false;
639
640 /* (-n) Character which follows each line number. */
641 static char number_separator = '\t';
642
643 /* (-n) line counting starts with 1st line of input file (not with 1st
644    line of 1st page printed). */
645 static int line_count = 1;
646
647 /* (-n) True means counting of skipped lines starts with 1st line of
648    input file. False means -N option is used in addition, counting of
649    skipped lines not required. */
650 static bool skip_count = true;
651
652 /* (-N) Counting starts with start_line_number = NUMBER at 1st line of
653    first page printed, usually not 1st page of input file. */
654 static int start_line_num = 1;
655
656 /* (-n) Width in characters of a line number. */
657 static int chars_per_number = 5;
658
659 /* Used when widening the first column to accommodate numbers -- only
660    needed when printing files in parallel.  Includes width of both the
661    number and the number_separator. */
662 static int number_width;
663
664 /* Buffer sprintf uses to format a line number. */
665 static char *number_buff;
666
667 /* (-v) True means unprintable characters are printed as escape sequences.
668    control-g becomes \007. */
669 static bool use_esc_sequence = false;
670
671 /* (-c) True means unprintable characters are printed as control prefixes.
672    control-g becomes ^G. */
673 static bool use_cntrl_prefix = false;
674
675 /* (-d) True means output is double spaced. */
676 static bool double_space = false;
677
678 /* Number of files opened initially in init_files.  Should be 1
679    unless we're printing multiple files in parallel. */
680 static int total_files = 0;
681
682 /* (-r) True means don't complain if we can't open a file. */
683 static bool ignore_failed_opens = false;
684
685 /* (-S) True means we separate columns with a specified string.
686    -S option does not affect line truncation nor column alignment. */
687 static bool use_col_separator = false;
688
689 /* String used to separate columns if the -S option has been specified.
690    Default without -S but together with one of the column options
691    -a|COLUMN|-m is a 'space' and with the -J option a 'tab'. */
692 static char *col_sep_string = (char *) "";
693 static int col_sep_length = 0;
694 static char *column_separator = (char *) " ";
695 static char *line_separator = (char *) "\t";
696
697 /* Number of separator characters waiting to be printed as soon as we
698    know that we have any input remaining to be printed. */
699 static int separators_not_printed;
700
701 /* Position we need to pad to, as soon as we know that we have input
702    remaining to be printed. */
703 static int padding_not_printed;
704
705 /* True means we should pad the end of the page.  Remains false until we
706    know we have a page to print. */
707 static bool pad_vertically;
708
709 /* (-h) String of characters used in place of the filename in the header. */
710 static char *custom_header;
711
712 /* (-D) Date format for the header.  */
713 static char const *date_format;
714
715 /* Date and file name for the header.  */
716 static char *date_text;
717 static char const *file_text;
718
719 /* Output columns available, not counting the date and file name.  */
720 static int header_width_available;
721
722 static char *clump_buff;
723
724 /* True means we read the line no. lines_per_body in skip_read
725    called by skip_to_page. That variable controls the coincidence of a
726    "FF set by hand" and "full_page_printed", see above the definition of
727    structure COLUMN. */
728 static bool last_line = false;
729
730 /* For long options that have no equivalent short option, use a
731    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
732 enum
733 {
734   COLUMNS_OPTION = CHAR_MAX + 1,
735   PAGES_OPTION
736 };
737
738 static char const short_options[] =
739   "-0123456789D:FJN:S::TW:abcde::fh:i::l:mn::o:rs::tvw:";
740
741 static struct option const long_options[] =
742 {
743   {"pages", required_argument, NULL, PAGES_OPTION},
744   {"columns", required_argument, NULL, COLUMNS_OPTION},
745   {"across", no_argument, NULL, 'a'},
746   {"show-control-chars", no_argument, NULL, 'c'},
747   {"double-space", no_argument, NULL, 'd'},
748   {"date-format", required_argument, NULL, 'D'},
749   {"expand-tabs", optional_argument, NULL, 'e'},
750   {"form-feed", no_argument, NULL, 'f'},
751   {"header", required_argument, NULL, 'h'},
752   {"output-tabs", optional_argument, NULL, 'i'},
753   {"join-lines", no_argument, NULL, 'J'},
754   {"length", required_argument, NULL, 'l'},
755   {"merge", no_argument, NULL, 'm'},
756   {"number-lines", optional_argument, NULL, 'n'},
757   {"first-line-number", required_argument, NULL, 'N'},
758   {"indent", required_argument, NULL, 'o'},
759   {"no-file-warnings", no_argument, NULL, 'r'},
760   {"separator", optional_argument, NULL, 's'},
761   {"sep-string", optional_argument, NULL, 'S'},
762   {"omit-header", no_argument, NULL, 't'},
763   {"omit-pagination", no_argument, NULL, 'T'},
764   {"show-nonprinting", no_argument, NULL, 'v'},
765   {"width", required_argument, NULL, 'w'},
766   {"page-width", required_argument, NULL, 'W'},
767   {GETOPT_HELP_OPTION_DECL},
768   {GETOPT_VERSION_OPTION_DECL},
769   {NULL, 0, NULL, 0}
770 };
771
772 /* Return the number of columns that have either an open file or
773    stored lines. */
774
775 static int _GL_ATTRIBUTE_PURE
776 cols_ready_to_print (void)
777 {
778   COLUMN *q;
779   int i;
780   int n;
781
782   n = 0;
783   for (q = column_vector, i = 0; i < columns; ++q, ++i)
784     if (q->status == OPEN
785         || q->status == FF_FOUND        /* With -b: To print a header only */
786         || (storing_columns && q->lines_stored > 0 && q->lines_to_print > 0))
787       ++n;
788   return n;
789 }
790
791 /* Estimate first_ / last_page_number
792    using option +FIRST_PAGE:LAST_PAGE */
793
794 static bool
795 first_last_page (int oi, char c, char const *pages)
796 {
797   char *p;
798   uintmax_t first;
799   uintmax_t last = UINTMAX_MAX;
800   strtol_error err = xstrtoumax (pages, &p, 10, &first, "");
801   if (err != LONGINT_OK && err != LONGINT_INVALID_SUFFIX_CHAR)
802     xstrtol_fatal (err, oi, c, long_options, pages);
803
804   if (p == pages || !first)
805     return false;
806
807   if (*p == ':')
808     {
809       char const *p1 = p + 1;
810       err = xstrtoumax (p1, &p, 10, &last, "");
811       if (err != LONGINT_OK)
812         xstrtol_fatal (err, oi, c, long_options, pages);
813       if (p1 == p || last < first)
814         return false;
815     }
816
817   if (*p)
818     return false;
819
820   first_page_number = first;
821   last_page_number = last;
822   return true;
823 }
824
825 /* Parse column count string S, and if it's valid (1 or larger and
826    within range of the type of 'columns') set the global variables
827    columns and explicit_columns and return true.
828    Otherwise, exit with a diagnostic.  */
829 static void
830 parse_column_count (char const *s)
831 {
832   long int tmp_long;
833   if (xstrtol (s, NULL, 10, &tmp_long, "") != LONGINT_OK
834       || !(1 <= tmp_long && tmp_long <= INT_MAX))
835     error (EXIT_FAILURE, 0,
836            _("invalid number of columns: %s"), quote (s));
837
838   columns = tmp_long;
839   explicit_columns = true;
840 }
841
842 /* Estimate length of col_sep_string with option -S.  */
843
844 static void
845 separator_string (const char *optarg_S)
846 {
847   col_sep_length = (int) strlen (optarg_S);
848   col_sep_string = xmalloc (col_sep_length + 1);
849   strcpy (col_sep_string, optarg_S);
850 }
851
852 int
853 main (int argc, char **argv)
854 {
855   int n_files;
856   bool old_options = false;
857   bool old_w = false;
858   bool old_s = false;
859   char **file_names;
860
861   /* Accumulate the digits of old-style options like -99.  */
862   char *column_count_string = NULL;
863   size_t n_digits = 0;
864   size_t n_alloc = 0;
865
866   initialize_main (&argc, &argv);
867   set_program_name (argv[0]);
868   setlocale (LC_ALL, "");
869   bindtextdomain (PACKAGE, LOCALEDIR);
870   textdomain (PACKAGE);
871
872   atexit (close_stdout);
873
874   n_files = 0;
875   file_names = (argc > 1
876                 ? xmalloc ((argc - 1) * sizeof (char *))
877                 : NULL);
878
879   while (true)
880     {
881       int oi = -1;
882       int c = getopt_long (argc, argv, short_options, long_options, &oi);
883       if (c == -1)
884         break;
885
886       if (ISDIGIT (c))
887         {
888           /* Accumulate column-count digits specified via old-style options. */
889           if (n_digits + 1 >= n_alloc)
890             column_count_string
891               = X2REALLOC (column_count_string, &n_alloc);
892           column_count_string[n_digits++] = c;
893           column_count_string[n_digits] = '\0';
894           continue;
895         }
896
897       n_digits = 0;
898
899       switch (c)
900         {
901         case 1:                 /* Non-option argument. */
902           /* long option --page dominates old '+FIRST_PAGE ...'.  */
903           if (! (first_page_number == 0
904                  && *optarg == '+' && first_last_page (-2, '+', optarg + 1)))
905             file_names[n_files++] = optarg;
906           break;
907
908         case PAGES_OPTION:      /* --pages=FIRST_PAGE[:LAST_PAGE] */
909           {                     /* dominates old opt +... */
910             if (! optarg)
911               error (EXIT_FAILURE, 0,
912                      _("'--pages=FIRST_PAGE[:LAST_PAGE]' missing argument"));
913             else if (! first_last_page (oi, 0, optarg))
914               error (EXIT_FAILURE, 0, _("invalid page range %s"),
915                      quote (optarg));
916             break;
917           }
918
919         case COLUMNS_OPTION:    /* --columns=COLUMN */
920           {
921             parse_column_count (optarg);
922
923             /* If there was a prior column count specified via the
924                short-named option syntax, e.g., -9, ensure that this
925                long-name-specified value overrides it.  */
926             free (column_count_string);
927             column_count_string = NULL;
928             n_alloc = 0;
929             break;
930           }
931
932         case 'a':
933           print_across_flag = true;
934           storing_columns = false;
935           break;
936         case 'b':
937           balance_columns = true;
938           break;
939         case 'c':
940           use_cntrl_prefix = true;
941           break;
942         case 'd':
943           double_space = true;
944           break;
945         case 'D':
946           date_format = optarg;
947           break;
948         case 'e':
949           if (optarg)
950             getoptarg (optarg, 'e', &input_tab_char,
951                        &chars_per_input_tab);
952           /* Could check tab width > 0. */
953           untabify_input = true;
954           break;
955         case 'f':
956         case 'F':
957           use_form_feed = true;
958           break;
959         case 'h':
960           custom_header = optarg;
961           break;
962         case 'i':
963           if (optarg)
964             getoptarg (optarg, 'i', &output_tab_char,
965                        &chars_per_output_tab);
966           /* Could check tab width > 0. */
967           tabify_output = true;
968           break;
969         case 'J':
970           join_lines = true;
971           break;
972         case 'l':
973           {
974             long int tmp_long;
975             if (xstrtol (optarg, NULL, 10, &tmp_long, "") != LONGINT_OK
976                 || tmp_long <= 0 || tmp_long > INT_MAX)
977               {
978                 error (EXIT_FAILURE, 0,
979                        _("'-l PAGE_LENGTH' invalid number of lines: %s"),
980                        quote (optarg));
981               }
982             lines_per_page = tmp_long;
983             break;
984           }
985         case 'm':
986           parallel_files = true;
987           storing_columns = false;
988           break;
989         case 'n':
990           numbered_lines = true;
991           if (optarg)
992             getoptarg (optarg, 'n', &number_separator,
993                        &chars_per_number);
994           break;
995         case 'N':
996           skip_count = false;
997           {
998             long int tmp_long;
999             if (xstrtol (optarg, NULL, 10, &tmp_long, "") != LONGINT_OK
1000                 || tmp_long > INT_MAX)
1001               {
1002                 error (EXIT_FAILURE, 0,
1003                        _("'-N NUMBER' invalid starting line number: %s"),
1004                        quote (optarg));
1005               }
1006             start_line_num = tmp_long;
1007             break;
1008           }
1009         case 'o':
1010           {
1011             long int tmp_long;
1012             if (xstrtol (optarg, NULL, 10, &tmp_long, "") != LONGINT_OK
1013                 || tmp_long < 0 || tmp_long > INT_MAX)
1014               error (EXIT_FAILURE, 0,
1015                      _("'-o MARGIN' invalid line offset: %s"), quote (optarg));
1016             chars_per_margin = tmp_long;
1017             break;
1018           }
1019         case 'r':
1020           ignore_failed_opens = true;
1021           break;
1022         case 's':
1023           old_options = true;
1024           old_s = true;
1025           if (!use_col_separator && optarg)
1026             separator_string (optarg);
1027           break;
1028         case 'S':
1029           old_s = false;
1030           /* Reset an additional input of -s, -S dominates -s */
1031           col_sep_string = bad_cast ("");
1032           col_sep_length = 0;
1033           use_col_separator = true;
1034           if (optarg)
1035             separator_string (optarg);
1036           break;
1037         case 't':
1038           extremities = false;
1039           keep_FF = true;
1040           break;
1041         case 'T':
1042           extremities = false;
1043           keep_FF = false;
1044           break;
1045         case 'v':
1046           use_esc_sequence = true;
1047           break;
1048         case 'w':
1049           old_options = true;
1050           old_w = true;
1051           {
1052             long int tmp_long;
1053             if (xstrtol (optarg, NULL, 10, &tmp_long, "") != LONGINT_OK
1054                 || tmp_long <= 0 || tmp_long > INT_MAX)
1055               error (EXIT_FAILURE, 0,
1056                      _("'-w PAGE_WIDTH' invalid number of characters: %s"),
1057                      quote (optarg));
1058             if (!truncate_lines)
1059               chars_per_line = tmp_long;
1060             break;
1061           }
1062         case 'W':
1063           old_w = false;                        /* dominates -w */
1064           truncate_lines = true;
1065           {
1066             long int tmp_long;
1067             if (xstrtol (optarg, NULL, 10, &tmp_long, "") != LONGINT_OK
1068                 || tmp_long <= 0 || tmp_long > INT_MAX)
1069               error (EXIT_FAILURE, 0,
1070                      _("'-W PAGE_WIDTH' invalid number of characters: %s"),
1071                      quote (optarg));
1072             chars_per_line = tmp_long;
1073             break;
1074           }
1075         case_GETOPT_HELP_CHAR;
1076         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1077         default:
1078           usage (EXIT_FAILURE);
1079           break;
1080         }
1081     }
1082
1083   if (column_count_string)
1084     {
1085       parse_column_count (column_count_string);
1086       free (column_count_string);
1087     }
1088
1089   if (! date_format)
1090     date_format = (getenv ("POSIXLY_CORRECT") && !hard_locale (LC_TIME)
1091                    ? "%b %e %H:%M %Y"
1092                    : "%Y-%m-%d %H:%M");
1093
1094   /* Now we can set a reasonable initial value: */
1095   if (first_page_number == 0)
1096     first_page_number = 1;
1097
1098   if (parallel_files && explicit_columns)
1099     error (EXIT_FAILURE, 0,
1100          _("cannot specify number of columns when printing in parallel"));
1101
1102   if (parallel_files && print_across_flag)
1103     error (EXIT_FAILURE, 0,
1104        _("cannot specify both printing across and printing in parallel"));
1105
1106 /* Translate some old short options to new/long options.
1107    To meet downward compatibility with other UNIX pr utilities
1108    and some POSIX specifications. */
1109
1110   if (old_options)
1111     {
1112       if (old_w)
1113         {
1114           if (parallel_files || explicit_columns)
1115             {
1116               /* activate -W */
1117               truncate_lines = true;
1118               if (old_s)
1119                 /* adapt HP-UX and SunOS: -s = no separator;
1120                    activate -S */
1121                 use_col_separator = true;
1122             }
1123           else
1124             /* old -w sets width with columns only
1125                activate -J */
1126             join_lines = true;
1127         }
1128       else if (!use_col_separator)
1129         {
1130           /* No -S option read */
1131           if (old_s && (parallel_files || explicit_columns))
1132             {
1133               if (!truncate_lines)
1134                 {
1135                   /* old -s (without -w and -W) annuls column alignment,
1136                   uses fields, activate -J */
1137                   join_lines = true;
1138                   if (col_sep_length > 0)
1139                     /* activate -S */
1140                     use_col_separator = true;
1141                 }
1142               else
1143                 /* with -W */
1144                 /* adapt HP-UX and SunOS: -s = no separator;
1145                    activate -S */
1146                 use_col_separator = true;
1147             }
1148         }
1149     }
1150
1151   for (; optind < argc; optind++)
1152     {
1153       file_names[n_files++] = argv[optind];
1154     }
1155
1156   if (n_files == 0)
1157     {
1158       /* No file arguments specified;  read from standard input.  */
1159       print_files (0, NULL);
1160     }
1161   else
1162     {
1163       if (parallel_files)
1164         print_files (n_files, file_names);
1165       else
1166         {
1167           unsigned int i;
1168           for (i = 0; i < n_files; i++)
1169             print_files (1, &file_names[i]);
1170         }
1171     }
1172
1173   cleanup ();
1174
1175   if (have_read_stdin && fclose (stdin) == EOF)
1176     error (EXIT_FAILURE, errno, _("standard input"));
1177   if (failed_opens)
1178     exit (EXIT_FAILURE);
1179   exit (EXIT_SUCCESS);
1180 }
1181
1182 /* Parse options of the form -scNNN.
1183
1184    Example: -nck, where 'n' is the option, c is the optional number
1185    separator, and k is the optional width of the field used when printing
1186    a number. */
1187
1188 static void
1189 getoptarg (char *arg, char switch_char, char *character, int *number)
1190 {
1191   if (!ISDIGIT (*arg))
1192     *character = *arg++;
1193   if (*arg)
1194     {
1195       long int tmp_long;
1196       if (xstrtol (arg, NULL, 10, &tmp_long, "") != LONGINT_OK
1197           || tmp_long <= 0 || tmp_long > INT_MAX)
1198         {
1199           error (0, 0,
1200              _("'-%c' extra characters or invalid number in the argument: %s"),
1201                  switch_char, quote (arg));
1202           usage (EXIT_FAILURE);
1203         }
1204       *number = tmp_long;
1205     }
1206 }
1207 \f
1208 /* Set parameters related to formatting. */
1209
1210 static void
1211 init_parameters (int number_of_files)
1212 {
1213   int chars_used_by_number = 0;
1214
1215   lines_per_body = lines_per_page - lines_per_header - lines_per_footer;
1216   if (lines_per_body <= 0)
1217     {
1218       extremities = false;
1219       keep_FF = true;
1220     }
1221   if (extremities == false)
1222     lines_per_body = lines_per_page;
1223
1224   if (double_space)
1225     lines_per_body = lines_per_body / 2;
1226
1227   /* If input is stdin, cannot print parallel files.  BSD dumps core
1228      on this. */
1229   if (number_of_files == 0)
1230     parallel_files = false;
1231
1232   if (parallel_files)
1233     columns = number_of_files;
1234
1235   /* One file, multi columns down: -b option is set to get a consistent
1236      formulation with "FF set by hand" in input files. */
1237   if (storing_columns)
1238     balance_columns = true;
1239
1240   /* Tabification is assumed for multiple columns. */
1241   if (columns > 1)
1242     {
1243       if (!use_col_separator)
1244         {
1245           /* Use default separator */
1246           if (join_lines)
1247             col_sep_string = line_separator;
1248           else
1249             col_sep_string = column_separator;
1250
1251           col_sep_length = 1;
1252           use_col_separator = true;
1253         }
1254       /* It's rather pointless to define a TAB separator with column
1255          alignment */
1256       else if (!join_lines && *col_sep_string == '\t')
1257         col_sep_string = column_separator;
1258
1259       truncate_lines = true;
1260       tabify_output = true;
1261     }
1262   else
1263     storing_columns = false;
1264
1265   /* -J dominates -w in any case */
1266   if (join_lines)
1267     truncate_lines = false;
1268
1269   if (numbered_lines)
1270     {
1271       int tmp_i;
1272       int chars_per_default_tab = 8;
1273
1274       line_count = start_line_num;
1275
1276       /* To allow input tab-expansion (-e sensitive) use:
1277          if (number_separator == input_tab_char)
1278            number_width = chars_per_number
1279              + TAB_WIDTH (chars_per_input_tab, chars_per_number);   */
1280
1281       /* Estimate chars_per_text without any margin and keep it constant. */
1282       if (number_separator == '\t')
1283         number_width = (chars_per_number
1284                         + TAB_WIDTH (chars_per_default_tab, chars_per_number));
1285       else
1286         number_width = chars_per_number + 1;
1287
1288       /* The number is part of the column width unless we are
1289          printing files in parallel. */
1290       if (parallel_files)
1291         chars_used_by_number = number_width;
1292
1293       /* We use power_10 to cut off the higher-order digits of the
1294          line_number in function add_line_number */
1295       tmp_i = chars_per_number;
1296       for (power_10 = 1; tmp_i > 0; --tmp_i)
1297         power_10 = 10 * power_10;
1298     }
1299
1300   chars_per_column = (chars_per_line - chars_used_by_number
1301                       - (columns - 1) * col_sep_length) / columns;
1302
1303   if (chars_per_column < 1)
1304     error (EXIT_FAILURE, 0, _("page width too narrow"));
1305
1306   if (numbered_lines)
1307     {
1308       free (number_buff);
1309       number_buff = xmalloc (2 * chars_per_number);
1310     }
1311
1312   /* Pick the maximum between the tab width and the width of an
1313      escape sequence.
1314      The width of an escape sequence (4) isn't the lower limit any longer.
1315      We've to use 8 as the lower limit, if we use chars_per_default_tab = 8
1316      to expand a tab which is not an input_tab-char. */
1317   free (clump_buff);
1318   clump_buff = xmalloc (MAX (8, chars_per_input_tab));
1319 }
1320 \f
1321 /* Open the necessary files,
1322    maintaining a COLUMN structure for each column.
1323
1324    With multiple files, each column p has a different p->fp.
1325    With single files, each column p has the same p->fp.
1326    Return false if (number_of_files > 0) and no files can be opened,
1327    true otherwise.
1328
1329    With each column/file p, p->full_page_printed is initialized,
1330    see also open_file.  */
1331
1332 static bool
1333 init_fps (int number_of_files, char **av)
1334 {
1335   int i, files_left;
1336   COLUMN *p;
1337   FILE *firstfp;
1338   char const *firstname;
1339
1340   total_files = 0;
1341
1342   free (column_vector);
1343   column_vector = xnmalloc (columns, sizeof (COLUMN));
1344
1345   if (parallel_files)
1346     {
1347       files_left = number_of_files;
1348       for (p = column_vector; files_left--; ++p, ++av)
1349         {
1350           if (! open_file (*av, p))
1351             {
1352               --p;
1353               --columns;
1354             }
1355         }
1356       if (columns == 0)
1357         return false;
1358       init_header ("", -1);
1359     }
1360   else
1361     {
1362       p = column_vector;
1363       if (number_of_files > 0)
1364         {
1365           if (! open_file (*av, p))
1366             return false;
1367           init_header (*av, fileno (p->fp));
1368           p->lines_stored = 0;
1369         }
1370       else
1371         {
1372           p->name = _("standard input");
1373           p->fp = stdin;
1374           have_read_stdin = true;
1375           p->status = OPEN;
1376           p->full_page_printed = false;
1377           ++total_files;
1378           init_header ("", -1);
1379           p->lines_stored = 0;
1380         }
1381
1382       firstname = p->name;
1383       firstfp = p->fp;
1384       for (i = columns - 1, ++p; i; --i, ++p)
1385         {
1386           p->name = firstname;
1387           p->fp = firstfp;
1388           p->status = OPEN;
1389           p->full_page_printed = false;
1390           p->lines_stored = 0;
1391         }
1392     }
1393   files_ready_to_read = total_files;
1394   return true;
1395 }
1396 \f
1397 /* Determine print_func and char_func, the functions
1398    used by each column for printing and/or storing.
1399
1400    Determine the horizontal position desired when we begin
1401    printing a column (p->start_position). */
1402
1403 static void
1404 init_funcs (void)
1405 {
1406   int i, h, h_next;
1407   COLUMN *p;
1408
1409   h = chars_per_margin;
1410
1411   if (!truncate_lines)
1412     h_next = ANYWHERE;
1413   else
1414     {
1415       /* When numbering lines of parallel files, we enlarge the
1416          first column to accomodate the number.  Looks better than
1417          the Sys V approach. */
1418       if (parallel_files && numbered_lines)
1419         h_next = h + chars_per_column + number_width;
1420       else
1421         h_next = h + chars_per_column;
1422     }
1423
1424   /* Enlarge p->start_position of first column to use the same form of
1425      padding_not_printed with all columns. */
1426   h = h + col_sep_length;
1427
1428   /* This loop takes care of all but the rightmost column. */
1429
1430   for (p = column_vector, i = 1; i < columns; ++p, ++i)
1431     {
1432       if (storing_columns)      /* One file, multi columns down. */
1433         {
1434           p->char_func = store_char;
1435           p->print_func = print_stored;
1436         }
1437       else
1438         /* One file, multi columns across; or parallel files.  */
1439         {
1440           p->char_func = print_char;
1441           p->print_func = read_line;
1442         }
1443
1444       /* Number only the first column when printing files in
1445          parallel. */
1446       p->numbered = numbered_lines && (!parallel_files || i == 1);
1447       p->start_position = h;
1448
1449       /* If we don't truncate lines, all start_positions are
1450          ANYWHERE, except the first column's start_position when
1451          using a margin. */
1452
1453       if (!truncate_lines)
1454         {
1455           h = ANYWHERE;
1456           h_next = ANYWHERE;
1457         }
1458       else
1459         {
1460           h = h_next + col_sep_length;
1461           h_next = h + chars_per_column;
1462         }
1463     }
1464
1465   /* The rightmost column.
1466
1467      Doesn't need to be stored unless we intend to balance
1468      columns on the last page. */
1469   if (storing_columns && balance_columns)
1470     {
1471       p->char_func = store_char;
1472       p->print_func = print_stored;
1473     }
1474   else
1475     {
1476       p->char_func = print_char;
1477       p->print_func = read_line;
1478     }
1479
1480   p->numbered = numbered_lines && (!parallel_files || i == 1);
1481   p->start_position = h;
1482 }
1483 \f
1484 /* Open a file.  Return true if successful.
1485
1486    With each file p, p->full_page_printed is initialized,
1487    see also init_fps. */
1488
1489 static bool
1490 open_file (char *name, COLUMN *p)
1491 {
1492   if (STREQ (name, "-"))
1493     {
1494       p->name = _("standard input");
1495       p->fp = stdin;
1496       have_read_stdin = true;
1497     }
1498   else
1499     {
1500       p->name = name;
1501       p->fp = fopen (name, "r");
1502     }
1503   if (p->fp == NULL)
1504     {
1505       failed_opens = true;
1506       if (!ignore_failed_opens)
1507         error (0, errno, "%s", name);
1508       return false;
1509     }
1510   fadvise (p->fp, FADVISE_SEQUENTIAL);
1511   p->status = OPEN;
1512   p->full_page_printed = false;
1513   ++total_files;
1514   return true;
1515 }
1516
1517 /* Close the file in P.
1518
1519    If we aren't dealing with multiple files in parallel, we change
1520    the status of all columns in the column list to reflect the close. */
1521
1522 static void
1523 close_file (COLUMN *p)
1524 {
1525   COLUMN *q;
1526   int i;
1527
1528   if (p->status == CLOSED)
1529     return;
1530   if (ferror (p->fp))
1531     error (EXIT_FAILURE, errno, "%s", p->name);
1532   if (fileno (p->fp) != STDIN_FILENO && fclose (p->fp) != 0)
1533     error (EXIT_FAILURE, errno, "%s", p->name);
1534
1535   if (!parallel_files)
1536     {
1537       for (q = column_vector, i = columns; i; ++q, --i)
1538         {
1539           q->status = CLOSED;
1540           if (q->lines_stored == 0)
1541             {
1542               q->lines_to_print = 0;
1543             }
1544         }
1545     }
1546   else
1547     {
1548       p->status = CLOSED;
1549       p->lines_to_print = 0;
1550     }
1551
1552   --files_ready_to_read;
1553 }
1554
1555 /* Put a file on hold until we start a new page,
1556    since we've hit a form feed.
1557
1558    If we aren't dealing with parallel files, we must change the
1559    status of all columns in the column list. */
1560
1561 static void
1562 hold_file (COLUMN *p)
1563 {
1564   COLUMN *q;
1565   int i;
1566
1567   if (!parallel_files)
1568     for (q = column_vector, i = columns; i; ++q, --i)
1569       {
1570         if (storing_columns)
1571           q->status = FF_FOUND;
1572         else
1573           q->status = ON_HOLD;
1574       }
1575   else
1576     p->status = ON_HOLD;
1577
1578   p->lines_to_print = 0;
1579   --files_ready_to_read;
1580 }
1581
1582 /* Undo hold_file -- go through the column list and change any
1583    ON_HOLD columns to OPEN.  Used at the end of each page. */
1584
1585 static void
1586 reset_status (void)
1587 {
1588   int i = columns;
1589   COLUMN *p;
1590
1591   for (p = column_vector; i; --i, ++p)
1592     if (p->status == ON_HOLD)
1593       {
1594         p->status = OPEN;
1595         files_ready_to_read++;
1596       }
1597
1598   if (storing_columns)
1599     {
1600       if (column_vector->status == CLOSED)
1601         /* We use the info to output an error message in  skip_to_page. */
1602         files_ready_to_read = 0;
1603       else
1604         files_ready_to_read = 1;
1605     }
1606 }
1607 \f
1608 /* Print a single file, or multiple files in parallel.
1609
1610    Set up the list of columns, opening the necessary files.
1611    Allocate space for storing columns, if necessary.
1612    Skip to first_page_number, if user has asked to skip leading pages.
1613    Determine which functions are appropriate to store/print lines
1614    in each column.
1615    Print the file(s). */
1616
1617 static void
1618 print_files (int number_of_files, char **av)
1619 {
1620   init_parameters (number_of_files);
1621   if (! init_fps (number_of_files, av))
1622     return;
1623   if (storing_columns)
1624     init_store_cols ();
1625
1626   if (first_page_number > 1)
1627     {
1628       if (!skip_to_page (first_page_number))
1629         return;
1630       else
1631         page_number = first_page_number;
1632     }
1633   else
1634     page_number = 1;
1635
1636   init_funcs ();
1637
1638   line_number = line_count;
1639   while (print_page ())
1640     ;
1641 }
1642 \f
1643 /* Initialize header information.
1644    If DESC is non-negative, it is a file descriptor open to
1645    FILENAME for reading.  */
1646
1647 static void
1648 init_header (char const *filename, int desc)
1649 {
1650   char *buf = NULL;
1651   struct stat st;
1652   struct timespec t;
1653   int ns;
1654   struct tm *tm;
1655
1656   /* If parallel files or standard input, use current date. */
1657   if (STREQ (filename, "-"))
1658     desc = -1;
1659   if (0 <= desc && fstat (desc, &st) == 0)
1660     t = get_stat_mtime (&st);
1661   else
1662     {
1663       static struct timespec timespec;
1664       if (! timespec.tv_sec)
1665         gettime (&timespec);
1666       t = timespec;
1667     }
1668
1669   ns = t.tv_nsec;
1670   tm = localtime (&t.tv_sec);
1671   if (tm == NULL)
1672     {
1673       buf = xmalloc (INT_BUFSIZE_BOUND (long int)
1674                      + MAX (10, INT_BUFSIZE_BOUND (int)));
1675       sprintf (buf, "%ld.%09d", (long int) t.tv_sec, ns);
1676     }
1677   else
1678     {
1679       size_t bufsize = nstrftime (NULL, SIZE_MAX, date_format, tm, 0, ns) + 1;
1680       buf = xmalloc (bufsize);
1681       nstrftime (buf, bufsize, date_format, tm, 0, ns);
1682     }
1683
1684   free (date_text);
1685   date_text = buf;
1686   file_text = custom_header ? custom_header : desc < 0 ? "" : filename;
1687   header_width_available = (chars_per_line
1688                             - mbswidth (date_text, 0)
1689                             - mbswidth (file_text, 0));
1690 }
1691 \f
1692 /* Set things up for printing a page
1693
1694    Scan through the columns ...
1695    Determine which are ready to print
1696    (i.e., which have lines stored or open files)
1697    Set p->lines_to_print appropriately
1698    (to p->lines_stored if we're storing, or lines_per_body
1699    if we're reading straight from the file)
1700    Keep track of this total so we know when to stop printing */
1701
1702 static void
1703 init_page (void)
1704 {
1705   int j;
1706   COLUMN *p;
1707
1708   if (storing_columns)
1709     {
1710       store_columns ();
1711       for (j = columns - 1, p = column_vector; j; --j, ++p)
1712         {
1713           p->lines_to_print = p->lines_stored;
1714         }
1715
1716       /* Last column. */
1717       if (balance_columns)
1718         {
1719           p->lines_to_print = p->lines_stored;
1720         }
1721       /* Since we're not balancing columns, we don't need to store
1722          the rightmost column.   Read it straight from the file. */
1723       else
1724         {
1725           if (p->status == OPEN)
1726             {
1727               p->lines_to_print = lines_per_body;
1728             }
1729           else
1730             p->lines_to_print = 0;
1731         }
1732     }
1733   else
1734     for (j = columns, p = column_vector; j; --j, ++p)
1735       if (p->status == OPEN)
1736         {
1737           p->lines_to_print = lines_per_body;
1738         }
1739       else
1740         p->lines_to_print = 0;
1741 }
1742
1743 /* Align empty columns and print separators.
1744    Empty columns will be formed by files with status ON_HOLD or CLOSED
1745    when printing multiple files in parallel. */
1746
1747 static void
1748 align_column (COLUMN *p)
1749 {
1750   padding_not_printed = p->start_position;
1751   if (padding_not_printed - col_sep_length > 0)
1752     {
1753       pad_across_to (padding_not_printed - col_sep_length);
1754       padding_not_printed = ANYWHERE;
1755     }
1756
1757   if (use_col_separator)
1758     print_sep_string ();
1759
1760   if (p->numbered)
1761     add_line_number (p);
1762 }
1763
1764 /* Print one page.
1765
1766    As long as there are lines left on the page and columns ready to print,
1767    Scan across the column list
1768    if the column has stored lines or the file is open
1769    pad to the appropriate spot
1770    print the column
1771    pad the remainder of the page with \n or \f as requested
1772    reset the status of all files -- any files which where on hold because
1773    of formfeeds are now put back into the lineup. */
1774
1775 static bool
1776 print_page (void)
1777 {
1778   int j;
1779   int lines_left_on_page;
1780   COLUMN *p;
1781
1782   /* Used as an accumulator (with | operator) of successive values of
1783      pad_vertically.  The trick is to set pad_vertically
1784      to false before each run through the inner loop, then after that
1785      loop, it tells us whether a line was actually printed (whether a
1786      newline needs to be output -- or two for double spacing).  But those
1787      values have to be accumulated (in pv) so we can invoke pad_down
1788      properly after the outer loop completes. */
1789   bool pv;
1790
1791   init_page ();
1792
1793   if (cols_ready_to_print () == 0)
1794     return false;
1795
1796   if (extremities)
1797     print_a_header = true;
1798
1799   /* Don't pad unless we know a page was printed. */
1800   pad_vertically = false;
1801   pv = false;
1802
1803   lines_left_on_page = lines_per_body;
1804   if (double_space)
1805     lines_left_on_page *= 2;
1806
1807   while (lines_left_on_page > 0 && cols_ready_to_print () > 0)
1808     {
1809       output_position = 0;
1810       spaces_not_printed = 0;
1811       separators_not_printed = 0;
1812       pad_vertically = false;
1813       align_empty_cols = false;
1814       empty_line = true;
1815
1816       for (j = 1, p = column_vector; j <= columns; ++j, ++p)
1817         {
1818           input_position = 0;
1819           if (p->lines_to_print > 0 || p->status == FF_FOUND)
1820             {
1821               FF_only = false;
1822               padding_not_printed = p->start_position;
1823               if (!(p->print_func) (p))
1824                 read_rest_of_line (p);
1825               pv |= pad_vertically;
1826
1827               --p->lines_to_print;
1828               if (p->lines_to_print <= 0)
1829                 {
1830                   if (cols_ready_to_print () <= 0)
1831                     break;
1832                 }
1833
1834               /* File p changed its status to ON_HOLD or CLOSED */
1835               if (parallel_files && p->status != OPEN)
1836                 {
1837                   if (empty_line)
1838                     align_empty_cols = true;
1839                   else if (p->status == CLOSED
1840                            || (p->status == ON_HOLD && FF_only))
1841                     align_column (p);
1842                 }
1843             }
1844           else if (parallel_files)
1845             {
1846               /* File status ON_HOLD or CLOSED */
1847               if (empty_line)
1848                 align_empty_cols = true;
1849               else
1850                 align_column (p);
1851             }
1852
1853           /* We need it also with an empty column */
1854           if (use_col_separator)
1855             ++separators_not_printed;
1856         }
1857
1858       if (pad_vertically)
1859         {
1860           putchar ('\n');
1861           --lines_left_on_page;
1862         }
1863
1864       if (cols_ready_to_print () <= 0 && !extremities)
1865         break;
1866
1867       if (double_space && pv)
1868         {
1869           putchar ('\n');
1870           --lines_left_on_page;
1871         }
1872     }
1873
1874   if (lines_left_on_page == 0)
1875     for (j = 1, p = column_vector; j <= columns; ++j, ++p)
1876       if (p->status == OPEN)
1877         p->full_page_printed = true;
1878
1879   pad_vertically = pv;
1880
1881   if (pad_vertically && extremities)
1882     pad_down (lines_left_on_page + lines_per_footer);
1883   else if (keep_FF && print_a_FF)
1884     {
1885       putchar ('\f');
1886       print_a_FF = false;
1887     }
1888
1889   if (last_page_number < ++page_number)
1890     return false;               /* Stop printing with LAST_PAGE */
1891
1892   reset_status ();              /* Change ON_HOLD to OPEN. */
1893
1894   return true;                  /* More pages to go. */
1895 }
1896 \f
1897 /* Allocate space for storing columns.
1898
1899    This is necessary when printing multiple columns from a single file.
1900    Lines are stored consecutively in buff, separated by '\0'.
1901
1902    The following doesn't apply any longer - any tuning possible?
1903    (We can't use a fixed offset since with the '-s' flag lines aren't
1904    truncated.)
1905
1906    We maintain a list (line_vector) of pointers to the beginnings
1907    of lines in buff.  We allocate one more than the number of lines
1908    because the last entry tells us the index of the last character,
1909    which we need to know in order to print the last line in buff. */
1910
1911 static void
1912 init_store_cols (void)
1913 {
1914   int total_lines = lines_per_body * columns;
1915   int chars_if_truncate = total_lines * (chars_per_column + 1);
1916
1917   free (line_vector);
1918   /* FIXME: here's where it was allocated.  */
1919   line_vector = xmalloc ((total_lines + 1) * sizeof *line_vector);
1920
1921   free (end_vector);
1922   end_vector = xmalloc (total_lines * sizeof *end_vector);
1923
1924   free (buff);
1925   buff_allocated = (use_col_separator
1926                     ? 2 * chars_if_truncate
1927                     : chars_if_truncate);       /* Tune this. */
1928   buff = xmalloc (buff_allocated);
1929 }
1930
1931 /* Store all but the rightmost column.
1932    (Used when printing a single file in multiple downward columns)
1933
1934    For each column
1935    set p->current_line to be the index in line_vector of the
1936    first line in the column
1937    For each line in the column
1938    store the line in buff
1939    add to line_vector the index of the line's first char
1940    buff_start is the index in buff of the first character in the
1941    current line. */
1942
1943 static void
1944 store_columns (void)
1945 {
1946   int i, j;
1947   unsigned int line = 0;
1948   unsigned int buff_start;
1949   int last_col;         /* The rightmost column which will be saved in buff */
1950   COLUMN *p;
1951
1952   buff_current = 0;
1953   buff_start = 0;
1954
1955   if (balance_columns)
1956     last_col = columns;
1957   else
1958     last_col = columns - 1;
1959
1960   for (i = 1, p = column_vector; i <= last_col; ++i, ++p)
1961     p->lines_stored = 0;
1962
1963   for (i = 1, p = column_vector; i <= last_col && files_ready_to_read;
1964        ++i, ++p)
1965     {
1966       p->current_line = line;
1967       for (j = lines_per_body; j && files_ready_to_read; --j)
1968
1969         if (p->status == OPEN)  /* Redundant.  Clean up. */
1970           {
1971             input_position = 0;
1972
1973             if (!read_line (p))
1974               read_rest_of_line (p);
1975
1976             if (p->status == OPEN
1977                 || buff_start != buff_current)
1978               {
1979                 ++p->lines_stored;
1980                 line_vector[line] = buff_start;
1981                 end_vector[line++] = input_position;
1982                 buff_start = buff_current;
1983               }
1984           }
1985     }
1986
1987   /* Keep track of the location of the last char in buff. */
1988   line_vector[line] = buff_start;
1989
1990   if (balance_columns)
1991     balance (line);
1992 }
1993
1994 static void
1995 balance (int total_stored)
1996 {
1997   COLUMN *p;
1998   int i, lines;
1999   int first_line = 0;
2000
2001   for (i = 1, p = column_vector; i <= columns; ++i, ++p)
2002     {
2003       lines = total_stored / columns;
2004       if (i <= total_stored % columns)
2005         ++lines;
2006
2007       p->lines_stored = lines;
2008       p->current_line = first_line;
2009
2010       first_line += lines;
2011     }
2012 }
2013
2014 /* Store a character in the buffer. */
2015
2016 static void
2017 store_char (char c)
2018 {
2019   if (buff_current >= buff_allocated)
2020     {
2021       /* May be too generous. */
2022       buff = X2REALLOC (buff, &buff_allocated);
2023     }
2024   buff[buff_current++] = c;
2025 }
2026
2027 static void
2028 add_line_number (COLUMN *p)
2029 {
2030   int i;
2031   char *s;
2032   int left_cut;
2033
2034   /* Cutting off the higher-order digits is more informative than
2035      lower-order cut off*/
2036   if (line_number < power_10)
2037     sprintf (number_buff, "%*d", chars_per_number, line_number);
2038   else
2039     {
2040       left_cut = line_number % power_10;
2041       sprintf (number_buff, "%0*d", chars_per_number, left_cut);
2042     }
2043   line_number++;
2044   s = number_buff;
2045   for (i = chars_per_number; i > 0; i--)
2046     (p->char_func) (*s++);
2047
2048   if (columns > 1)
2049     {
2050       /* Tabification is assumed for multiple columns, also for n-separators,
2051          but 'default n-separator = TAB' hasn't been given priority over
2052          equal column_width also specified by POSIX. */
2053       if (number_separator == '\t')
2054         {
2055           i = number_width - chars_per_number;
2056           while (i-- > 0)
2057             (p->char_func) (' ');
2058         }
2059       else
2060         (p->char_func) (number_separator);
2061     }
2062   else
2063     /* To comply with POSIX, we avoid any expansion of default TAB
2064        separator with a single column output. No column_width requirement
2065        has to be considered. */
2066     {
2067       (p->char_func) (number_separator);
2068       if (number_separator == '\t')
2069         output_position = POS_AFTER_TAB (chars_per_output_tab,
2070                           output_position);
2071     }
2072
2073   if (truncate_lines && !parallel_files)
2074     input_position += number_width;
2075 }
2076 \f
2077 /* Print (or store) padding until the current horizontal position
2078    is position. */
2079
2080 static void
2081 pad_across_to (int position)
2082 {
2083   int h = output_position;
2084
2085   if (tabify_output)
2086     spaces_not_printed = position - output_position;
2087   else
2088     {
2089       while (++h <= position)
2090         putchar (' ');
2091       output_position = position;
2092     }
2093 }
2094
2095 /* Pad to the bottom of the page.
2096
2097    If the user has requested a formfeed, use one.
2098    Otherwise, use newlines. */
2099
2100 static void
2101 pad_down (int lines)
2102 {
2103   int i;
2104
2105   if (use_form_feed)
2106     putchar ('\f');
2107   else
2108     for (i = lines; i; --i)
2109       putchar ('\n');
2110 }
2111
2112 /* Read the rest of the line.
2113
2114    Read from the current column's file until an end of line is
2115    hit.  Used when we've truncated a line and we no longer need
2116    to print or store its characters. */
2117
2118 static void
2119 read_rest_of_line (COLUMN *p)
2120 {
2121   int c;
2122   FILE *f = p->fp;
2123
2124   while ((c = getc (f)) != '\n')
2125     {
2126       if (c == '\f')
2127         {
2128           if ((c = getc (f)) != '\n')
2129             ungetc (c, f);
2130           if (keep_FF)
2131             print_a_FF = true;
2132           hold_file (p);
2133           break;
2134         }
2135       else if (c == EOF)
2136         {
2137           close_file (p);
2138           break;
2139         }
2140     }
2141 }
2142
2143 /* Read a line with skip_to_page.
2144
2145    Read from the current column's file until an end of line is
2146    hit.  Used when we read full lines to skip pages.
2147    With skip_to_page we have to check for FF-coincidence which is done
2148    in function read_line otherwise.
2149    Count lines of skipped pages to find the line number of 1st page
2150    printed relative to 1st line of input file (start_line_num). */
2151
2152 static void
2153 skip_read (COLUMN *p, int column_number)
2154 {
2155   int c;
2156   FILE *f = p->fp;
2157   int i;
2158   bool single_ff = false;
2159   COLUMN *q;
2160
2161   /* Read 1st character in a line or any character succeeding a FF */
2162   if ((c = getc (f)) == '\f' && p->full_page_printed)
2163     /* A FF-coincidence with a previous full_page_printed.
2164        To avoid an additional empty page, eliminate the FF */
2165     if ((c = getc (f)) == '\n')
2166       c = getc (f);
2167
2168   p->full_page_printed = false;
2169
2170   /* 1st character a FF means a single FF without any printable
2171      characters. Don't count it as a line with -n option. */
2172   if (c == '\f')
2173     single_ff = true;
2174
2175   /* Preparing for a FF-coincidence: Maybe we finish that page
2176      without a FF found */
2177   if (last_line)
2178     p->full_page_printed = true;
2179
2180   while (c != '\n')
2181     {
2182       if (c == '\f')
2183         {
2184           /* No FF-coincidence possible,
2185              no catching up of a FF-coincidence with next page */
2186           if (last_line)
2187             {
2188               if (!parallel_files)
2189                 for (q = column_vector, i = columns; i; ++q, --i)
2190                   q->full_page_printed = false;
2191               else
2192                 p->full_page_printed = false;
2193             }
2194
2195           if ((c = getc (f)) != '\n')
2196             ungetc (c, f);
2197           hold_file (p);
2198           break;
2199         }
2200       else if (c == EOF)
2201         {
2202           close_file (p);
2203           break;
2204         }
2205       c = getc (f);
2206     }
2207
2208   if (skip_count)
2209     if ((!parallel_files || column_number == 1) && !single_ff)
2210       ++line_count;
2211 }
2212 \f
2213 /* If we're tabifying output,
2214
2215    When print_char encounters white space it keeps track
2216    of our desired horizontal position and delays printing
2217    until this function is called. */
2218
2219 static void
2220 print_white_space (void)
2221 {
2222   int h_new;
2223   int h_old = output_position;
2224   int goal = h_old + spaces_not_printed;
2225
2226   while (goal - h_old > 1
2227          && (h_new = POS_AFTER_TAB (chars_per_output_tab, h_old)) <= goal)
2228     {
2229       putchar (output_tab_char);
2230       h_old = h_new;
2231     }
2232   while (++h_old <= goal)
2233     putchar (' ');
2234
2235   output_position = goal;
2236   spaces_not_printed = 0;
2237 }
2238
2239 /* Print column separators.
2240
2241    We keep a count until we know that we'll be printing a line,
2242    then print_sep_string() is called. */
2243
2244 static void
2245 print_sep_string (void)
2246 {
2247   char *s;
2248   int l = col_sep_length;
2249
2250   s = col_sep_string;
2251
2252   if (separators_not_printed <= 0)
2253     {
2254       /* We'll be starting a line with chars_per_margin, anything else? */
2255       if (spaces_not_printed > 0)
2256         print_white_space ();
2257     }
2258   else
2259     {
2260       for (; separators_not_printed > 0; --separators_not_printed)
2261         {
2262           while (l-- > 0)
2263             {
2264               /* 3 types of sep_strings: spaces only, spaces and chars,
2265               chars only */
2266               if (*s == ' ')
2267                 {
2268                   /* We're tabifying output; consecutive spaces in
2269                   sep_string may have to be converted to tabs */
2270                   s++;
2271                   ++spaces_not_printed;
2272                 }
2273               else
2274                 {
2275                   if (spaces_not_printed > 0)
2276                     print_white_space ();
2277                   putchar (*s++);
2278                   ++output_position;
2279                 }
2280             }
2281           /* sep_string ends with some spaces */
2282           if (spaces_not_printed > 0)
2283             print_white_space ();
2284         }
2285     }
2286 }
2287
2288 /* Print (or store, depending on p->char_func) a clump of N
2289    characters. */
2290
2291 static void
2292 print_clump (COLUMN *p, int n, char *clump)
2293 {
2294   while (n--)
2295     (p->char_func) (*clump++);
2296 }
2297
2298 /* Print a character.
2299
2300    Update the following comment: process-char hasn't been used any
2301    longer.
2302    If we're tabifying, all tabs have been converted to spaces by
2303    process_char().  Keep a count of consecutive spaces, and when
2304    a nonspace is encountered, call print_white_space() to print the
2305    required number of tabs and spaces. */
2306
2307 static void
2308 print_char (char c)
2309 {
2310   if (tabify_output)
2311     {
2312       if (c == ' ')
2313         {
2314           ++spaces_not_printed;
2315           return;
2316         }
2317       else if (spaces_not_printed > 0)
2318         print_white_space ();
2319
2320       /* Nonprintables are assumed to have width 0, except '\b'. */
2321       if (! isprint (to_uchar (c)))
2322         {
2323           if (c == '\b')
2324             --output_position;
2325         }
2326       else
2327         ++output_position;
2328     }
2329   putchar (c);
2330 }
2331
2332 /* Skip to page PAGE before printing.
2333    PAGE may be larger than total number of pages. */
2334
2335 static bool
2336 skip_to_page (uintmax_t page)
2337 {
2338   uintmax_t n;
2339   int i;
2340   int j;
2341   COLUMN *p;
2342
2343   for (n = 1; n < page; ++n)
2344     {
2345       for (i = 1; i < lines_per_body; ++i)
2346         {
2347           for (j = 1, p = column_vector; j <= columns; ++j, ++p)
2348             if (p->status == OPEN)
2349               skip_read (p, j);
2350         }
2351       last_line = true;
2352       for (j = 1, p = column_vector; j <= columns; ++j, ++p)
2353         if (p->status == OPEN)
2354           skip_read (p, j);
2355
2356       if (storing_columns)      /* change FF_FOUND to ON_HOLD */
2357         for (j = 1, p = column_vector; j <= columns; ++j, ++p)
2358           if (p->status != CLOSED)
2359             p->status = ON_HOLD;
2360
2361       reset_status ();
2362       last_line = false;
2363
2364       if (files_ready_to_read < 1)
2365         {
2366           /* It's very helpful, normally the total number of pages is
2367              not known in advance.  */
2368           error (0, 0,
2369                  _("starting page number %"PRIuMAX
2370                    " exceeds page count %"PRIuMAX),
2371                  page, n);
2372           break;
2373         }
2374     }
2375   return files_ready_to_read > 0;
2376 }
2377
2378 /* Print a header.
2379
2380    Formfeeds are assumed to use up two lines at the beginning of
2381    the page. */
2382
2383 static void
2384 print_header (void)
2385 {
2386   char page_text[256 + INT_STRLEN_BOUND (page_number)];
2387   int available_width;
2388   int lhs_spaces;
2389   int rhs_spaces;
2390
2391   output_position = 0;
2392   pad_across_to (chars_per_margin);
2393   print_white_space ();
2394
2395   if (page_number == 0)
2396     error (EXIT_FAILURE, 0, _("page number overflow"));
2397
2398   /* The translator must ensure that formatting the translation of
2399      "Page %"PRIuMAX does not generate more than (sizeof page_text - 1)
2400      bytes.  */
2401   sprintf (page_text, _("Page %"PRIuMAX), page_number);
2402   available_width = header_width_available - mbswidth (page_text, 0);
2403   available_width = MAX (0, available_width);
2404   lhs_spaces = available_width >> 1;
2405   rhs_spaces = available_width - lhs_spaces;
2406
2407   printf ("\n\n%*s%s%*s%s%*s%s\n\n\n",
2408           chars_per_margin, "",
2409           date_text, lhs_spaces, " ",
2410           file_text, rhs_spaces, " ", page_text);
2411
2412   print_a_header = false;
2413   output_position = 0;
2414 }
2415
2416 /* Print (or store, if p->char_func is store_char()) a line.
2417
2418    Read a character to determine whether we have a line or not.
2419    (We may hit EOF, \n, or \f)
2420
2421    Once we know we have a line,
2422    set pad_vertically = true, meaning it's safe
2423    to pad down at the end of the page, since we do have a page.
2424    print a header if needed.
2425    pad across to padding_not_printed if needed.
2426    print any separators which need to be printed.
2427    print a line number if it needs to be printed.
2428
2429    Print the clump which corresponds to the first character.
2430
2431    Enter a loop and keep printing until an end of line condition
2432    exists, or until we exceed chars_per_column.
2433
2434    Return false if we exceed chars_per_column before reading
2435    an end of line character, true otherwise. */
2436
2437 static bool
2438 read_line (COLUMN *p)
2439 {
2440   int c;
2441   int chars IF_LINT ( = 0);
2442   int last_input_position;
2443   int j, k;
2444   COLUMN *q;
2445
2446   /* read 1st character in each line or any character succeeding a FF: */
2447   c = getc (p->fp);
2448
2449   last_input_position = input_position;
2450
2451   if (c == '\f' && p->full_page_printed)
2452     if ((c = getc (p->fp)) == '\n')
2453       c = getc (p->fp);
2454   p->full_page_printed = false;
2455
2456   switch (c)
2457     {
2458     case '\f':
2459       if ((c = getc (p->fp)) != '\n')
2460         ungetc (c, p->fp);
2461       FF_only = true;
2462       if (print_a_header && !storing_columns)
2463         {
2464           pad_vertically = true;
2465           print_header ();
2466         }
2467       else if (keep_FF)
2468         print_a_FF = true;
2469       hold_file (p);
2470       return true;
2471     case EOF:
2472       close_file (p);
2473       return true;
2474     case '\n':
2475       break;
2476     default:
2477       chars = char_to_clump (c);
2478     }
2479
2480   if (truncate_lines && input_position > chars_per_column)
2481     {
2482       input_position = last_input_position;
2483       return false;
2484     }
2485
2486   if (p->char_func != store_char)
2487     {
2488       pad_vertically = true;
2489
2490       if (print_a_header && !storing_columns)
2491         print_header ();
2492
2493       if (parallel_files && align_empty_cols)
2494         {
2495           /* We have to align empty columns at the beginning of a line. */
2496           k = separators_not_printed;
2497           separators_not_printed = 0;
2498           for (j = 1, q = column_vector; j <= k; ++j, ++q)
2499             {
2500               align_column (q);
2501               separators_not_printed += 1;
2502             }
2503           padding_not_printed = p->start_position;
2504           if (truncate_lines)
2505             spaces_not_printed = chars_per_column;
2506           else
2507             spaces_not_printed = 0;
2508           align_empty_cols = false;
2509         }
2510
2511       if (padding_not_printed - col_sep_length > 0)
2512         {
2513           pad_across_to (padding_not_printed - col_sep_length);
2514           padding_not_printed = ANYWHERE;
2515         }
2516
2517       if (use_col_separator)
2518         print_sep_string ();
2519     }
2520
2521   if (p->numbered)
2522     add_line_number (p);
2523
2524   empty_line = false;
2525   if (c == '\n')
2526     return true;
2527
2528   print_clump (p, chars, clump_buff);
2529
2530   while (true)
2531     {
2532       c = getc (p->fp);
2533
2534       switch (c)
2535         {
2536         case '\n':
2537           return true;
2538         case '\f':
2539           if ((c = getc (p->fp)) != '\n')
2540             ungetc (c, p->fp);
2541           if (keep_FF)
2542             print_a_FF = true;
2543           hold_file (p);
2544           return true;
2545         case EOF:
2546           close_file (p);
2547           return true;
2548         }
2549
2550       last_input_position = input_position;
2551       chars = char_to_clump (c);
2552       if (truncate_lines && input_position > chars_per_column)
2553         {
2554           input_position = last_input_position;
2555           return false;
2556         }
2557
2558       print_clump (p, chars, clump_buff);
2559     }
2560 }
2561
2562 /* Print a line from buff.
2563
2564    If this function has been called, we know we have "something to
2565    print". But it remains to be seen whether we have a real text page
2566    or an empty page (a single form feed) with/without a header only.
2567    Therefore first we set pad_vertically to true and print a header
2568    if necessary.
2569    If FF_FOUND and we are using -t|-T option we omit any newline by
2570    setting pad_vertically to false (see print_page).
2571    Otherwise we pad across if necessary, print separators if necessary
2572    and text of COLUMN *p.
2573
2574    Return true, meaning there is no need to call read_rest_of_line. */
2575
2576 static bool
2577 print_stored (COLUMN *p)
2578 {
2579   COLUMN *q;
2580   int i;
2581
2582   int line = p->current_line++;
2583   char *first = &buff[line_vector[line]];
2584   /* FIXME
2585      UMR: Uninitialized memory read:
2586      * This is occurring while in:
2587      print_stored   [pr.c:2239]
2588      * Reading 4 bytes from 0x5148c in the heap.
2589      * Address 0x5148c is 4 bytes into a malloc'd block at 0x51488 of 676 bytes
2590      * This block was allocated from:
2591      malloc         [rtlib.o]
2592      xmalloc        [xmalloc.c:94]
2593      init_store_cols [pr.c:1648]
2594      */
2595   char *last = &buff[line_vector[line + 1]];
2596
2597   pad_vertically = true;
2598
2599   if (print_a_header)
2600     print_header ();
2601
2602   if (p->status == FF_FOUND)
2603     {
2604       for (i = 1, q = column_vector; i <= columns; ++i, ++q)
2605         q->status = ON_HOLD;
2606       if (column_vector->lines_to_print <= 0)
2607         {
2608           if (!extremities)
2609             pad_vertically = false;
2610           return true;          /* print a header only */
2611         }
2612     }
2613
2614   if (padding_not_printed - col_sep_length > 0)
2615     {
2616       pad_across_to (padding_not_printed - col_sep_length);
2617       padding_not_printed = ANYWHERE;
2618     }
2619
2620   if (use_col_separator)
2621     print_sep_string ();
2622
2623   while (first != last)
2624     print_char (*first++);
2625
2626   if (spaces_not_printed == 0)
2627     {
2628       output_position = p->start_position + end_vector[line];
2629       if (p->start_position - col_sep_length == chars_per_margin)
2630         output_position -= col_sep_length;
2631     }
2632
2633   return true;
2634 }
2635
2636 /* Convert a character to the proper format and return the number of
2637    characters in the resulting clump.  Increment input_position by
2638    the width of the clump.
2639
2640    Tabs are converted to clumps of spaces.
2641    Nonprintable characters may be converted to clumps of escape
2642    sequences or control prefixes.
2643
2644    Note: the width of a clump is not necessarily equal to the number of
2645    characters in clump_buff.  (e.g, the width of '\b' is -1, while the
2646    number of characters is 1.) */
2647
2648 static int
2649 char_to_clump (char c)
2650 {
2651   unsigned char uc = c;
2652   char *s = clump_buff;
2653   int i;
2654   char esc_buff[4];
2655   int width;
2656   int chars;
2657   int chars_per_c = 8;
2658
2659   if (c == input_tab_char)
2660     chars_per_c = chars_per_input_tab;
2661
2662   if (c == input_tab_char || c == '\t')
2663     {
2664       width = TAB_WIDTH (chars_per_c, input_position);
2665
2666       if (untabify_input)
2667         {
2668           for (i = width; i; --i)
2669             *s++ = ' ';
2670           chars = width;
2671         }
2672       else
2673         {
2674           *s = c;
2675           chars = 1;
2676         }
2677
2678     }
2679   else if (! isprint (uc))
2680     {
2681       if (use_esc_sequence)
2682         {
2683           width = 4;
2684           chars = 4;
2685           *s++ = '\\';
2686           sprintf (esc_buff, "%03o", uc);
2687           for (i = 0; i <= 2; ++i)
2688             *s++ = esc_buff[i];
2689         }
2690       else if (use_cntrl_prefix)
2691         {
2692           if (uc < 0200)
2693             {
2694               width = 2;
2695               chars = 2;
2696               *s++ = '^';
2697               *s = c ^ 0100;
2698             }
2699           else
2700             {
2701               width = 4;
2702               chars = 4;
2703               *s++ = '\\';
2704               sprintf (esc_buff, "%03o", uc);
2705               for (i = 0; i <= 2; ++i)
2706                 *s++ = esc_buff[i];
2707             }
2708         }
2709       else if (c == '\b')
2710         {
2711           width = -1;
2712           chars = 1;
2713           *s = c;
2714         }
2715       else
2716         {
2717           width = 0;
2718           chars = 1;
2719           *s = c;
2720         }
2721     }
2722   else
2723     {
2724       width = 1;
2725       chars = 1;
2726       *s = c;
2727     }
2728
2729   /* Too many backspaces must put us in position 0 -- never negative.  */
2730   if (width < 0 && input_position == 0)
2731     {
2732       chars = 0;
2733       input_position = 0;
2734     }
2735   else if (width < 0 && input_position <= -width)
2736     input_position = 0;
2737   else
2738     input_position += width;
2739
2740   return chars;
2741 }
2742
2743 /* We've just printed some files and need to clean up things before
2744    looking for more options and printing the next batch of files.
2745
2746    Free everything we've xmalloc'ed, except 'header'. */
2747
2748 static void
2749 cleanup (void)
2750 {
2751   free (number_buff);
2752   free (clump_buff);
2753   free (column_vector);
2754   free (line_vector);
2755   free (end_vector);
2756   free (buff);
2757 }
2758 \f
2759 /* Complain, print a usage message, and die. */
2760
2761 void
2762 usage (int status)
2763 {
2764   if (status != EXIT_SUCCESS)
2765     emit_try_help ();
2766   else
2767     {
2768       printf (_("\
2769 Usage: %s [OPTION]... [FILE]...\n\
2770 "),
2771               program_name);
2772
2773       fputs (_("\
2774 Paginate or columnate FILE(s) for printing.\n\
2775 \n\
2776 "), stdout);
2777       fputs (_("\
2778 Mandatory arguments to long options are mandatory for short options too.\n\
2779 "), stdout);
2780       fputs (_("\
2781   +FIRST_PAGE[:LAST_PAGE], --pages=FIRST_PAGE[:LAST_PAGE]\n\
2782                     begin [stop] printing with page FIRST_[LAST_]PAGE\n\
2783   -COLUMN, --columns=COLUMN\n\
2784                     output COLUMN columns and print columns down,\n\
2785                     unless -a is used. Balance number of lines in the\n\
2786                     columns on each page\n\
2787 "), stdout);
2788       fputs (_("\
2789   -a, --across      print columns across rather than down, used together\n\
2790                     with -COLUMN\n\
2791   -c, --show-control-chars\n\
2792                     use hat notation (^G) and octal backslash notation\n\
2793   -d, --double-space\n\
2794                     double space the output\n\
2795 "), stdout);
2796       fputs (_("\
2797   -D, --date-format=FORMAT\n\
2798                     use FORMAT for the header date\n\
2799   -e[CHAR[WIDTH]], --expand-tabs[=CHAR[WIDTH]]\n\
2800                     expand input CHARs (TABs) to tab WIDTH (8)\n\
2801   -F, -f, --form-feed\n\
2802                     use form feeds instead of newlines to separate pages\n\
2803                     (by a 3-line page header with -F or a 5-line header\n\
2804                     and trailer without -F)\n\
2805 "), stdout);
2806       fputs (_("\
2807   -h, --header=HEADER\n\
2808                     use a centered HEADER instead of filename in page header,\n\
2809                     -h \"\" prints a blank line, don't use -h\"\"\n\
2810   -i[CHAR[WIDTH]], --output-tabs[=CHAR[WIDTH]]\n\
2811                     replace spaces with CHARs (TABs) to tab WIDTH (8)\n\
2812   -J, --join-lines  merge full lines, turns off -W line truncation, no column\n\
2813                     alignment, --sep-string[=STRING] sets separators\n\
2814 "), stdout);
2815       fputs (_("\
2816   -l, --length=PAGE_LENGTH\n\
2817                     set the page length to PAGE_LENGTH (66) lines\n\
2818                     (default number of lines of text 56, and with -F 63)\n\
2819   -m, --merge       print all files in parallel, one in each column,\n\
2820                     truncate lines, but join lines of full length with -J\n\
2821 "), stdout);
2822       fputs (_("\
2823   -n[SEP[DIGITS]], --number-lines[=SEP[DIGITS]]\n\
2824                     number lines, use DIGITS (5) digits, then SEP (TAB),\n\
2825                     default counting starts with 1st line of input file\n\
2826   -N, --first-line-number=NUMBER\n\
2827                     start counting with NUMBER at 1st line of first\n\
2828                     page printed (see +FIRST_PAGE)\n\
2829 "), stdout);
2830       fputs (_("\
2831   -o, --indent=MARGIN\n\
2832                     offset each line with MARGIN (zero) spaces, do not\n\
2833                     affect -w or -W, MARGIN will be added to PAGE_WIDTH\n\
2834   -r, --no-file-warnings\n\
2835                     omit warning when a file cannot be opened\n\
2836 "), stdout);
2837       fputs (_("\
2838   -s[CHAR], --separator[=CHAR]\n\
2839                     separate columns by a single character, default for CHAR\n\
2840                     is the <TAB> character without -w and \'no char\' with -w\n\
2841                     -s[CHAR] turns off line truncation of all 3 column\n\
2842                     options (-COLUMN|-a -COLUMN|-m) except -w is set\n\
2843 "), stdout);
2844       fputs (_("\
2845   -S[STRING], --sep-string[=STRING]\n\
2846                     separate columns by STRING,\n\
2847                     without -S: Default separator <TAB> with -J and <space>\n\
2848                     otherwise (same as -S\" \"), no effect on column options\n\
2849   -t, --omit-header  omit page headers and trailers\n\
2850 "), stdout);
2851       fputs (_("\
2852   -T, --omit-pagination\n\
2853                     omit page headers and trailers, eliminate any pagination\n\
2854                     by form feeds set in input files\n\
2855   -v, --show-nonprinting\n\
2856                     use octal backslash notation\n\
2857   -w, --width=PAGE_WIDTH\n\
2858                     set page width to PAGE_WIDTH (72) characters for\n\
2859                     multiple text-column output only, -s[char] turns off (72)\n\
2860 "), stdout);
2861       fputs (_("\
2862   -W, --page-width=PAGE_WIDTH\n\
2863                     set page width to PAGE_WIDTH (72) characters always,\n\
2864                     truncate lines, except -J option is set, no interference\n\
2865                     with -S or -s\n\
2866 "), stdout);
2867       fputs (HELP_OPTION_DESCRIPTION, stdout);
2868       fputs (VERSION_OPTION_DESCRIPTION, stdout);
2869       fputs (_("\
2870 \n\
2871 -t is implied if PAGE_LENGTH <= 10.  With no FILE, or when FILE is -, read\n\
2872 standard input.\n\
2873 "), stdout);
2874       emit_ancillary_info ();
2875     }
2876   exit (status);
2877 }