The following patch adds a new option -r (--reversible) which allows the
display of control characters to be done without ambiguity. To illustrate,
suppose that we were given the input
\011^I
cat -A would display
^I^I
while with this patch, cat -rA would display
^I\^I
--
Debian GNU/Linux 2.1 is out! ( http://www.debian.org/ )
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Index: doc/textutils.texi
===================================================================
RCS file: /home/gondor/herbert/src/CVS/debian/textutils/doc/textutils.texi,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 textutils.texi
--- doc/textutils.texi 1999/07/31 09:03:30 1.1.1.1
+++ doc/textutils.texi 2000/06/27 10:20:43
@@ -358,6 +358,15 @@
Number all output lines, starting with 1. On MS-DOS and MS-Windows,
this option causes @code{cat} to read and write files in text mode.
+@item -r
+@itemx --reversible
+@opindex -r
+@opindex --reversible
+Display control characters without being ambiguous by inserting a
+@samp{\} before all occurrences of @samp{^}, @samp{M}, @samp{\} and
+@samp{$} in the input, as well as any occurrences of literal @samp{^}
+and @samp{\} after the @samp{M-} notation. This also implies @samp{-v}.
+
@item -s
@itemx --squeeze-blank
@opindex -s
Index: man/cat.1
===================================================================
RCS file: /home/gondor/herbert/src/CVS/debian/textutils/man/cat.1,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 cat.1
--- man/cat.1 1999/08/06 19:24:07 1.1.1.1
+++ man/cat.1 2000/06/27 10:18:52
@@ -26,6 +26,11 @@
\fB\-n\fR, \fB\-\-number\fR
number all output lines
.TP
+\fB\-r\fR, \fB\-\-reversible\fR
+put a backslash before all occurrences of ^, M, \\, and $
+in the input, as well as all occurrences of literal ^ and
+\\ after the M- notation, implies \fB\-v\fR
+.TP
\fB\-s\fR, \fB\-\-squeeze\-blank\fR
never more than one single blank line
.TP
Index: src/cat.c
===================================================================
RCS file: /home/gondor/herbert/src/CVS/debian/textutils/src/cat.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 cat.c
--- src/cat.c 1999/05/18 14:12:03 1.1.1.1
+++ src/cat.c 2000/06/27 10:13:36
@@ -97,6 +97,7 @@
-e equivalent to -vE\n\
-E, --show-ends display $ at end of each line\n\
-n, --number number all output lines\n\
+ -r, --reversible use \\ to make the output reversible, implies -v\n\
-s, --squeeze-blank never more than one single blank line\n\
-t equivalent to -vT\n\
-T, --show-tabs display TAB characters as ^I\n\
@@ -203,7 +204,8 @@
int numbers,
int numbers_at_empty_lines,
int mark_line_ends,
- int squeeze_empty_lines)
+ int squeeze_empty_lines,
+ int reversible)
{
/* Last character read from the input buffer. */
unsigned char ch;
@@ -398,7 +400,12 @@
if (ch >= 32)
{
if (ch < 127)
- *bpout++ = ch;
+ {
+ if (reversible && (ch == '^' || ch == 'M' ||
+ ch == '\\' || ch == '$'))
+ *bpout++ = '\\';
+ *bpout++ = ch;
+ }
else if (ch == 127)
{
*bpout++ = '^';
@@ -411,7 +418,12 @@
if (ch >= 128 + 32)
{
if (ch < 128 + 127)
- *bpout++ = ch - 128;
+ {
+ ch -= 128;
+ if (reversible && (ch == '^' || ch == '\\'))
+ *bpout++ = '\\';
+ *bpout++ = ch;
+ }
else
{
*bpout++ = '^';
@@ -506,6 +518,7 @@
int mark_line_ends = 0;
int quote = 0;
int output_tabs = 1;
+ int reversible = 0;
#if O_BINARY
int binary_files = 0;
int binary_output = 0;
@@ -524,6 +537,7 @@
{"show-ends", no_argument, NULL, 'E'},
{"show-tabs", no_argument, NULL, 'T'},
{"show-all", no_argument, NULL, 'A'},
+ {"reversible", no_argument, NULL, 'r'},
#if O_BINARY
{"binary", no_argument, NULL, 'B'},
#endif
@@ -541,9 +555,9 @@
while ((c = getopt_long (argc, argv,
#if O_BINARY
- "benstuvABET"
+ "benrstuvABET"
#else
- "benstuvAET"
+ "benrstuvAET"
#endif
, long_options, NULL)) != -1)
{
@@ -569,6 +583,12 @@
numbers = 1;
break;
+ case 'r':
+ ++options;
+ reversible = 1;
+ quote = 1;
+ break;
+
case 's':
++options;
squeeze_empty_lines = 1;
@@ -798,7 +818,7 @@
cat (inbuf, insize, outbuf, outsize, quote,
output_tabs, numbers, numbers_at_empty_lines, mark_line_ends,
- squeeze_empty_lines);
+ squeeze_empty_lines, reversible);
free (outbuf);
}