View | Details | Raw Unified | Return to bug 23321
Collapse All | Expand All

(-)cat.c (-34 / +16 lines)
Lines 63-72 Link Here
63
int rval;
63
int rval;
64
const char *filename;
64
const char *filename;
65
65
66
void cook_args __P((char *argv[]));
66
void cat_args __P((char *argv[], void (*cat)(int)));
67
void cook_buf __P((FILE *));
67
void cook_buf __P((int));
68
int main __P((int argc, char *argv[]));
68
int main __P((int argc, char *argv[]));
69
void raw_args __P((char *argv[]));
70
void raw_cat __P((int));
69
void raw_cat __P((int));
71
70
72
int
71
int
Lines 109-154 Link Here
109
	argv += optind;
108
	argv += optind;
110
109
111
	if (bflag || eflag || nflag || sflag || tflag || vflag)
110
	if (bflag || eflag || nflag || sflag || tflag || vflag)
112
		cook_args(argv);
111
		cat_args(argv, cook_buf);
113
	else
112
	else
114
		raw_args(argv);
113
		cat_args(argv, raw_cat);
115
	if (fclose(stdout))
114
	if (fclose(stdout))
116
		err(1, "stdout");
115
		err(1, "stdout");
117
	exit(rval);
116
	exit(rval);
118
}
117
}
119
118
120
void
119
void
121
cook_args(argv)
120
cook_buf(fd)
122
	char **argv;
121
	register int fd;
123
{
122
{
124
	register FILE *fp;
123
	register FILE *fp;
125
126
	fp = stdin;
127
	filename = "stdin";
128
	do {
129
		if (*argv) {
130
			if (!strcmp(*argv, "-"))
131
				fp = stdin;
132
			else if ((fp = fopen(*argv, "r")) == NULL) {
133
				warn("%s", *argv);
134
				rval = 1;
135
				++argv;
136
				continue;
137
			}
138
			filename = *argv++;
139
		}
140
		cook_buf(fp);
141
		if (fp != stdin)
142
			(void)fclose(fp);
143
	} while (*argv);
144
}
145
146
void
147
cook_buf(fp)
148
	register FILE *fp;
149
{
150
	register int ch, gobble, line, prev;
124
	register int ch, gobble, line, prev;
151
125
126
	if ((fp = fdopen(fd, "r")) == NULL) {
127
		warn("%s", filename);
128
		rval = 1;
129
		return;
130
	}
152
	line = gobble = 0;
131
	line = gobble = 0;
153
	for (prev = '\n'; (ch = getc(fp)) != EOF; prev = ch) {
132
	for (prev = '\n'; (ch = getc(fp)) != EOF; prev = ch) {
154
		if (prev == '\n') {
133
		if (prev == '\n') {
Lines 205-215 Link Here
205
	}
184
	}
206
	if (ferror(stdout))
185
	if (ferror(stdout))
207
		err(1, "stdout");
186
		err(1, "stdout");
187
	if (fd != fileno(stdin))
188
		(void)fclose(fp);
208
}
189
}
209
190
210
void
191
void
211
raw_args(argv)
192
cat_args(argv, cat)
212
	char **argv;
193
	char **argv;
194
	void (*cat)(int);
213
{
195
{
214
	register int fd;
196
	register int fd;
215
197
Lines 227-233 Link Here
227
			}
209
			}
228
			filename = *argv++;
210
			filename = *argv++;
229
		}
211
		}
230
		raw_cat(fd);
212
		cat(fd);
231
		if (fd != fileno(stdin))
213
		if (fd != fileno(stdin))
232
			(void)close(fd);
214
			(void)close(fd);
233
	} while (*argv);
215
	} while (*argv);

Return to bug 23321