toybox/toys/posix/echo.c
<<
>>
Prefs
   1/* echo.c - echo supporting -n and -e.
   2 *
   3 * Copyright 2007 Rob Landley <rob@landley.net>
   4 *
   5 * See http://opengroup.org/onlinepubs/9699919799/utilities/echo.html
   6 *
   7 * Deviations from posix: we parse command line options, as Linux has
   8 * consistently done since 1992. Posix defaults -e to on, we require -e.
   9 * We also honor -- to _stop_ option parsing (bash doesn't, we go with
  10 * consistency over compatibility here).
  11
  12USE_ECHO(NEWTOY(echo, "^?Een[-eE]", TOYFLAG_BIN|TOYFLAG_MAYFORK|TOYFLAG_LINEBUF))
  13
  14config ECHO
  15  bool "echo"
  16  default y
  17  help
  18    usage: echo [-neE] [ARG...]
  19
  20    Write each argument to stdout, one space between each, followed by a newline.
  21
  22    -n  No trailing newline
  23    -E  Print escape sequences literally (default)
  24    -e  Process the following escape sequences:
  25        \\  Backslash           \0NNN Octal (1-3 digit) \xHH Hex (1-2 digit)
  26        \a  Alert (beep/flash)  \b  Backspace           \c  Stop here (no \n)
  27        \f  Form feed           \n  Newline             \r  Carriage return
  28        \t  Horizontal tab      \v  Vertical tab
  29*/
  30
  31#define FOR_echo
  32#include "toys.h"
  33
  34void echo_main(void)
  35{
  36  int i = 0;
  37  char *arg, *c, out[8];
  38
  39  while ((arg = toys.optargs[i])) {
  40    if (i++) putchar(' ');
  41
  42    // Should we output arg verbatim?
  43
  44    if (!FLAG(e)) {
  45      xprintf("%s", arg);
  46      continue;
  47    }
  48
  49    // Handle -e
  50
  51    for (c = arg; *c; ) {
  52      unsigned u;
  53
  54      if (*c == '\\' && c[1] == 'c') return;
  55      if ((u = unescape2(&c, 1))<128) putchar(u);
  56      else printf("%.*s", (int)wcrtomb(out, u, 0), out);
  57    }
  58  }
  59
  60  // Output "\n" if no -n
  61  if (!FLAG(n)) putchar('\n');
  62}
  63