Mercurial > docs > cut
annotate code/cut.c__4.3bsd-reno.1990-06-25 @ 14:21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
Das Datum entspricht dem Dateiaenderungsdatum.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Tue, 12 May 2015 06:46:59 +0200 |
parents | |
children |
rev | line source |
---|---|
14
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
1 /* |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
2 * Copyright (c) 1989 The Regents of the University of California. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
3 * All rights reserved. |
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 code is derived from software contributed to Berkeley by |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
6 * Adam S. Moskowitz of Menlo Consulting and Marciano Pitargue. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
7 * |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
8 * Redistribution and use in source and binary forms are permitted provided |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
9 * that: (1) source distributions retain this entire copyright notice and |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
10 * comment, and (2) distributions including binaries display the following |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
11 * acknowledgement: ``This product includes software developed by the |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
12 * University of California, Berkeley and its contributors'' in the |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
13 * documentation or other materials provided with the distribution and in |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
14 * all advertising materials mentioning features or use of this software. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
15 * Neither the name of the University nor the names of its contributors may |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
16 * be used to endorse or promote products derived from this software without |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
17 * specific prior written permission. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
19 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
21 */ |
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 #ifndef lint |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
24 char copyright[] = |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
25 "@(#) Copyright (c) 1989 The Regents of the University of California.\n\ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
26 All rights reserved.\n"; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
27 #endif /* not lint */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
28 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
29 #ifndef lint |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
30 static char sccsid[] = "@(#)cut.c 5.3 (Berkeley) 6/24/90"; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
31 #endif /* not lint */ |
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 <limits.h> |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
34 #include <stdio.h> |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
35 #include <ctype.h> |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
36 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
37 int cflag; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
38 char dchar; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
39 int dflag; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
40 int fflag; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
41 int sflag; |
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 main(argc, argv) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
44 int argc; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
45 char **argv; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
46 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
47 extern char *optarg; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
48 extern int errno, optind; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
49 FILE *fp; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
50 int ch, (*fcn)(), c_cut(), f_cut(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
51 char *strerror(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
52 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
53 dchar = '\t'; /* default delimiter is \t */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
54 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
55 while ((ch = getopt(argc, argv, "c:d:f:s")) != EOF) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
56 switch(ch) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
57 case 'c': |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
58 fcn = c_cut; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
59 get_list(optarg); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
60 cflag = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
61 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
62 case 'd': |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
63 dchar = *optarg; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
64 dflag = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
65 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
66 case 'f': |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
67 get_list(optarg); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
68 fcn = f_cut; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
69 fflag = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
70 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
71 case 's': |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
72 sflag = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
73 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
74 case '?': |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
75 default: |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
76 usage(); |
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 argc -= optind; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
79 argv += optind; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
80 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
81 if (fflag) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
82 if (cflag) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
83 usage(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
84 } else if (!cflag || dflag || sflag) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
85 usage(); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
86 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
87 if (*argv) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
88 for (; *argv; ++argv) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
89 if (!(fp = fopen(*argv, "r"))) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
90 (void)fprintf(stderr, |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
91 "cut: %s: %s\n", *argv, strerror(errno)); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
92 exit(1); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
93 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
94 fcn(fp, *argv); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
95 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
96 else |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
97 fcn(stdin, "stdin"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
98 exit(0); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
99 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
100 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
101 int autostart, autostop, maxval; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
102 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
103 char positions[_BSD_LINE_MAX + 1]; |
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 get_list(list) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
106 char *list; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
107 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
108 register char *pos; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
109 register int setautostart, start, stop; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
110 char *p, *strtok(); |
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 /* |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
113 * set a byte in the positions array to indicate if a field or |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
114 * column is to be selected; use +1, it's 1-based, not 0-based. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
115 * This parser is less restrictive than the Draft 9 POSIX spec. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
116 * POSIX doesn't allow lists that aren't in increasing order or |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
117 * overlapping lists. We also handle "-3-5" although there's no |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
118 * real reason too. |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
119 */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
120 for (; p = strtok(list, ", \t"); list = NULL) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
121 setautostart = start = stop = 0; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
122 if (*p == '-') { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
123 ++p; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
124 setautostart = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
125 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
126 if (isdigit(*p)) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
127 start = stop = strtol(p, &p, 10); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
128 if (setautostart && start > autostart) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
129 autostart = start; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
130 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
131 if (*p == '-') { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
132 if (isdigit(p[1])) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
133 stop = strtol(p + 1, &p, 10); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
134 if (*p == '-') { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
135 ++p; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
136 if (!autostop || autostop > stop) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
137 autostop = stop; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
138 } |
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 if (*p) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
141 badlist("illegal list value"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
142 if (!stop || !start) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
143 badlist("values may not include zero"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
144 if (stop > _BSD_LINE_MAX) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
145 /* positions used rather than allocate a new buffer */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
146 (void)sprintf(positions, "%d too large (max %d)", |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
147 stop, _BSD_LINE_MAX); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
148 badlist(positions); |
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 if (maxval < stop) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
151 maxval = stop; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
152 for (pos = positions + start; start++ <= stop; *pos++ = 1); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
153 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
154 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
155 /* overlapping ranges */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
156 if (autostop && maxval > autostop) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
157 maxval = autostop; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
158 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
159 /* set autostart */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
160 if (autostart) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
161 memset(positions + 1, '1', autostart); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
162 } |
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 /* ARGSUSED */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
165 c_cut(fp, fname) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
166 FILE *fp; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
167 char *fname; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
168 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
169 register int ch, col; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
170 register char *pos; |
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 for (;;) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
173 pos = positions + 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
174 for (col = maxval; col; --col) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
175 if ((ch = getc(fp)) == EOF) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
176 return; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
177 if (ch == '\n') |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
178 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
179 if (*pos++) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
180 putchar(ch); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
181 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
182 if (ch != '\n') |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
183 if (autostop) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
184 while ((ch = getc(fp)) != EOF && ch != '\n') |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
185 putchar(ch); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
186 else |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
187 while ((ch = getc(fp)) != EOF && ch != '\n'); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
188 putchar('\n'); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
189 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
190 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
191 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
192 f_cut(fp, fname) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
193 FILE *fp; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
194 char *fname; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
195 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
196 register int ch, field, isdelim; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
197 register char *pos, *p, sep; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
198 int output; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
199 char lbuf[_BSD_LINE_MAX + 1]; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
200 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
201 for (sep = dchar, output = 0; fgets(lbuf, sizeof(lbuf), fp);) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
202 for (isdelim = 0, p = lbuf;; ++p) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
203 if (!(ch = *p)) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
204 (void)fprintf(stderr, |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
205 "cut: %s: line too long.\n", fname); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
206 exit(1); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
207 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
208 /* this should work if newline is delimiter */ |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
209 if (ch == sep) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
210 isdelim = 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
211 if (ch == '\n') { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
212 if (!isdelim && !sflag) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
213 (void)printf("%s", lbuf); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
214 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
215 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
216 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
217 if (!isdelim) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
218 continue; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
219 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
220 pos = positions + 1; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
221 for (field = maxval, p = lbuf; field; --field, ++pos) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
222 if (*pos) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
223 if (output++) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
224 putchar(sep); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
225 while ((ch = *p++) != '\n' && ch != sep) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
226 putchar(ch); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
227 } else |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
228 while ((ch = *p++) != '\n' && ch != sep); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
229 if (ch == '\n') |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
230 break; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
231 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
232 if (ch != '\n') |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
233 if (autostop) { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
234 if (output) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
235 putchar(sep); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
236 for (; (ch = *p) != '\n'; ++p) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
237 putchar(ch); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
238 } else |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
239 for (; (ch = *p) != '\n'; ++p); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
240 putchar('\n'); |
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 } |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
243 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
244 badlist(msg) |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
245 char *msg; |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
246 { |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
247 (void)fprintf(stderr, "cut: [-cf] list: %s.\n", msg); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
248 exit(1); |
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 |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
251 usage() |
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 (void)fprintf(stderr, |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
254 "usage:\tcut -c list [file1 ...]\n\tcut -f list [-s] [-d delim] [file ...]\n"); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
255 exit(1); |
21ad1c1548c4
Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff
changeset
|
256 } |