View | Details | Raw Unified | Return to bug 210995 | Differences between
and this patch

Collapse All | Expand All

(-)cat.c (-15 / +76 lines)
Lines 51-61 Link Here
51
#ifndef NO_UDOM_SUPPORT
51
#ifndef NO_UDOM_SUPPORT
52
#include <sys/socket.h>
52
#include <sys/socket.h>
53
#include <sys/un.h>
53
#include <sys/un.h>
54
#include <errno.h>
55
#endif
54
#endif
56
55
57
#include <ctype.h>
56
#include <ctype.h>
58
#include <err.h>
57
#include <err.h>
58
#include <errno.h>
59
#include <fcntl.h>
59
#include <fcntl.h>
60
#include <locale.h>
60
#include <locale.h>
61
#include <stddef.h>
61
#include <stddef.h>
Lines 63-68 Link Here
63
#include <stdlib.h>
63
#include <stdlib.h>
64
#include <string.h>
64
#include <string.h>
65
#include <unistd.h>
65
#include <unistd.h>
66
#include <wchar.h>
67
#include <wctype.h>
66
68
67
static int bflag, eflag, lflag, nflag, sflag, tflag, vflag;
69
static int bflag, eflag, lflag, nflag, sflag, tflag, vflag;
68
static int rval;
70
static int rval;
Lines 204-263 Link Here
204
static void
206
static void
205
cook_cat(FILE *fp)
207
cook_cat(FILE *fp)
206
{
208
{
207
	int ch, gobble, line, prev;
209
	int c, oc, gobble, line, saverrno;
210
	wint_t ch, och, prev;
208
211
209
	/* Reset EOF condition on stdin. */
212
	/* Reset EOF condition on stdin. */
210
	if (fp == stdin && feof(stdin))
213
	if (fp == stdin && feof(stdin))
211
		clearerr(stdin);
214
		clearerr(stdin);
212
215
216
	saverrno = errno;
213
	line = gobble = 0;
217
	line = gobble = 0;
214
	for (prev = '\n'; (ch = getc(fp)) != EOF; prev = ch) {
218
	prev = L'\n';
215
		if (prev == '\n') {
219
again:
220
	errno = 0;
221
	for (; (ch = getwc(fp)) != WEOF; prev = ch) {
222
		if (prev == L'\n') {
216
			if (sflag) {
223
			if (sflag) {
217
				if (ch == '\n') {
224
				if (ch == L'\n') {
218
					if (gobble)
225
					if (gobble)
219
						continue;
226
						continue;
220
					gobble = 1;
227
					gobble = 1;
221
				} else
228
				} else
222
					gobble = 0;
229
					gobble = 0;
223
			}
230
			}
224
			if (nflag && (!bflag || ch != '\n')) {
231
			if (nflag && (!bflag || ch != L'\n')) {
225
				(void)fprintf(stdout, "%6d\t", ++line);
232
				(void)fprintf(stdout, "%6d\t", ++line);
226
				if (ferror(stdout))
233
				if (ferror(stdout))
227
					break;
234
					break;
228
			}
235
			}
229
		}
236
		}
230
		if (ch == '\n') {
237
		och = WEOF;
238
		if (ch == L'\n') {
231
			if (eflag && putchar('$') == EOF)
239
			if (eflag && putchar('$') == EOF)
232
				break;
240
				break;
233
		} else if (ch == '\t') {
241
		} else if (ch == L'\t') {
234
			if (tflag) {
242
			if (tflag) {
235
				if (putchar('^') == EOF || putchar('I') == EOF)
243
				if (putchar('^') == EOF || putchar('I') == EOF)
236
					break;
244
					break;
237
				continue;
245
				continue;
238
			}
246
			}
239
		} else if (vflag) {
247
		} else if (vflag) {
240
			if (!isascii(ch) && !isprint(ch)) {
248
			if (!iswprint(ch)) {
241
				if (putchar('M') == EOF || putchar('-') == EOF)
249
				if (putchar('M') == EOF || putchar('-') == EOF)
242
					break;
250
					break;
251
				och = ch;
243
				ch = toascii(ch);
252
				ch = toascii(ch);
244
			}
253
			}
245
			if (iscntrl(ch)) {
254
			if (iswcntrl(ch)) {
255
				if (och != WEOF) {
256
					och = ch;
257
					ch = toascii(ch);
258
				}
246
				if (putchar('^') == EOF ||
259
				if (putchar('^') == EOF ||
247
				    putchar(ch == '\177' ? '?' :
260
				    putwchar(ch == L'\177' ? L'?' :
248
				    ch | 0100) == EOF)
261
				    ch | 0100) == WEOF)
249
					break;
262
					break;
263
				ch = och;
250
				continue;
264
				continue;
251
			}
265
			}
252
		}
266
		}
253
		if (putchar(ch) == EOF)
267
		if (putwchar(ch) == WEOF)
254
			break;
268
			break;
269
		if (och != WEOF)
270
			ch = och;
255
	}
271
	}
272
	if (!ferror(stdout) && !feof(fp) && ferror(fp) && errno == EILSEQ) {
273
		if ((c = getc(fp)) != EOF) {
274
			if (prev == L'\n') {
275
				if (sflag)
276
					gobble = 0;
277
				if (nflag) {
278
					(void)fprintf(stdout, "%6d\t", ++line);
279
					if (ferror(stdout))
280
						goto err;
281
				}
282
			}
283
			oc = EOF;
284
			if (vflag) {
285
				if (c >= ' ' && c != '\177') {
286
					if (putchar('M') == EOF || putchar('-') == EOF)
287
						goto err;
288
					oc = c;
289
					c = toascii(c);
290
				}
291
				if (c < ' ' || c == '\177') {
292
					if (putchar('^') == EOF ||
293
					    putchar(c == '\177' ? '?' :
294
					    c | 0100) == EOF)
295
						goto err;
296
					if (oc != EOF)
297
						c = oc;
298
					prev = c;
299
					clearerr(fp);
300
					goto again;
301
				}
302
			}
303
			if (putchar(c) == EOF)
304
				goto err;
305
			if (oc != EOF)
306
				c = oc;
307
			prev = c;
308
			clearerr(fp);
309
			goto again;
310
		}
311
	}
312
err:
256
	if (ferror(fp)) {
313
	if (ferror(fp)) {
257
		warn("%s", filename);
314
		if (errno != EILSEQ) {
258
		rval = 1;
315
			warn("%s", filename);
316
			rval = 1;
317
		}
259
		clearerr(fp);
318
		clearerr(fp);
260
	}
319
	}
320
	if (errno == 0)
321
		errno = saverrno;
261
	if (ferror(stdout))
322
	if (ferror(stdout))
262
		err(1, "stdout");
323
		err(1, "stdout");
263
}
324
}

Return to bug 210995