# 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==