diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-14 15:45:25 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-14 15:45:25 +0000 |
commit | 3139ea7f1567723e200d29e46e78953ea5fe4d5b (patch) | |
tree | 2ceaaa2b1b636c348140c42ab1c5beb2f44ad089 | |
parent | 005ff882ba2760f5e85a521ed41360f58163f14c (diff) |
expand: fix incorrect expansion exactly on tab boundary; shrink the code
function old new delta
expand_main 698 676 -22
xputchar 53 - -53
-rw-r--r-- | coreutils/expand.c | 60 | ||||
-rwxr-xr-x | testsuite/expand.tests | 15 |
2 files changed, 41 insertions, 34 deletions
diff --git a/coreutils/expand.c b/coreutils/expand.c index ee51c032f..3ca7e5c29 100644 --- a/coreutils/expand.c +++ b/coreutils/expand.c @@ -29,51 +29,43 @@ enum { OPT_ALL = 1 << 2, }; -static void xputchar(char c) -{ - if (putchar(c) < 0) - bb_error_msg_and_die(bb_msg_write_error); -} - #if ENABLE_EXPAND -static void expand(FILE *file, unsigned tab_size, unsigned opt) +static void expand(FILE *file, int tab_size, unsigned opt) { char *line; - char *ptr; - int convert; - unsigned pos; - /* Increment tab_size by 1 locally.*/ - tab_size++; + tab_size = -tab_size; while ((line = xmalloc_fgets(file)) != NULL) { - convert = 1; - pos = 0; - ptr = line; - while (*line) { - pos++; - if (*line == '\t' && convert) { - for (; pos < tab_size; pos++) { - xputchar(' '); - } - } else { - if ((opt & OPT_INITIAL) && !isblank(*line)) { - convert = 0; - } - xputchar(*line); + int pos; + unsigned char c; + char *ptr = line; + + goto start; + while ((c = *ptr) != '\0') { + if ((opt & OPT_INITIAL) && !isblank(c)) { + fputs(ptr, stdout); + break; } - if (pos == tab_size) { - pos = 0; + ptr++; + if (c == '\t') { + c = ' '; + while (++pos < 0) + bb_putchar(c); + } + bb_putchar(c); + if (++pos >= 0) { + start: + pos = tab_size; } - line++; } - free(ptr); + free(line); } } #endif #if ENABLE_UNEXPAND -static void unexpand(FILE *file, unsigned int tab_size, unsigned opt) +static void unexpand(FILE *file, unsigned tab_size, unsigned opt) { char *line; char *ptr; @@ -101,11 +93,11 @@ static void unexpand(FILE *file, unsigned int tab_size, unsigned opt) if (i) { for (; i > 0; i--) { put_tab: - xputchar('\t'); + bb_putchar('\t'); } } else { for (i = pos % tab_size; i > 0; i--) { - xputchar(' '); + bb_putchar(' '); } } pos = 0; @@ -116,7 +108,7 @@ static void unexpand(FILE *file, unsigned int tab_size, unsigned opt) if (opt & OPT_ALL) { column++; } - xputchar(*line); + bb_putchar(*line); line++; } } diff --git a/testsuite/expand.tests b/testsuite/expand.tests new file mode 100755 index 000000000..3f4cda3f8 --- /dev/null +++ b/testsuite/expand.tests @@ -0,0 +1,15 @@ +#!/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 "expand" \ + "expand" \ + " 12345678 12345678\n" \ + "" \ + "\t12345678\t12345678\n" \ + +exit $FAILCOUNT |