Mercurial > hg > toybox
changeset 716:8c10cf7bace0
expand: handle backspace.
author | Jonathan Clairembault <jonathan@clairembault.fr> |
---|---|
date | Fri, 23 Nov 2012 09:24:53 +0100 |
parents | 3417db95f24b |
children | 54294a48a09b |
files | scripts/test/expand.test toys/posix/expand.c |
diffstat | 2 files changed, 5 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/test/expand.test Fri Nov 23 00:06:28 2012 +0100 +++ b/scripts/test/expand.test Fri Nov 23 09:24:53 2012 +0100 @@ -11,6 +11,7 @@ testing "expand default stdin" "expand" " foo bar\n" "" "\tfoo\tbar\n" testing "expand single" "expand -t 2 input" " foo bar\n" "\tfoo\tbar\n" "" testing "expand tablist" "expand -t 5,10,12 input" " foo bar foo\n" "\tfoo\tbar\tfoo\n" "" +testing "expand backspace" "expand input" "foobarf bar\n" "foobarfoo\b\b\tbar\n" "" # advanced tests
--- a/toys/posix/expand.c Fri Nov 23 00:06:28 2012 +0100 +++ b/toys/posix/expand.c Fri Nov 23 09:24:53 2012 +0100 @@ -1,7 +1,5 @@ /* expand.c - expands tabs to space * - * FIXME: handle backspace. - * * Copyright 2012 Jonathan Clairembault <jonathan at clairembault dot fr> * * See http://http://pubs.opengroup.org/onlinepubs/9699919799/nframe.html @@ -116,7 +114,10 @@ wrlinei += count; } else { /* copy input to output */ wrbuf[wrbufi++] = rdbuf[rdbufi]; - wrlinei += 1; + if (rdbuf[rdbufi] == '\b') /* go back one column on backspace */ + wrlinei -= !!wrlinei; /* do not go below zero */ + else + wrlinei += 1; /* flush expand buffer and reset tablist at newline */ if (rdbuf[rdbufi] == '\n') { writeall(STDOUT_FILENO, wrbuf, wrbufi);