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

Collapse All | Expand All

(-)cat.c (-16 / +71 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) && !iswcntrl(ch)) {
241
				if (putchar('M') == EOF || putchar('-') == EOF)
249
				if (putchar('M') == EOF || putchar('-') == EOF)
242
					break;
250
					break;
251
				och = ch;
252
				ch = toascii(ch);
253
			} else if (iswcntrl(ch)) {
254
				och = ch;
243
				ch = toascii(ch);
255
				ch = toascii(ch);
244
			}
245
			if (iscntrl(ch)) {
246
				if (putchar('^') == EOF ||
256
				if (putchar('^') == EOF ||
247
				    putchar(ch == '\177' ? '?' :
257
				    putwchar(ch == L'\177' ? L'?' :
248
				    ch | 0100) == EOF)
258
				    ch | 0100) == WEOF)
249
					break;
259
					break;
260
				ch = och;
250
				continue;
261
				continue;
251
			}
262
			}
252
		}
263
		}
253
		if (putchar(ch) == EOF)
264
		if (putwchar(ch) == WEOF)
254
			break;
265
			break;
266
		if (och != WEOF)
267
			ch = och;
268
	}
269
	if (!ferror(stdout) && !feof(fp) && ferror(fp) && errno == EILSEQ) {
270
		if ((c = getc(fp)) != EOF) {
271
			if (prev == L'\n') {
272
				if (sflag)
273
					gobble = 0;
274
				if (nflag) {
275
					(void)fprintf(stdout, "%6d\t", ++line);
276
					if (ferror(stdout))
277
						goto err;
278
				}
279
			}
280
			oc = EOF;
281
			if (vflag) {
282
				if (c >= ' ' && c != '\177') {
283
					if (putchar('M') == EOF || putchar('-') == EOF)
284
						goto err;
285
					oc = c;
286
					c = toascii(c);
287
				} else if (c < ' ' || c == '\177') {
288
					if (putchar('^') == EOF ||
289
					    putchar(c == '\177' ? '?' :
290
					    c | 0100) == EOF)
291
						goto err;
292
					prev = c;
293
					clearerr(fp);
294
					goto again;
295
				}
296
			}
297
			if (putchar(c) == EOF)
298
				goto err;
299
			if (oc != EOF)
300
				c = oc;
301
			prev = c;
302
			clearerr(fp);
303
			goto again;
304
		}
255
	}
305
	}
256
	if (ferror(fp)) {
306
	if (ferror(fp)) {
257
		warn("%s", filename);
307
		if (errno != EILSEQ) {
258
		rval = 1;
308
			warn("%s", filename);
309
			rval = 1;
310
		}
259
		clearerr(fp);
311
		clearerr(fp);
260
	}
312
	}
313
err:
314
	if (errno == 0)
315
		errno = saverrno;
261
	if (ferror(stdout))
316
	if (ferror(stdout))
262
		err(1, "stdout");
317
		err(1, "stdout");
263
}
318
}

Return to bug 210995