grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Make echo UTF-8-clean


From: Colin Watson
Subject: [PATCH] Make echo UTF-8-clean
Date: Tue, 21 Dec 2010 13:06:39 +0000
User-agent: Mutt/1.5.18 (2008-05-17)

While working on my previous patch, I noticed that echo wasn't
UTF-8-clean: the UTF-8 character 'à' was coming out as "??".  This patch
fixes that.

2010-12-21  Colin Watson  <address@hidden>

        * grub-core/commands/echo.c (grub_cmd_echo): Make UTF-8-clean by
        constructing a new unescaped string and passing it to grub_xputs in
        one go, rather than passing characters to grub_printf one at a time.

=== modified file 'grub-core/commands/echo.c'
--- grub-core/commands/echo.c   2010-11-30 15:23:41 +0000
+++ grub-core/commands/echo.c   2010-12-21 13:03:09 +0000
@@ -44,6 +44,9 @@ grub_cmd_echo (grub_extcmd_context_t ctx
   for (i = 0; i < argc; i++)
     {
       char *arg = *args;
+      /* Unescaping results in a string no longer than the original.  */
+      char *unescaped = grub_malloc (grub_strlen (arg) + 1);
+      char *p = unescaped;
       args++;
 
       while (*arg)
@@ -58,11 +61,11 @@ grub_cmd_echo (grub_extcmd_context_t ctx
              switch (*arg)
                {
                case '\\':
-                 grub_printf ("\\");
+                 *p++ = '\\';
                  break;
 
                case 'a':
-                 grub_printf ("\a");
+                 *p++ = '\a';
                  break;
 
                case 'c':
@@ -70,23 +73,23 @@ grub_cmd_echo (grub_extcmd_context_t ctx
                  break;
 
                case 'f':
-                 grub_printf ("\f");
+                 *p++ = '\f';
                  break;
 
                case 'n':
-                 grub_printf ("\n");
+                 *p++ = '\n';
                  break;
 
                case 'r':
-                 grub_printf ("\r");
+                 *p++ = '\r';
                  break;
 
                case 't':
-                 grub_printf ("\t");
+                 *p++ = '\t';
                  break;
 
                case 'v':
-                 grub_printf ("\v");
+                 *p++ = '\v';
                  break;
                }
              arg++;
@@ -95,10 +98,14 @@ grub_cmd_echo (grub_extcmd_context_t ctx
 
          /* This was not an escaped character, or escaping is not
             enabled.  */
-         grub_printf ("%c", *arg);
+         *p++ = *arg;
          arg++;
        }
 
+      *p = '\0';
+      grub_xputs (unescaped);
+      grub_free (unescaped);
+
       /* If another argument follows, insert a space.  */
       if (i != argc - 1)
        grub_printf (" " );

-- 
Colin Watson                                       address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]