# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: file:///home/bvk/Work/grub2/mainline/ # testament_sha1: 8a417696ff21d9afab6fa69bc654e9d3bf7de265 # timestamp: 2010-10-29 13:22:16 +0530 # base_revision_id: address@hidden # # Begin patch === modified file 'ChangeLog' --- ChangeLog 2010-10-26 10:40:35 +0000 +++ ChangeLog 2010-10-29 07:52:06 +0000 @@ -1,3 +1,13 @@ +2010-10-29 BVK Chaitanya + + Added `tr' command support. + + * grub-core/commands/tr.c: New file. + * grub-core/Makefile.core.def: Build rules for new module. + + * tests/grub_cmd_tr.in: New test. + * Makefile.util.def: Build rules for new test. + 2010-10-26 Vladimir Serbinenko * util/grub-setup.c (setup): Refuse to do a cross-disk embeddingless === modified file 'Makefile.util.def' --- Makefile.util.def 2010-09-29 19:33:38 +0000 +++ Makefile.util.def 2010-10-29 07:52:06 +0000 @@ -574,6 +574,12 @@ common = tests/grub_cmd_echo.in; }; +script = { + testcase; + name = grub_cmd_tr; + common = tests/grub_cmd_tr.in; +}; + program = { testcase; name = example_unit_test; === modified file 'grub-core/Makefile.core.def' --- grub-core/Makefile.core.def 2010-09-30 15:50:01 +0000 +++ grub-core/Makefile.core.def 2010-10-29 07:52:06 +0000 @@ -1502,3 +1502,8 @@ common = commands/keylayouts.c; enable = videomodules; }; + +module = { + name = tr; + common = commands/tr.c; +}; === added file 'grub-core/commands/tr.c' --- grub-core/commands/tr.c 1970-01-01 00:00:00 +0000 +++ grub-core/commands/tr.c 2010-10-29 07:52:06 +0000 @@ -0,0 +1,122 @@ +/* tr.c -- The tr command. */ +/* + * GRUB -- GRand Unified Bootloader + * 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 . + */ + +#include +#include +#include +#include +#include +#include +#include + +static const struct grub_arg_option options[] = + { + { "set", 's', 0, N_("Variable name to update."), N_("VARNAME"), ARG_TYPE_STRING }, + { "upcase", 'U', 0, N_("Translate to upper case."), 0, 0 }, + { "downcase", 'D', 0, N_("Translate to lower case."), 0, 0 }, + { 0, 0, 0, 0, 0, 0 } + }; + +static const char *letters_lowercase = "abcdefghijklmnopqrstuvwxyz"; +static const char *letters_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +static grub_err_t +grub_cmd_tr (grub_extcmd_context_t ctxt, int argc, char **args) +{ + int i; + char *p; + char *var = 0; + char *input = 0; + char *output = 0; + const char *s1 = 0; + const char *s2 = 0; + + /* Select the defaults from options. */ + if (ctxt->state[0].set) { + var = ctxt->state[0].arg; + input = grub_env_get (var); + } + + if (ctxt->state[1].set) { + s1 = letters_lowercase; + s2 = letters_uppercase; + } + + if (ctxt->state[2].set) { + s1 = letters_uppercase; + s2 = letters_lowercase; + } + + /* Check for arguments and update the defaults. */ + if (argc == 1) + input = args[0]; + + else if (argc == 2) { + s1 = args[0]; + s2 = args[1]; + + } else if (argc == 3) { + s1 = args[0]; + s2 = args[1]; + input = args[2]; + + } else if (argc > 3) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "too many parameters"); + + if (argc <= 0 && (!s1 || !s2 || !input)) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing parameters"); + + if (grub_strlen (s1) != grub_strlen (s2)) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "set sizes did not match"); + + /* Translate input into output buffer. */ + + output = grub_malloc (grub_strlen (input) + 1); + if (! output) + return grub_errno; + + for (i = 0; input[i]; i++) { + if ((p = grub_strchr (s1, input[i])) != NULL) + output[i] = s2[p - s1]; + else + output[i] = input[i]; + } + output[i] = '\0'; + + if (ctxt->state[0].set) + grub_env_set (var, output); + else + grub_printf ("%s\n", output); + + grub_free (output); + return GRUB_ERR_NONE; +} + +static grub_extcmd_t cmd; + +GRUB_MOD_INIT(tr) +{ + cmd = grub_register_extcmd ("tr", grub_cmd_tr, 0, N_("[OPTIONS] [SET1] [SET2] [STRING]"), + N_("Translate SET1 characters to SET2 in STRING."), options); +} + +GRUB_MOD_FINI(tr) +{ + grub_unregister_extcmd (cmd); +} === added file 'tests/grub_cmd_tr.in' --- tests/grub_cmd_tr.in 1970-01-01 00:00:00 +0000 +++ tests/grub_cmd_tr.in 2010-10-29 07:52:06 +0000 @@ -0,0 +1,62 @@ +#! /bin/bash -e + +# Run GRUB script in a Qemu instance +# 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 . + +# +# Translating a string argument +# +cmd='tr 12345 abcde a1b2c3d4e5' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != aabbccddee; then echo "error: $cmd [$v]" >&2; exit 1; fi + +cmd='tr -U abcdABCD' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != ABCDABCD; then echo "error: $cmd [$v]" >&2; exit 1; fi + +cmd='tr -D ABCDabcd' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != abcdabcd; then echo "error: $cmd [$v]" >&2; exit 1; fi + +# +# Translating a variable value +# +cmd='foo=12345678; tr -s foo 1234 abcd; echo $foo' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != abcd5678; then echo "error: $cmd [$v]" >&2; exit 1; fi + +cmd='foo=abcdEFGH; tr -U -s foo; echo $foo' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != ABCDEFGH; then echo "error: $cmd [$v]" >&2; exit 1; fi + +cmd='foo=abcdEFGH; tr -D -s foo; echo $foo' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != abcdefgh; then echo "error: $cmd [$v]" >&2; exit 1; fi + +# +# Setting a variable from string argument +# +cmd='foo=12345678; tr -s foo 1234 abcd a1b2c3d4e5; echo $foo' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != aabbccdde5; then echo "error: $cmd [$v]" >&2; exit 1; fi + +cmd='foo=abcdEFGH; tr -U -s foo xyz; echo $foo' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != XYZ; then echo "error: $cmd [$v]" >&2; exit 1; fi + +cmd='foo=abcdEFGH; tr -D -s foo XYZ; echo $foo' +v=`echo "$cmd" | @builddir@/grub-shell` +if test "$v" != xyz; then echo "error: $cmd [$v]" >&2; exit 1; fi # Begin bundle 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 LP895LWmag+JAlKaTH/F3JFOFCQ0OQ/kQA==