annotate code/cut.c__gnu.2015-05-01 @ 14:21ad1c1548c4

Code ausgewaehlter Implementierungen eingefuegt Das Datum entspricht dem Dateiaenderungsdatum.
author markus schnalke <meillo@marmaro.de>
date Tue, 12 May 2015 06:46:59 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
1 /* cut - remove parts of lines of files
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
2 Copyright (C) 1997-2015 Free Software Foundation, Inc.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
3 Copyright (C) 1984 David M. Ihnat
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
4
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
5 This program is free software: you can redistribute it and/or modify
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
7 the Free Software Foundation, either version 3 of the License, or
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
8 (at your option) any later version.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
9
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
13 GNU General Public License for more details.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
14
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
17
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
18 /* Written by David Ihnat. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
19
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
20 /* POSIX changes, bug fixes, long-named options, and cleanup
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
21 by David MacKenzie <djm@gnu.ai.mit.edu>.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
22
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
23 Rewrite cut_fields and cut_bytes -- Jim Meyering. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
24
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
25 #include <config.h>
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
26
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
27 #include <stdio.h>
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
28 #include <assert.h>
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
29 #include <getopt.h>
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
30 #include <sys/types.h>
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
31 #include "system.h"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
32
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
33 #include "error.h"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
34 #include "fadvise.h"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
35 #include "getndelim2.h"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
36 #include "hash.h"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
37 #include "quote.h"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
38 #include "xstrndup.h"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
39
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
40 /* The official name of this program (e.g., no 'g' prefix). */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
41 #define PROGRAM_NAME "cut"
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
42
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
43 #define AUTHORS \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
44 proper_name ("David M. Ihnat"), \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
45 proper_name ("David MacKenzie"), \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
46 proper_name ("Jim Meyering")
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
47
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
48 #define FATAL_ERROR(Message) \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
49 do \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
50 { \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
51 error (0, 0, (Message)); \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
52 usage (EXIT_FAILURE); \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
53 } \
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
54 while (0)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
55
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
56
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
57 struct range_pair
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
58 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
59 size_t lo;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
60 size_t hi;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
61 };
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
62
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
63 /* Array of `struct range_pair' holding all the finite ranges. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
64 static struct range_pair *rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
65
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
66 /* Pointer inside RP. When checking if a byte or field is selected
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
67 by a finite range, we check if it is between CURRENT_RP.LO
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
68 and CURRENT_RP.HI. If the byte or field index is greater than
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
69 CURRENT_RP.HI then we make CURRENT_RP to point to the next range pair. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
70 static struct range_pair *current_rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
71
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
72 /* Number of finite ranges specified by the user. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
73 static size_t n_rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
74
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
75 /* Number of `struct range_pair's allocated. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
76 static size_t n_rp_allocated;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
77
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
78
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
79 /* Append LOW, HIGH to the list RP of range pairs, allocating additional
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
80 space if necessary. Update global variable N_RP. When allocating,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
81 update global variable N_RP_ALLOCATED. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
82
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
83 static void
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
84 add_range_pair (size_t lo, size_t hi)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
85 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
86 if (n_rp == n_rp_allocated)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
87 rp = X2NREALLOC (rp, &n_rp_allocated);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
88 rp[n_rp].lo = lo;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
89 rp[n_rp].hi = hi;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
90 ++n_rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
91 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
92
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
93 /* This buffer is used to support the semantics of the -s option
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
94 (or lack of same) when the specified field list includes (does
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
95 not include) the first field. In both of those cases, the entire
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
96 first field must be read into this buffer to determine whether it
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
97 is followed by a delimiter or a newline before any of it may be
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
98 output. Otherwise, cut_fields can do the job without using this
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
99 buffer. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
100 static char *field_1_buffer;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
101
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
102 /* The number of bytes allocated for FIELD_1_BUFFER. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
103 static size_t field_1_bufsize;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
104
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
105 enum operating_mode
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
106 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
107 undefined_mode,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
108
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
109 /* Output characters that are in the given bytes. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
110 byte_mode,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
111
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
112 /* Output the given delimiter-separated fields. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
113 field_mode
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
114 };
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
115
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
116 static enum operating_mode operating_mode;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
117
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
118 /* If true do not output lines containing no delimiter characters.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
119 Otherwise, all such lines are printed. This option is valid only
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
120 with field mode. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
121 static bool suppress_non_delimited;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
122
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
123 /* If true, print all bytes, characters, or fields _except_
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
124 those that were specified. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
125 static bool complement;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
126
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
127 /* The delimiter character for field mode. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
128 static unsigned char delim;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
129
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
130 /* True if the --output-delimiter=STRING option was specified. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
131 static bool output_delimiter_specified;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
132
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
133 /* The length of output_delimiter_string. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
134 static size_t output_delimiter_length;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
135
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
136 /* The output field separator string. Defaults to the 1-character
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
137 string consisting of the input delimiter. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
138 static char *output_delimiter_string;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
139
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
140 /* True if we have ever read standard input. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
141 static bool have_read_stdin;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
142
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
143 /* For long options that have no equivalent short option, use a
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
144 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
145 enum
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
146 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
147 OUTPUT_DELIMITER_OPTION = CHAR_MAX + 1,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
148 COMPLEMENT_OPTION
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
149 };
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
150
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
151 static struct option const longopts[] =
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
152 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
153 {"bytes", required_argument, NULL, 'b'},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
154 {"characters", required_argument, NULL, 'c'},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
155 {"fields", required_argument, NULL, 'f'},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
156 {"delimiter", required_argument, NULL, 'd'},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
157 {"only-delimited", no_argument, NULL, 's'},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
158 {"output-delimiter", required_argument, NULL, OUTPUT_DELIMITER_OPTION},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
159 {"complement", no_argument, NULL, COMPLEMENT_OPTION},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
160 {GETOPT_HELP_OPTION_DECL},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
161 {GETOPT_VERSION_OPTION_DECL},
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
162 {NULL, 0, NULL, 0}
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
163 };
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
164
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
165 void
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
166 usage (int status)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
167 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
168 if (status != EXIT_SUCCESS)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
169 emit_try_help ();
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
170 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
171 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
172 printf (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
173 Usage: %s OPTION... [FILE]...\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
174 "),
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
175 program_name);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
176 fputs (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
177 Print selected parts of lines from each FILE to standard output.\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
178 "), stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
179
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
180 emit_stdin_note ();
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
181 emit_mandatory_arg_note ();
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
182
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
183 fputs (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
184 -b, --bytes=LIST select only these bytes\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
185 -c, --characters=LIST select only these characters\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
186 -d, --delimiter=DELIM use DELIM instead of TAB for field delimiter\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
187 "), stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
188 fputs (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
189 -f, --fields=LIST select only these fields; also print any line\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
190 that contains no delimiter character, unless\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
191 the -s option is specified\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
192 -n (ignored)\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
193 "), stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
194 fputs (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
195 --complement complement the set of selected bytes, characters\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
196 or fields\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
197 "), stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
198 fputs (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
199 -s, --only-delimited do not print lines not containing delimiters\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
200 --output-delimiter=STRING use STRING as the output delimiter\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
201 the default is to use the input delimiter\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
202 "), stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
203 fputs (HELP_OPTION_DESCRIPTION, stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
204 fputs (VERSION_OPTION_DESCRIPTION, stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
205 fputs (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
206 \n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
207 Use one, and only one of -b, -c or -f. Each LIST is made up of one\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
208 range, or many ranges separated by commas. Selected input is written\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
209 in the same order that it is read, and is written exactly once.\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
210 "), stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
211 fputs (_("\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
212 Each range is one of:\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
213 \n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
214 N N'th byte, character or field, counted from 1\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
215 N- from N'th byte, character or field, to end of line\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
216 N-M from N'th to M'th (included) byte, character or field\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
217 -M from first to M'th (included) byte, character or field\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
218 "), stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
219 emit_ancillary_info (PROGRAM_NAME);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
220 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
221 exit (status);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
222 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
223
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
224 /* Comparison function for qsort to order the list of
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
225 struct range_pairs. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
226 static int
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
227 compare_ranges (const void *a, const void *b)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
228 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
229 int a_start = ((const struct range_pair *) a)->lo;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
230 int b_start = ((const struct range_pair *) b)->lo;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
231 return a_start < b_start ? -1 : a_start > b_start;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
232 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
233
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
234 /* Reallocate Range Pair entries, with corresponding
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
235 entries outside the range of each specified entry. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
236
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
237 static void
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
238 complement_rp (void)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
239 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
240 if (complement)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
241 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
242 struct range_pair *c = rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
243 size_t n = n_rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
244 size_t i;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
245
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
246 rp = NULL;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
247 n_rp = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
248 n_rp_allocated = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
249
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
250 if (c[0].lo > 1)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
251 add_range_pair (1, c[0].lo - 1);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
252
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
253 for (i = 1; i < n; ++i)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
254 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
255 if (c[i-1].hi + 1 == c[i].lo)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
256 continue;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
257
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
258 add_range_pair (c[i-1].hi + 1, c[i].lo - 1);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
259 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
260
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
261 if (c[n-1].hi < SIZE_MAX)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
262 add_range_pair (c[n-1].hi + 1, SIZE_MAX);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
263
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
264 free (c);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
265 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
266 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
267
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
268 /* Given the list of field or byte range specifications FIELDSTR,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
269 allocate and initialize the RP array. FIELDSTR should
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
270 be composed of one or more numbers or ranges of numbers, separated
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
271 by blanks or commas. Incomplete ranges may be given: '-m' means '1-m';
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
272 'n-' means 'n' through end of line.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
273 Return true if FIELDSTR contains at least one field specification,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
274 false otherwise. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
275
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
276 static bool
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
277 set_fields (const char *fieldstr)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
278 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
279 size_t initial = 1; /* Value of first number in a range. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
280 size_t value = 0; /* If nonzero, a number being accumulated. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
281 bool lhs_specified = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
282 bool rhs_specified = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
283 bool dash_found = false; /* True if a '-' is found in this field. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
284 bool field_found = false; /* True if at least one field spec
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
285 has been processed. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
286
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
287 size_t i;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
288 bool in_digits = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
289
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
290 /* Collect and store in RP the range end points. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
291
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
292 while (true)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
293 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
294 if (*fieldstr == '-')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
295 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
296 in_digits = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
297 /* Starting a range. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
298 if (dash_found)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
299 FATAL_ERROR (_("invalid byte, character or field list"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
300 dash_found = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
301 fieldstr++;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
302
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
303 if (lhs_specified && !value)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
304 FATAL_ERROR (_("fields and positions are numbered from 1"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
305
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
306 initial = (lhs_specified ? value : 1);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
307 value = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
308 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
309 else if (*fieldstr == ','
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
310 || isblank (to_uchar (*fieldstr)) || *fieldstr == '\0')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
311 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
312 in_digits = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
313 /* Ending the string, or this field/byte sublist. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
314 if (dash_found)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
315 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
316 dash_found = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
317
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
318 if (!lhs_specified && !rhs_specified)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
319 FATAL_ERROR (_("invalid range with no endpoint: -"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
320
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
321 /* A range. Possibilities: -n, m-n, n-.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
322 In any case, 'initial' contains the start of the range. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
323 if (!rhs_specified)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
324 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
325 /* 'n-'. From 'initial' to end of line. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
326 add_range_pair (initial, SIZE_MAX);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
327 field_found = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
328 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
329 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
330 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
331 /* 'm-n' or '-n' (1-n). */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
332 if (value < initial)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
333 FATAL_ERROR (_("invalid decreasing range"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
334
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
335 add_range_pair (initial, value);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
336 field_found = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
337 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
338 value = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
339 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
340 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
341 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
342 /* A simple field number, not a range. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
343 if (value == 0)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
344 FATAL_ERROR (_("fields and positions are numbered from 1"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
345 add_range_pair (value, value);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
346 value = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
347 field_found = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
348 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
349
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
350 if (*fieldstr == '\0')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
351 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
352
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
353 fieldstr++;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
354 lhs_specified = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
355 rhs_specified = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
356 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
357 else if (ISDIGIT (*fieldstr))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
358 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
359 /* Record beginning of digit string, in case we have to
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
360 complain about it. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
361 static char const *num_start;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
362 if (!in_digits || !num_start)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
363 num_start = fieldstr;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
364 in_digits = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
365
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
366 if (dash_found)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
367 rhs_specified = 1;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
368 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
369 lhs_specified = 1;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
370
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
371 /* Detect overflow. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
372 if (!DECIMAL_DIGIT_ACCUMULATE (value, *fieldstr - '0', size_t)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
373 || value == SIZE_MAX)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
374 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
375 /* In case the user specified -c$(echo 2^64|bc),22,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
376 complain only about the first number. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
377 /* Determine the length of the offending number. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
378 size_t len = strspn (num_start, "0123456789");
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
379 char *bad_num = xstrndup (num_start, len);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
380 if (operating_mode == byte_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
381 error (0, 0,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
382 _("byte offset %s is too large"), quote (bad_num));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
383 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
384 error (0, 0,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
385 _("field number %s is too large"), quote (bad_num));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
386 free (bad_num);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
387 exit (EXIT_FAILURE);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
388 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
389
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
390 fieldstr++;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
391 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
392 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
393 FATAL_ERROR (_("invalid byte, character or field list"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
394 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
395
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
396 qsort (rp, n_rp, sizeof (rp[0]), compare_ranges);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
397
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
398 /* Merge range pairs (e.g. `2-5,3-4' becomes `2-5'). */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
399 for (i = 0; i < n_rp; ++i)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
400 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
401 for (size_t j = i + 1; j < n_rp; ++j)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
402 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
403 if (rp[j].lo <= rp[i].hi)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
404 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
405 rp[i].hi = MAX (rp[j].hi, rp[i].hi);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
406 memmove (rp + j, rp + j + 1, (n_rp - j - 1) * sizeof *rp);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
407 n_rp--;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
408 j--;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
409 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
410 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
411 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
412 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
413 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
414
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
415 complement_rp ();
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
416
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
417 /* After merging, reallocate RP so we release memory to the system.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
418 Also add a sentinel at the end of RP, to avoid out of bounds access
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
419 and for performance reasons. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
420 ++n_rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
421 rp = xrealloc (rp, n_rp * sizeof (struct range_pair));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
422 rp[n_rp - 1].lo = rp[n_rp - 1].hi = SIZE_MAX;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
423
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
424 return field_found;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
425 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
426
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
427 /* Increment *ITEM_IDX (i.e., a field or byte index),
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
428 and if required CURRENT_RP. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
429
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
430 static inline void
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
431 next_item (size_t *item_idx)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
432 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
433 (*item_idx)++;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
434 if ((*item_idx) > current_rp->hi)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
435 current_rp++;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
436 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
437
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
438 /* Return nonzero if the K'th field or byte is printable. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
439
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
440 static inline bool
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
441 print_kth (size_t k)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
442 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
443 return current_rp->lo <= k;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
444 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
445
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
446 /* Return nonzero if K'th byte is the beginning of a range. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
447
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
448 static inline bool
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
449 is_range_start_index (size_t k)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
450 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
451 return k == current_rp->lo;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
452 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
453
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
454 /* Read from stream STREAM, printing to standard output any selected bytes. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
455
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
456 static void
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
457 cut_bytes (FILE *stream)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
458 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
459 size_t byte_idx; /* Number of bytes in the line so far. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
460 /* Whether to begin printing delimiters between ranges for the current line.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
461 Set after we've begun printing data corresponding to the first range. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
462 bool print_delimiter;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
463
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
464 byte_idx = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
465 print_delimiter = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
466 current_rp = rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
467 while (true)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
468 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
469 int c; /* Each character from the file. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
470
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
471 c = getc (stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
472
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
473 if (c == '\n')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
474 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
475 putchar ('\n');
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
476 byte_idx = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
477 print_delimiter = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
478 current_rp = rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
479 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
480 else if (c == EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
481 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
482 if (byte_idx > 0)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
483 putchar ('\n');
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
484 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
485 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
486 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
487 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
488 next_item (&byte_idx);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
489 if (print_kth (byte_idx))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
490 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
491 if (output_delimiter_specified)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
492 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
493 if (print_delimiter && is_range_start_index (byte_idx))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
494 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
495 fwrite (output_delimiter_string, sizeof (char),
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
496 output_delimiter_length, stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
497 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
498 print_delimiter = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
499 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
500
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
501 putchar (c);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
502 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
503 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
504 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
505 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
506
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
507 /* Read from stream STREAM, printing to standard output any selected fields. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
508
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
509 static void
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
510 cut_fields (FILE *stream)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
511 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
512 int c;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
513 size_t field_idx = 1;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
514 bool found_any_selected_field = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
515 bool buffer_first_field;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
516
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
517 current_rp = rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
518
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
519 c = getc (stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
520 if (c == EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
521 return;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
522
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
523 ungetc (c, stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
524 c = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
525
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
526 /* To support the semantics of the -s flag, we may have to buffer
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
527 all of the first field to determine whether it is 'delimited.'
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
528 But that is unnecessary if all non-delimited lines must be printed
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
529 and the first field has been selected, or if non-delimited lines
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
530 must be suppressed and the first field has *not* been selected.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
531 That is because a non-delimited line has exactly one field. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
532 buffer_first_field = (suppress_non_delimited ^ !print_kth (1));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
533
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
534 while (1)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
535 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
536 if (field_idx == 1 && buffer_first_field)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
537 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
538 ssize_t len;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
539 size_t n_bytes;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
540
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
541 len = getndelim2 (&field_1_buffer, &field_1_bufsize, 0,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
542 GETNLINE_NO_LIMIT, delim, '\n', stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
543 if (len < 0)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
544 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
545 free (field_1_buffer);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
546 field_1_buffer = NULL;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
547 if (ferror (stream) || feof (stream))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
548 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
549 xalloc_die ();
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
550 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
551
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
552 n_bytes = len;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
553 assert (n_bytes != 0);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
554
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
555 c = 0;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
556
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
557 /* If the first field extends to the end of line (it is not
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
558 delimited) and we are printing all non-delimited lines,
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
559 print this one. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
560 if (to_uchar (field_1_buffer[n_bytes - 1]) != delim)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
561 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
562 if (suppress_non_delimited)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
563 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
564 /* Empty. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
565 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
566 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
567 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
568 fwrite (field_1_buffer, sizeof (char), n_bytes, stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
569 /* Make sure the output line is newline terminated. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
570 if (field_1_buffer[n_bytes - 1] != '\n')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
571 putchar ('\n');
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
572 c = '\n';
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
573 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
574 continue;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
575 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
576 if (print_kth (1))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
577 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
578 /* Print the field, but not the trailing delimiter. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
579 fwrite (field_1_buffer, sizeof (char), n_bytes - 1, stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
580
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
581 /* With -d$'\n' don't treat the last '\n' as a delimiter. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
582 if (delim == '\n')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
583 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
584 int last_c = getc (stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
585 if (last_c != EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
586 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
587 ungetc (last_c, stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
588 found_any_selected_field = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
589 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
590 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
591 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
592 found_any_selected_field = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
593 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
594 next_item (&field_idx);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
595 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
596
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
597 int prev_c = c;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
598
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
599 if (print_kth (field_idx))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
600 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
601 if (found_any_selected_field)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
602 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
603 fwrite (output_delimiter_string, sizeof (char),
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
604 output_delimiter_length, stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
605 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
606 found_any_selected_field = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
607
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
608 while ((c = getc (stream)) != delim && c != '\n' && c != EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
609 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
610 putchar (c);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
611 prev_c = c;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
612 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
613 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
614 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
615 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
616 while ((c = getc (stream)) != delim && c != '\n' && c != EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
617 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
618 prev_c = c;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
619 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
620 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
621
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
622 /* With -d$'\n' don't treat the last '\n' as a delimiter. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
623 if (delim == '\n' && c == delim)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
624 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
625 int last_c = getc (stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
626 if (last_c != EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
627 ungetc (last_c, stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
628 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
629 c = last_c;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
630 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
631
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
632 if (c == delim)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
633 next_item (&field_idx);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
634 else if (c == '\n' || c == EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
635 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
636 if (found_any_selected_field
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
637 || !(suppress_non_delimited && field_idx == 1))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
638 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
639 if (c == '\n' || prev_c != '\n' || delim == '\n')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
640 putchar ('\n');
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
641 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
642 if (c == EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
643 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
644 field_idx = 1;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
645 current_rp = rp;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
646 found_any_selected_field = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
647 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
648 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
649 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
650
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
651 static void
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
652 cut_stream (FILE *stream)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
653 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
654 if (operating_mode == byte_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
655 cut_bytes (stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
656 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
657 cut_fields (stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
658 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
659
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
660 /* Process file FILE to standard output.
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
661 Return true if successful. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
662
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
663 static bool
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
664 cut_file (char const *file)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
665 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
666 FILE *stream;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
667
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
668 if (STREQ (file, "-"))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
669 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
670 have_read_stdin = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
671 stream = stdin;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
672 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
673 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
674 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
675 stream = fopen (file, "r");
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
676 if (stream == NULL)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
677 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
678 error (0, errno, "%s", file);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
679 return false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
680 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
681 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
682
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
683 fadvise (stream, FADVISE_SEQUENTIAL);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
684
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
685 cut_stream (stream);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
686
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
687 if (ferror (stream))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
688 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
689 error (0, errno, "%s", file);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
690 return false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
691 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
692 if (STREQ (file, "-"))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
693 clearerr (stream); /* Also clear EOF. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
694 else if (fclose (stream) == EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
695 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
696 error (0, errno, "%s", file);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
697 return false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
698 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
699 return true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
700 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
701
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
702 int
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
703 main (int argc, char **argv)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
704 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
705 int optc;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
706 bool ok;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
707 bool delim_specified = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
708 char *spec_list_string IF_LINT ( = NULL);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
709
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
710 initialize_main (&argc, &argv);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
711 set_program_name (argv[0]);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
712 setlocale (LC_ALL, "");
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
713 bindtextdomain (PACKAGE, LOCALEDIR);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
714 textdomain (PACKAGE);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
715
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
716 atexit (close_stdout);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
717
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
718 operating_mode = undefined_mode;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
719
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
720 /* By default, all non-delimited lines are printed. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
721 suppress_non_delimited = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
722
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
723 delim = '\0';
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
724 have_read_stdin = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
725
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
726 while ((optc = getopt_long (argc, argv, "b:c:d:f:ns", longopts, NULL)) != -1)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
727 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
728 switch (optc)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
729 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
730 case 'b':
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
731 case 'c':
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
732 /* Build the byte list. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
733 if (operating_mode != undefined_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
734 FATAL_ERROR (_("only one type of list may be specified"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
735 operating_mode = byte_mode;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
736 spec_list_string = optarg;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
737 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
738
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
739 case 'f':
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
740 /* Build the field list. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
741 if (operating_mode != undefined_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
742 FATAL_ERROR (_("only one type of list may be specified"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
743 operating_mode = field_mode;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
744 spec_list_string = optarg;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
745 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
746
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
747 case 'd':
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
748 /* New delimiter. */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
749 /* Interpret -d '' to mean 'use the NUL byte as the delimiter.' */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
750 if (optarg[0] != '\0' && optarg[1] != '\0')
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
751 FATAL_ERROR (_("the delimiter must be a single character"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
752 delim = optarg[0];
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
753 delim_specified = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
754 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
755
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
756 case OUTPUT_DELIMITER_OPTION:
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
757 output_delimiter_specified = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
758 /* Interpret --output-delimiter='' to mean
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
759 'use the NUL byte as the delimiter.' */
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
760 output_delimiter_length = (optarg[0] == '\0'
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
761 ? 1 : strlen (optarg));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
762 output_delimiter_string = xstrdup (optarg);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
763 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
764
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
765 case 'n':
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
766 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
767
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
768 case 's':
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
769 suppress_non_delimited = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
770 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
771
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
772 case COMPLEMENT_OPTION:
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
773 complement = true;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
774 break;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
775
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
776 case_GETOPT_HELP_CHAR;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
777
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
778 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
779
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
780 default:
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
781 usage (EXIT_FAILURE);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
782 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
783 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
784
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
785 if (operating_mode == undefined_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
786 FATAL_ERROR (_("you must specify a list of bytes, characters, or fields"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
787
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
788 if (delim_specified && operating_mode != field_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
789 FATAL_ERROR (_("an input delimiter may be specified only\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
790 when operating on fields"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
791
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
792 if (suppress_non_delimited && operating_mode != field_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
793 FATAL_ERROR (_("suppressing non-delimited lines makes sense\n\
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
794 \tonly when operating on fields"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
795
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
796 if (! set_fields (spec_list_string))
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
797 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
798 if (operating_mode == field_mode)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
799 FATAL_ERROR (_("missing list of fields"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
800 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
801 FATAL_ERROR (_("missing list of positions"));
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
802 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
803
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
804 if (!delim_specified)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
805 delim = '\t';
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
806
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
807 if (output_delimiter_string == NULL)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
808 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
809 static char dummy[2];
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
810 dummy[0] = delim;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
811 dummy[1] = '\0';
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
812 output_delimiter_string = dummy;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
813 output_delimiter_length = 1;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
814 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
815
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
816 if (optind == argc)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
817 ok = cut_file ("-");
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
818 else
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
819 for (ok = true; optind < argc; optind++)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
820 ok &= cut_file (argv[optind]);
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
821
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
822
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
823 if (have_read_stdin && fclose (stdin) == EOF)
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
824 {
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
825 error (0, errno, "-");
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
826 ok = false;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
827 }
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
828
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
829 return ok ? EXIT_SUCCESS : EXIT_FAILURE;
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
830 }