Mercurial > docs > cut
annotate code/cut.c__gnu.2015-05-01 @ 27:5cefcfc72d42
Added first version of the translation to English
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Tue, 04 Aug 2015 21:04:10 +0200 |
parents | 21ad1c1548c4 |
children |
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 } |