Skip to content

Commit

Permalink
column: fix leading space characters bug
Browse files Browse the repository at this point in the history
The bug has been introduced during column(1) rewrite. The function
read_input() need to skip leading space only temporary to detect empty
lines, but the rest of the code has to use the original buffer (line).
I've tried to fix one of the symptoms by 5c7b67f
(alter), but this solution is unnecessary and too complex.

Changes:

* don't ignore leading space
* remove unnecessary stuff introduced by 5c7b67f
* fix regression test with incorrect separator

Addresses: #575
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1560283
Signed-off-by: Karel Zak <kzak@redhat.com>
  • Loading branch information
karelzak committed Mar 27, 2018
1 parent 867c15d commit 651c5d4
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 38 deletions.
3 changes: 0 additions & 3 deletions Documentation/TODO
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ column
- add option to NOT ignore empty lines
https://github.com/karelzak/util-linux/issues/593

- add option to NOT ignore line leading empty space
https://bugzilla.redhat.com/show_bug.cgi?id=1560283

script
------
- (!) add terminal type ($TERM), columns and lines to the header line, something like:
Expand Down
2 changes: 1 addition & 1 deletion tests/expected/column/table-input-separator-space
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
AAA BBBB C DDDD
BBB CCCC DDD
BBB CCCC DDD
AA BB DD
AAAA B CC D
AA CC DD
Expand Down
2 changes: 1 addition & 1 deletion tests/ts/column/table
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ $TS_CMD_COLUMN --separator ',' --table $TS_SELF/files/table-sep >> $TS_OUTPUT 2>
ts_finalize_subtest

ts_init_subtest "input-separator-space"
$TS_CMD_COLUMN --separator ',' --table $TS_SELF/files/table-sep-space >> $TS_OUTPUT 2>&1
$TS_CMD_COLUMN --separator "$(echo -e '\t')" --table $TS_SELF/files/table-sep-space >> $TS_OUTPUT 2>&1
ts_finalize_subtest

ts_init_subtest "long"
Expand Down
36 changes: 3 additions & 33 deletions text-utils/column.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ struct column_control {
const char *tree_parent;

wchar_t *input_separator;
char *input_separator_raw;
const char *output_separator;

wchar_t **ents; /* input entries */
Expand All @@ -96,7 +95,6 @@ struct column_control {
unsigned int greedy :1,
json :1,
header_repeat :1,
input_sep_space : 1, /* input separator contains space chars */
tab_noheadings :1;
};

Expand Down Expand Up @@ -470,19 +468,7 @@ static int read_input(struct column_control *ctl, FILE *fp)
char *buf = NULL;
size_t bufsz = 0;
size_t maxents = 0;
int rc = 0, is_space_sep = 0;

/* Check if columns separator contains spaces chars */
if (ctl->mode == COLUMN_MODE_TABLE && ctl->input_separator_raw) {
char *p;

for (p = ctl->input_separator_raw; *p; p++) {
if (isspace(*p)) {
is_space_sep = 1;
break;
}
}
}
int rc = 0;

/* Read input */
do {
Expand All @@ -496,19 +482,6 @@ static int read_input(struct column_control *ctl, FILE *fp)
err(EXIT_FAILURE, _("read failed"));
}
str = (char *) skip_space(buf);

/* The table columns separator could be a space. In this case
* don't skip the separator if at begin of the line. For example:
*
* echo -e "\tcol1\tcol2\nrow\t1\t2" \
* | column -t -s "$(echo -e '\t')" --table-columns A,B,C
*/
if (is_space_sep && str > buf) {
char *x = strpbrk(buf, ctl->input_separator_raw);
if (x && x < str)
str = x;
}

if (str) {
p = strchr(str, '\n');
if (p)
Expand All @@ -517,13 +490,13 @@ static int read_input(struct column_control *ctl, FILE *fp)
if (!str || !*str)
continue;

wcs = mbs_to_wcs(str);
wcs = mbs_to_wcs(buf);
if (!wcs) {
/*
* Convert broken sequences to \x<hex> and continue.
*/
size_t tmpsz = 0;
char *tmp = mbs_invalid_encode(str, &tmpsz);
char *tmp = mbs_invalid_encode(buf, &tmpsz);

if (!tmp)
err(EXIT_FAILURE, _("read failed"));
Expand Down Expand Up @@ -720,7 +693,6 @@ int main(int argc, char **argv)

ctl.output_separator = " ";
ctl.input_separator = mbs_to_wcs("\t ");
ctl.input_separator_raw = xstrdup("\t ");

while ((c = getopt_long(argc, argv, "c:dE:eH:hi:JN:n:O:o:p:R:r:s:T:tVW:x", longopts, NULL)) != -1) {

Expand Down Expand Up @@ -775,9 +747,7 @@ int main(int argc, char **argv)
break;
case 's':
free(ctl.input_separator);
free(ctl.input_separator_raw);
ctl.input_separator = mbs_to_wcs(optarg);
ctl.input_separator_raw = xstrdup(optarg);
ctl.greedy = 0;
break;
case 'T':
Expand Down

0 comments on commit 651c5d4

Please sign in to comment.