annotate code/cut.c__4.3bsd-reno.1990-06-25 @ 41:e2961496d097 default tip

Add script to generate the PDFs
author markus schnalke <meillo@marmaro.de>
date Tue, 10 Nov 2015 21:13:22 +0100
parents 21ad1c1548c4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14
21ad1c1548c4 Code ausgewaehlter Implementierungen eingefuegt
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
1 /*
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 }