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.
+2010-12-21 Colin Watson <cjwatson@ubuntu.com>
+
+ * 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.
+
2010-12-21 Colin Watson <cjwatson@ubuntu.com>
* grub-core/fs/udf.c (read_string): Pacify GCC warning by
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++;
+ if (!unescaped)
+ return grub_errno;
+
while (*arg)
{
/* In case `-e' is used, parse backslashes. */
switch (*arg)
{
case '\\':
- grub_printf ("\\");
+ *p++ = '\\';
break;
case 'a':
- grub_printf ("\a");
+ *p++ = '\a';
break;
case 'c':
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++;
/* 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 (" " );