# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: ../mainline/ # testament_sha1: 96b80c166d1cec9c6b8b9f130fad3c9b3e562827 # timestamp: 2010-08-25 09:54:00 +0530 # base_revision_id: address@hidden # # Begin patch === modified file 'ChangeLog' --- ChangeLog 2010-08-23 17:56:24 +0000 +++ ChangeLog 2010-08-25 04:19:18 +0000 @@ -1,3 +1,14 @@ +2010-08-25 BVK Chaitanya + + Fix echo command output for unrecognized options (bug reported by + Yves Blusseau) + + * tests/grub_cmd_echo.in: New testcase. + * Makefile.util.def: Rules for new testcase. + + * grub-core/commands/echo.c: Use custom option parsing instead of + extcmd framework. + 2010-08-23 BVK Chaitanya New Automake based build system for GRUB. === modified file 'Makefile.util.def' --- Makefile.util.def 2010-08-23 15:53:39 +0000 +++ Makefile.util.def 2010-08-25 04:19:18 +0000 @@ -496,6 +496,12 @@ common = tests/grub_script_shift.in; }; +script = { + testcase; + name = grub_cmd_echo; + common = tests/grub_cmd_echo.in; +}; + program = { testcase; name = example_unit_test; === modified file 'grub-core/commands/echo.c' --- grub-core/commands/echo.c 2010-01-03 18:24:22 +0000 +++ grub-core/commands/echo.c 2010-08-25 04:19:18 +0000 @@ -19,36 +19,39 @@ #include #include -#include +#include #include -static const struct grub_arg_option options[] = - { - {0, 'n', 0, N_("Do not output the trailing newline."), 0, 0}, - {0, 'e', 0, N_("Enable interpretation of backslash escapes."), 0, 0}, - {0, 0, 0, 0, 0, 0} - }; - static grub_err_t -grub_cmd_echo (grub_extcmd_t cmd, int argc, char **args) +grub_cmd_echo (grub_command_t cmd __attribute__ ((unused)), + int argc, char **args) { - struct grub_arg_list *state = cmd->state; + int i; + int escape = 0; int newline = 1; - int i; - - /* Check if `-n' was used. */ - if (state[0].set) - newline = 0; + int parseopt = 1; for (i = 0; i < argc; i++) { char *arg = *args; args++; + if (parseopt && grub_strcmp (arg, "-n") == 0) + { + newline = 0; + continue; + } + else if (parseopt && grub_strcmp (arg, "-e") == 0) + { + escape = 1; + continue; + } + + parseopt = 0; while (*arg) { /* In case `-e' is used, parse backslashes. */ - if (*arg == '\\' && state[1].set) + if (*arg == '\\' && escape) { arg++; if (*arg == '\0') @@ -109,16 +112,15 @@ return 0; } -static grub_extcmd_t cmd; +static grub_command_t cmd; GRUB_MOD_INIT(echo) { - cmd = grub_register_extcmd ("echo", grub_cmd_echo, GRUB_COMMAND_FLAG_BOTH, - N_("[-e|-n] STRING"), N_("Display a line of text."), - options); + cmd = grub_register_command ("echo", grub_cmd_echo, N_("[-e|-n] STRING"), + N_("Display a line of text.")); } GRUB_MOD_FINI(echo) { - grub_unregister_extcmd (cmd); + grub_unregister_command (cmd); } === added file 'tests/grub_cmd_echo.in' --- tests/grub_cmd_echo.in 1970-01-01 00:00:00 +0000 +++ tests/grub_cmd_echo.in 2010-08-25 04:19:18 +0000 @@ -0,0 +1,33 @@ +#! @builddir@/grub-shell-tester +# +# Copyright (C) 2010 Free Software Foundation, Inc. +# +# GRUB is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GRUB. If not, see . + +echo +echo -n + +echo foo +echo foo bar + +echo -n foo + +echo -e "foo\nbar" + +echo -n -e "foo\nbar" + +echo foo -n +echo foo -n -e + +echo ------- # Begin bundle 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 b0rfV9JJ7js/8XckU4UJC/sNSTA=