Author: matthew
Date: 2005-09-17 04:56:08 -0600 (Sat, 17 Sep 2005)
New Revision: 1124

Added:
   trunk/coreutils/coreutils-5.2.1-echo_posix-1.patch
Log:
Add coreutils POSIX compatibility patch for echo

Added: trunk/coreutils/coreutils-5.2.1-echo_posix-1.patch
===================================================================
--- trunk/coreutils/coreutils-5.2.1-echo_posix-1.patch  2005-09-15 22:55:14 UTC 
(rev 1123)
+++ trunk/coreutils/coreutils-5.2.1-echo_posix-1.patch  2005-09-17 10:56:08 UTC 
(rev 1124)
@@ -0,0 +1,346 @@
+Submitted By: Matthew Burgess <matthew at linuxfromscratch dot org>
+Date: 2005-09-17
+Initial Package Version: 5.2.1
+Upstream Status: From Upstream
+Origin: http://lists.gnu.org/archive/html/bug-coreutils/2004-05/msg00062.html
+Description: Improve echo's POSIX and bash compatibility and add support for
+             \xhh syntax as required by the testsuite in udev >= 069.
+
+diff -Naur coreutils-5.2.1.orig/src/echo.c coreutils-5.2.1/src/echo.c
+--- coreutils-5.2.1.orig/src/echo.c    2004-01-21 22:27:02.000000000 +0000
++++ coreutils-5.2.1/src/echo.c 2005-09-16 22:31:54.292297144 +0000
+@@ -39,28 +39,16 @@
+       \t      horizontal tab
+       \v      vertical tab
+       \\      backslash
+-      \num    the character whose ASCII code is NUM (octal).
++      \0NNN   the character whose ASCII code is NNN (octal).
+ 
+ You can explicitly turn off the interpretation of the above characters
+ on System V systems with the -E option.
+ */
+ 
+-/* If defined, interpret backslash escapes if -e is given.  */
+-#define V9_ECHO
+-
+-/* If defined, interpret backslash escapes unless -E is given.
+-   V9_ECHO must also be defined.  */
+-/* #define V9_DEFAULT */
+-
+-#if defined (V9_ECHO)
+-# if defined (V9_DEFAULT)
+-#  define VALID_ECHO_OPTIONS "neE"
+-# else
+-#  define VALID_ECHO_OPTIONS "ne"
+-# endif /* !V9_DEFAULT */
+-#else /* !V9_ECHO */
+-# define VALID_ECHO_OPTIONS "n"
+-#endif /* !V9_ECHO */
++/* If true, interpret backslash escapes by default.  */
++#ifndef DEFAULT_ECHO_TO_XPG
++enum { DEFAULT_ECHO_TO_XPG = false };
++#endif
+ 
+ /* The name this program was run with. */
+ char *program_name;
+@@ -77,18 +65,23 @@
+       fputs (_("\
+ Echo the STRING(s) to standard output.\n\
+ \n\
+-  -n              do not output the trailing newline\n\
+-  -e              enable interpretation of the backslash-escaped characters\n\
+-                    listed below\n\
+-  -E              disable interpretation of those sequences in STRINGs\n\
++  -n             do not output the trailing newline\n\
+ "), stdout);
++      fputs (_(DEFAULT_ECHO_TO_XPG
++             ? "\
++  -e             enable interpretation of backslash escapes (default)\n\
++  -E             disable interpretation of backslash escapes\n"
++             : "\
++  -e             enable interpretation of backslash escapes\n\
++  -E             disable interpretation of backslash escapes (default)\n"),
++           stdout);
+       fputs (HELP_OPTION_DESCRIPTION, stdout);
+       fputs (VERSION_OPTION_DESCRIPTION, stdout);
+       fputs (_("\
+ \n\
+-Without -E, the following sequences are recognized and interpolated:\n\
++If -e is in effect, the following sequences are recognized:\n\
+ \n\
+-  \\NNN   the character whose ASCII code is NNN (octal)\n\
++  \\0NNN   the character whose ASCII code is NNN (octal)\n\
+   \\\\     backslash\n\
+   \\a     alert (BEL)\n\
+   \\b     backspace\n\
+@@ -106,6 +99,22 @@
+   exit (status);
+ }
+ 
++/* Convert C from hexadecimal character to integer.  */
++static int
++hextobin (unsigned char c)
++{
++  switch (c)
++    {
++    default: return c - '0';
++    case 'a': case 'A': return 10;
++    case 'b': case 'B': return 11;
++    case 'c': case 'C': return 12;
++    case 'd': case 'D': return 13;
++    case 'e': case 'E': return 14;
++    case 'f': case 'F': return 15;
++    }
++}
++
+ /* Print the words in LIST to standard output.  If the first word is
+    `-n', then don't print a trailing newline.  We also support the
+    echo syntax from Version 9 unix systems. */
+@@ -113,8 +122,15 @@
+ int
+ main (int argc, char **argv)
+ {
+-  int display_return = 1, do_v9 = 0;
+-  int allow_options = 1;
++  bool display_return = true;
++  bool allow_options =
++    (! getenv ("POSIXLY_CORRECT")
++     || (! DEFAULT_ECHO_TO_XPG && 1 < argc && STREQ (argv[1], "-n")));
++
++  /* System V machines already have a /bin/sh with a v9 behavior.
++     Use the identical behavior for these machines so that the
++     existing system shell scripts won't barf.  */
++  bool do_v9 = DEFAULT_ECHO_TO_XPG;
+ 
+   initialize_main (&argc, &argv);
+   program_name = argv[0];
+@@ -124,124 +140,135 @@
+ 
+   atexit (close_stdout);
+ 
+-  /* Don't recognize --help or --version if POSIXLY_CORRECT is set.  */
+-  if (getenv ("POSIXLY_CORRECT") == NULL)
++  if (allow_options)
+     parse_long_options (argc, argv, PROGRAM_NAME, GNU_PACKAGE, VERSION,
+-                    usage, AUTHORS, (char const *) NULL, NULL);
+-  else
+-    allow_options = 0;
+-
+-/* System V machines already have a /bin/sh with a v9 behaviour.  We
+-   use the identical behaviour for these machines so that the
+-   existing system shell scripts won't barf. */
+-#if defined (V9_ECHO) && defined (V9_DEFAULT)
+-  do_v9 = allow_options;
+-#endif
++                      usage, AUTHORS, (char const *) NULL);
+ 
+   --argc;
+   ++argv;
+ 
+-  while (argc > 0 && *argv[0] == '-')
+-    {
+-      register char *temp;
+-      register int i;
+-
+-      /* If it appears that we are handling options, then make sure that
+-       all of the options specified are actually valid.  Otherwise, the
+-       string should just be echoed. */
+-      temp = argv[0] + 1;
++  if (allow_options)
++    while (argc > 0 && *argv[0] == '-')
++      {
++      char const *temp = argv[0] + 1;
++      size_t i;
++
++      /* If it appears that we are handling options, then make sure that
++         all of the options specified are actually valid.  Otherwise, the
++         string should just be echoed.  */
+ 
+-      for (i = 0; temp[i]; i++)
+-      {
+-        if (strrchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
+-          goto just_echo;
+-      }
++      for (i = 0; temp[i]; i++)
++        switch (temp[i])
++          {
++          case 'e': case 'E': case 'n':
++            break;
++          default:
++            goto just_echo;
++          }
+ 
+-      if (!*temp)
+-      goto just_echo;
++      if (i == 0)
++        goto just_echo;
+ 
+-      /* All of the options in TEMP are valid options to ECHO.
+-       Handle them. */
+-      while (*temp)
+-      {
+-        if (allow_options && *temp == 'n')
+-          display_return = 0;
+-#if defined (V9_ECHO)
+-        else if (allow_options && *temp == 'e')
+-          do_v9 = 1;
+-# if defined (V9_DEFAULT)
+-        else if (allow_options && *temp == 'E')
+-          do_v9 = 0;
+-# endif /* V9_DEFAULT */
+-#endif /* V9_ECHO */
+-        else
+-          goto just_echo;
++      /* All of the options in TEMP are valid options to ECHO.
++         Handle them. */
++      while (*temp)
++        switch (*temp++)
++          {
++          case 'e':
++            do_v9 = true;
++            break;
++
++          case 'E':
++            do_v9 = false;
++            break;
++
++          case 'n':
++            display_return = false;
++            break;
++          }
+ 
+-        temp++;
+-      }
+-      argc--;
+-      argv++;
+-    }
++      argc--;
++      argv++;
++      }
+ 
+ just_echo:
+ 
+-  if (argc > 0)
++  if (do_v9)
+     {
+-#if defined (V9_ECHO)
+-      if (do_v9)
++      while (argc > 0)
+       {
+-        while (argc > 0)
+-          {
+-            register char *s = argv[0];
+-            register int c;
++        char const *s = argv[0];
++        unsigned char c;
+ 
+-            while ((c = *s++))
++        while ((c = *s++))
++          {
++            if (c == '\\' && *s)
+               {
+-                if (c == '\\' && *s)
++                switch (c = *s++)
+                   {
+-                    switch (c = *s++)
+-                      {
+-                      case 'a': c = '\007'; break;
+-                      case 'b': c = '\b'; break;
+-                      case 'c': display_return = 0; continue;
+-                      case 'f': c = '\f'; break;
+-                      case 'n': c = '\n'; break;
+-                      case 'r': c = '\r'; break;
+-                      case 't': c = '\t'; break;
+-                      case 'v': c = (int) 0x0B; break;
+-                      case '0': case '1': case '2': case '3':
+-                      case '4': case '5': case '6': case '7':
+-                        c -= '0';
+-                        if (*s >= '0' && *s <= '7')
+-                          c = c * 8 + (*s++ - '0');
+-                        if (*s >= '0' && *s <= '7')
+-                          c = c * 8 + (*s++ - '0');
+-                        break;
+-                      case '\\': break;
+-                      default:  putchar ('\\'); break;
+-                      }
++                  case 'a': c = '\a'; break;
++                  case 'b': c = '\b'; break;
++                  case 'c': exit (EXIT_SUCCESS);
++                  case 'f': c = '\f'; break;
++                  case 'n': c = '\n'; break;
++                  case 'r': c = '\r'; break;
++                  case 't': c = '\t'; break;
++                  case 'v': c = '\v'; break;
++                  case 'x':
++                    {
++                      unsigned char ch = *s;
++                      if (! ISXDIGIT (ch))
++                        goto not_an_escape;
++                      s++;
++                      c = hextobin (ch);
++                      ch = *s;
++                      if (ISXDIGIT (ch))
++                        {
++                          s++;
++                          c = c * 16 + hextobin (ch);
++                        }
++                    }
++                    break;
++                  case '0':
++                    c = 0;
++                    if (! ('0' <= *s && *s <= '7'))
++                      break;
++                    c = *s++;
++                    /* Fall through.  */
++                  case '1': case '2': case '3':
++                  case '4': case '5': case '6': case '7':
++                    c -= '0';
++                    if ('0' <= *s && *s <= '7')
++                      c = c * 8 + (*s++ - '0');
++                    if ('0' <= *s && *s <= '7')
++                      c = c * 8 + (*s++ - '0');
++                    break;
++                  case '\\': break;
++
++                  not_an_escape:
++                  default:  putchar ('\\'); break;
+                   }
+-                putchar(c);
+               }
+-            argc--;
+-            argv++;
+-            if (argc > 0)
+-              putchar(' ');
++            putchar (c);
+           }
++        argc--;
++        argv++;
++        if (argc > 0)
++          putchar (' ');
+       }
+-      else
+-#endif /* V9_ECHO */
++    }
++  else
++    {
++      while (argc > 0)
+       {
+-        while (argc > 0)
+-          {
+-            fputs (argv[0], stdout);
+-            argc--;
+-            argv++;
+-            if (argc > 0)
+-              putchar (' ');
+-          }
++        fputs (argv[0], stdout);
++        argc--;
++        argv++;
++        if (argc > 0)
++          putchar (' ');
+       }
+     }
++
+   if (display_return)
+     putchar ('\n');
+   exit (EXIT_SUCCESS);

-- 
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to