--- /usr/src/bin/cat/cat.c 2016-07-22 16:42:11.671288000 +0300 +++ cat.c 2016-09-13 11:14:08.858013000 +0300 @@ -63,6 +63,8 @@ #include #include #include +#include +#include static int bflag, eflag, lflag, nflag, sflag, tflag, vflag; static int rval; @@ -205,6 +207,7 @@ cook_cat(FILE *fp) { int ch, gobble, line, prev; + wint_t wch; /* Reset EOF condition on stdin. */ if (fp == stdin && feof(stdin)) @@ -237,18 +240,34 @@ continue; } } else if (vflag) { - if (!isascii(ch) && !isprint(ch)) { + ungetc(ch, fp); + if ((wch = getwc(fp)) == WEOF) { + if (ferror(fp) && errno == EILSEQ) { + clearerr(fp); + if ((ch = getc(fp)) == EOF) + break; + wch = ch; + goto ilseq; + } else + break; + } + if (!iswascii(wch) && !iswprint(wch)) { +ilseq: if (putchar('M') == EOF || putchar('-') == EOF) break; - ch = toascii(ch); + wch = toascii(wch); } - if (iscntrl(ch)) { + if (iswcntrl(wch)) { + ch = toascii(wch); if (putchar('^') == EOF || putchar(ch == '\177' ? '?' : ch | 0100) == EOF) break; continue; } + if (putwchar(wch) == WEOF) + break; + continue; } if (putchar(ch) == EOF) break;