summaryrefslogtreecommitdiffstats
path: root/grub-core/script/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'grub-core/script/main.c')
-rw-r--r--grub-core/script/main.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/grub-core/script/main.c b/grub-core/script/main.c
new file mode 100644
index 0000000..854a25a
--- /dev/null
+++ b/grub-core/script/main.c
@@ -0,0 +1,98 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/dl.h>
+#include <grub/i18n.h>
+#include <grub/parser.h>
+#include <grub/script_sh.h>
+
+grub_err_t
+grub_normal_parse_line (char *line,
+ grub_reader_getline_t getline, void *getline_data)
+{
+ struct grub_script *parsed_script;
+
+ /* Parse the script. */
+ parsed_script = grub_script_parse (line, getline, getline_data);
+
+ if (parsed_script)
+ {
+ /* Execute the command(s). */
+ grub_script_execute (parsed_script);
+
+ /* The parsed script was executed, throw it away. */
+ grub_script_unref (parsed_script);
+ }
+
+ return grub_errno;
+}
+
+static grub_command_t cmd_break;
+static grub_command_t cmd_continue;
+static grub_command_t cmd_shift;
+static grub_command_t cmd_setparams;
+static grub_command_t cmd_return;
+
+void
+grub_script_init (void)
+{
+ cmd_break = grub_register_command ("break", grub_script_break,
+ N_("[NUM]"), N_("Exit from loops"));
+ cmd_continue = grub_register_command ("continue", grub_script_break,
+ N_("[NUM]"), N_("Continue loops"));
+ cmd_shift = grub_register_command ("shift", grub_script_shift,
+ N_("[NUM]"),
+ /* TRANSLATORS: Positional arguments are
+ arguments $0, $1, $2, ... */
+ N_("Shift positional parameters."));
+ cmd_setparams = grub_register_command ("setparams", grub_script_setparams,
+ N_("[VALUE]..."),
+ N_("Set positional parameters."));
+ cmd_return = grub_register_command ("return", grub_script_return,
+ N_("[NUM]"),
+ /* TRANSLATORS: It's a command description
+ and "Return" is a verb, not a noun. The
+ command in question is "return" and
+ has exactly the same semanics as bash
+ equivalent. */
+ N_("Return from a function."));
+}
+
+void
+grub_script_fini (void)
+{
+ if (cmd_break)
+ grub_unregister_command (cmd_break);
+ cmd_break = 0;
+
+ if (cmd_continue)
+ grub_unregister_command (cmd_continue);
+ cmd_continue = 0;
+
+ if (cmd_shift)
+ grub_unregister_command (cmd_shift);
+ cmd_shift = 0;
+
+ if (cmd_setparams)
+ grub_unregister_command (cmd_setparams);
+ cmd_setparams = 0;
+
+ if (cmd_return)
+ grub_unregister_command (cmd_return);
+ cmd_return = 0;
+}