FreeBSD Bugzilla – Attachment 173315 Details for
Bug 210995
cat -v fails to tag characters in extended table with M- prefix with some locales
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
use wide chars with fallback to plain ones
cat.patch (text/plain), 3.24 KB, created by
Andrey A. Chernov
on 2016-08-05 14:05:02 UTC
(
hide
)
Description:
use wide chars with fallback to plain ones
Filename:
MIME Type:
Creator:
Andrey A. Chernov
Created:
2016-08-05 14:05:02 UTC
Size:
3.24 KB
patch
obsolete
>--- /usr/src/bin/cat/cat.c 2016-07-22 16:42:11.671288000 +0300 >+++ cat.c 2016-08-05 16:57:44.883476000 +0300 >@@ -51,11 +51,11 @@ > #ifndef NO_UDOM_SUPPORT > #include <sys/socket.h> > #include <sys/un.h> >-#include <errno.h> > #endif > > #include <ctype.h> > #include <err.h> >+#include <errno.h> > #include <fcntl.h> > #include <locale.h> > #include <stddef.h> >@@ -63,6 +63,8 @@ > #include <stdlib.h> > #include <string.h> > #include <unistd.h> >+#include <wchar.h> >+#include <wctype.h> > > static int bflag, eflag, lflag, nflag, sflag, tflag, vflag; > static int rval; >@@ -204,60 +206,113 @@ > static void > cook_cat(FILE *fp) > { >- int ch, gobble, line, prev; >+ int c, oc, gobble, line, saverrno; >+ wint_t ch, och, prev; > > /* Reset EOF condition on stdin. */ > if (fp == stdin && feof(stdin)) > clearerr(stdin); > >+ saverrno = errno; > line = gobble = 0; >- for (prev = '\n'; (ch = getc(fp)) != EOF; prev = ch) { >- if (prev == '\n') { >+ prev = L'\n'; >+again: >+ errno = 0; >+ for (; (ch = getwc(fp)) != WEOF; prev = ch) { >+ if (prev == L'\n') { > if (sflag) { >- if (ch == '\n') { >+ if (ch == L'\n') { > if (gobble) > continue; > gobble = 1; > } else > gobble = 0; > } >- if (nflag && (!bflag || ch != '\n')) { >+ if (nflag && (!bflag || ch != L'\n')) { > (void)fprintf(stdout, "%6d\t", ++line); > if (ferror(stdout)) > break; > } > } >- if (ch == '\n') { >+ och = WEOF; >+ if (ch == L'\n') { > if (eflag && putchar('$') == EOF) > break; >- } else if (ch == '\t') { >+ } else if (ch == L'\t') { > if (tflag) { > if (putchar('^') == EOF || putchar('I') == EOF) > break; > continue; > } > } else if (vflag) { >- if (!isascii(ch) && !isprint(ch)) { >+ if (!iswprint(ch) && !iswcntrl(ch)) { > if (putchar('M') == EOF || putchar('-') == EOF) > break; >+ och = ch; >+ ch = toascii(ch); >+ } else if (iswcntrl(ch)) { >+ och = ch; > ch = toascii(ch); >- } >- if (iscntrl(ch)) { > if (putchar('^') == EOF || >- putchar(ch == '\177' ? '?' : >- ch | 0100) == EOF) >+ putwchar(ch == L'\177' ? L'?' : >+ ch | 0100) == WEOF) > break; >+ ch = och; > continue; > } > } >- if (putchar(ch) == EOF) >+ if (putwchar(ch) == WEOF) > break; >+ if (och != WEOF) >+ ch = och; >+ } >+ if (!ferror(stdout) && !feof(fp) && ferror(fp) && errno == EILSEQ) { >+ if ((c = getc(fp)) != EOF) { >+ if (prev == L'\n') { >+ if (sflag) >+ gobble = 0; >+ if (nflag) { >+ (void)fprintf(stdout, "%6d\t", ++line); >+ if (ferror(stdout)) >+ goto err; >+ } >+ } >+ oc = EOF; >+ if (vflag) { >+ if (c >= ' ' && c != '\177') { >+ if (putchar('M') == EOF || putchar('-') == EOF) >+ goto err; >+ oc = c; >+ c = toascii(c); >+ } else if (c < ' ' || c == '\177') { >+ if (putchar('^') == EOF || >+ putchar(c == '\177' ? '?' : >+ c | 0100) == EOF) >+ goto err; >+ prev = c; >+ clearerr(fp); >+ goto again; >+ } >+ } >+ if (putchar(c) == EOF) >+ goto err; >+ if (oc != EOF) >+ c = oc; >+ prev = c; >+ clearerr(fp); >+ goto again; >+ } > } > if (ferror(fp)) { >- warn("%s", filename); >- rval = 1; >+ if (errno != EILSEQ) { >+ warn("%s", filename); >+ rval = 1; >+ } > clearerr(fp); > } >+err: >+ if (errno == 0) >+ errno = saverrno; > if (ferror(stdout)) > err(1, "stdout"); > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 210995
:
172364
|
173315
|
173316
|
173318
|
174708