]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
column: use \x<hex> for invalid multibyte seq.
authorKarel Zak <kzak@redhat.com>
Wed, 22 Nov 2017 13:43:36 +0000 (14:43 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 22 Nov 2017 13:43:36 +0000 (14:43 +0100)
Addresses: https://github.com/karelzak/util-linux/issues/542
Signed-off-by: Karel Zak <kzak@redhat.com>
text-utils/column.1
text-utils/column.c

index 2bc47edde23a19d85b991d9f7fdf3d35a76f4e4e..b22468049dae17b3b0ca80449b5966aadb18bf9f 100644 (file)
@@ -54,7 +54,7 @@ mode is enabled by option \fB-t, \-\-table\fP and columns formatting is
 possible to modify by \fB\-\-table-*\fP options.  Use this mode if not sure.
 .PP
 Input is taken from \fIfile\fR, or otherwise from standard input.  Empty lines
-are ignored.
+are ignored and all invalid multibyte sequences are encoded by \\x<hex> convention.
 .PP
 .SH OPTIONS
 The argument \fIcolumns\fP for \fB\-\-table-*\fP options is comma separated
index ad6c2b20e21e9135a0597bc8b5efb36d5b5bf328..1484d783d5f0f9c7a9ae7af9e7e2729a61326270 100644 (file)
@@ -52,6 +52,7 @@
 #include "ttyutils.h"
 #include "strv.h"
 #include "optutils.h"
+#include "mbsalign.h"
 
 #include "libsmartcols.h"
 
@@ -485,8 +486,18 @@ static int read_input(struct column_control *ctl, FILE *fp)
                        continue;
 
                wcs = mbs_to_wcs(str);
-               if (!wcs)
-                       err(EXIT_FAILURE, _("read failed"));
+               if (!wcs) {
+                       /*
+                        * Convert broken sequences to \x<hex> and continue.
+                        */
+                       size_t tmpsz = 0;
+                       char *tmp = mbs_invalid_encode(str, &tmpsz);
+
+                       if (!tmp)
+                               err(EXIT_FAILURE, _("read failed"));
+                       wcs = mbs_to_wcs(tmp);
+                       free(tmp);
+               }
 
                switch (ctl->mode) {
                case COLUMN_MODE_TABLE:
@@ -618,6 +629,7 @@ static void __attribute__((__noreturn__)) usage(void)
        fputs(_(" -s, --separator <string>         possible table delimiters\n"), out);
        fputs(_(" -x, --fillrows                   fill rows before columns\n"), out);
 
+
        fputs(USAGE_SEPARATOR, out);
        printf(USAGE_HELP_OPTIONS(34));
        printf(USAGE_MAN_TAIL("column(1)"));