unexpand: fix incorrect expansion, add test for it

function                                             old     new   delta
expand_main                                          676     656     -20
This commit is contained in:
Denis Vlasenko 2008-12-26 14:56:03 +00:00
parent 73ac056f50
commit e40e76f3cd
2 changed files with 57 additions and 39 deletions

View File

@ -68,51 +68,39 @@ static void expand(FILE *file, int tab_size, unsigned opt)
static void unexpand(FILE *file, unsigned tab_size, unsigned opt)
{
char *line;
char *ptr;
int convert;
int pos;
int i = 0;
unsigned column = 0;
while ((line = xmalloc_fgets(file)) != NULL) {
convert = 1;
pos = 0;
ptr = line;
while (*line) {
while ((*line == ' ' || *line == '\t') && convert) {
pos += (*line == ' ') ? 1 : tab_size;
line++;
char *ptr = line;
unsigned column = 0;
while (*ptr) {
unsigned n;
while (*ptr == ' ') {
column++;
if ((opt & OPT_ALL) && column == tab_size) {
column = 0;
goto put_tab;
}
ptr++;
}
if (pos) {
i = pos / tab_size;
if (i) {
for (; i > 0; i--) {
put_tab:
bb_putchar('\t');
}
} else {
for (i = pos % tab_size; i > 0; i--) {
bb_putchar(' ');
}
}
pos = 0;
} else {
if (opt & OPT_INITIAL) {
convert = 0;
}
if (opt & OPT_ALL) {
column++;
}
bb_putchar(*line);
line++;
if (*ptr == '\t') {
column += tab_size - (column % tab_size);
ptr++;
continue;
}
n = column / tab_size;
column = column % tab_size;
while (n--)
putchar('\t');
if ((opt & OPT_INITIAL) && ptr != line) {
printf("%*s%s", column, "", ptr);
break;
}
n = strcspn(ptr, "\t ");
printf("%*s%.*s", column, "", n, ptr);
ptr += n;
column = (column + n) % tab_size;
}
free(ptr);
free(line);
}
}
#endif

30
testsuite/unexpand.tests Executable file
View File

@ -0,0 +1,30 @@
#!/bin/sh
# Copyright 2008 by Denys Vlasenko
# Licensed under GPL v2, see file LICENSE for details.
. testing.sh
# testing "test name" "options" "expected result" "file input" "stdin"
testing "unexpand case 1" "unexpand" \
"\t12345678\n" "" " 12345678\n" \
testing "unexpand case 2" "unexpand" \
"\t 12345678\n" "" " 12345678\n" \
testing "unexpand case 3" "unexpand" \
"\t 12345678\n" "" " 12345678\n" \
testing "unexpand case 4" "unexpand" \
"\t12345678\n" "" " \t12345678\n" \
testing "unexpand case 5" "unexpand" \
"\t12345678\n" "" " \t12345678\n" \
testing "unexpand case 6" "unexpand" \
"\t12345678\n" "" " \t12345678\n" \
testing "unexpand case 7" "unexpand" \
"123\t 45678\n" "" "123 \t 45678\n" \
exit $FAILCOUNT