From ef3e5284bf078ef3cb0bd21c4883b341f8a2cb96 Mon Sep 17 00:00:00 2001 From: Elie De Brauwer Date: Sat, 11 Feb 2012 14:58:50 +0100 Subject: Fix overflow in octal formatting in echo, add support for hexadecimal input, add tests for octal and hexadecimal formatting --- scripts/test/echo.test | 10 ++++++++++ toys/echo.c | 38 ++++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/scripts/test/echo.test b/scripts/test/echo.test index 3eac172f..e269bf20 100755 --- a/scripts/test/echo.test +++ b/scripts/test/echo.test @@ -23,3 +23,13 @@ testing "echo --hello" "$CMD --hello" "--hello\n" "" "" testing "echo -e all" "$CMD -e '\a\b\c\f\n\r\t\v\\\0123'" \ "\a\b\c\f\n\r\t\v\\\0123\n" "" "" testing "echo -nex hello" "$CMD -nex hello" "-nex hello\n" "" "" + +# Octal formatting tests +testing "echo -e octal values" \ + "$CMD -ne '\01234 \0060 \060 \0130\0131\0132 \077\012'" \ + "S4 0 0 XYZ ?\n" "" "" + +# Hexadecimal value tests +testing "echo -e hexadecimal values" \ + "$CMD -ne '\x534 \x30 \x58\x59\x5a \x3F\x0A'"\ + "S4 0 XYZ ?\n" "" "" diff --git a/toys/echo.c b/toys/echo.c index 5feb9899..f7c423cf 100644 --- a/toys/echo.c +++ b/toys/echo.c @@ -17,17 +17,19 @@ config ECHO Write each argument to stdout, with one space between each, followed by a newline. - -n No trailing newline. - -e Process the following escape sequences: - \\ backslash - \a alert (beep/flash) - \b backspace - \c Stop output here (avoids trailing newline) - \f form feed - \n newline - \r carriage return - \t horizontal tab - \v vertical tab + -n No trailing newline. + -e Process the following escape sequences: + \\ backslash + \0NNN octal values (1 to 3 digits) + \a alert (beep/flash) + \b backspace + \c stop output here (avoids trailing newline) + \f form feed + \n newline + \r carriage return + \t horizontal tab + \v vertical tab + \xHH hexadecimal values (1 to 2 digits) */ #include "toys.h" @@ -60,10 +62,22 @@ void echo_main(void) if (found) c = to[found-from]; else if (d == 'c') goto done; else if (d == '0') { + int n = 0; c = 0; - while (arg[j]>='0' && arg[j]<='7') + while (arg[j]>='0' && arg[j]<='7' && n++<3) c = (c*8)+arg[j++]-'0'; } + else if (d == 'x') { + int n = 0; + c = 0; + while (n++<2) + if (arg[j]>='0' && arg[j]<='9') + c = (c*16)+arg[j++]-'0'; + else if (tolower(arg[j])>='a' && tolower(arg[j])<='f') + c = (c*16)+tolower(arg[j++])-'a'+10; + else + break; + } } } xputc(c); -- cgit v1.2.3