[U-Boot] [RFC PATCH 3/3] sandbox: WIP: add basic command line parsing
Simon Glass
sjg at chromium.org
Wed Oct 26 18:54:39 CEST 2011
This adds simple command-line parssing to sandbox. The idea is that it
sets up the state with options provided, and this state can then be
queried as needed later.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
arch/sandbox/cpu/Makefile | 2 +-
arch/sandbox/cpu/parse.c | 67 +++++++++++++++++++++++++++++++++++++++++++++
arch/sandbox/cpu/parse.h | 38 +++++++++++++++++++++++++
arch/sandbox/cpu/start.c | 33 ++++++++++++++++++++++
4 files changed, 139 insertions(+), 1 deletions(-)
create mode 100644 arch/sandbox/cpu/parse.c
create mode 100644 arch/sandbox/cpu/parse.h
diff --git a/arch/sandbox/cpu/Makefile b/arch/sandbox/cpu/Makefile
index e5e860b..783a2c8 100644
--- a/arch/sandbox/cpu/Makefile
+++ b/arch/sandbox/cpu/Makefile
@@ -30,7 +30,7 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(CPU).o
-COBJS := cpu.o start.o os.o
+COBJS := cpu.o os.o parse.o start.o
SRCS := $(COBJS:.o=.c)
OBJS := $(addprefix $(obj),$(COBJS))
diff --git a/arch/sandbox/cpu/parse.c b/arch/sandbox/cpu/parse.c
new file mode 100644
index 0000000..38426fb
--- /dev/null
+++ b/arch/sandbox/cpu/parse.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program 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 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <getopt.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <asm/arch/state.h>
+
+#include "parse.h"
+
+static struct option long_options[] = {
+ {"command", required_argument, NULL, 'c'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}
+};
+
+void usage(void)
+{
+ fprintf(stderr, "u-boot, "
+ "a command line test interface to U-Boot\n\n"
+ "usage:\tu-boot [-ch]\n"
+ "Options:\n"
+ "\t-h\tDisplay help\n"
+ "\t-c <command>\tExecute U-Boot command\n"
+ );
+}
+
+int parse_args(struct sandbox_state *state, int argc, char *argv[])
+{
+ int c;
+
+ while ((c = getopt_long (argc, argv, "c:h",
+ long_options, NULL)) != EOF) {
+ switch (c) {
+ case 'c':
+ state->cmd = optarg;
+ break;
+ case 'h':
+ usage();
+ return 1;
+ default: /* '?' */
+ fprintf(stderr, "Try `--help' for more information."
+ "\n");
+ return -1;
+ }
+ }
+ return 0;
+}
diff --git a/arch/sandbox/cpu/parse.h b/arch/sandbox/cpu/parse.h
new file mode 100644
index 0000000..08e5ceb
--- /dev/null
+++ b/arch/sandbox/cpu/parse.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program 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 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __SANDBOX_PARSE_H
+#define __SANDBOX_PARSE_H
+struct sandbox_state;
+
+/**
+ * Parse arguments and update sandbox state.
+ *
+ * @param state Sandbox state to update
+ * @param argc Argument count
+ * @param argv Argument vector
+ * @return 0 if ok, and program should continue;
+ * 1 if ok, but program should stop;
+ * -1 on error: program should terminate.
+ */
+int parse_args(struct sandbox_state *state, int argc, char *argv[]);
+
+#endif
diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
index 685793e..a13e9d0 100644
--- a/arch/sandbox/cpu/start.c
+++ b/arch/sandbox/cpu/start.c
@@ -20,14 +20,47 @@
*/
#include <common.h>
+#include <asm/arch/state.h>
+
+#include "parse.h"
int main(int argc, char *argv[])
{
+ struct sandbox_state *state = NULL;
+ int err;
+
+ err = state_init();
+ if (!err) {
+ state = state_get_current();
+ err = parse_args(state, argc, argv);
+ }
+ if (err < 0)
+ return 1;
+ else if (err) /* success return, but nothing to do */
+ return 0;
+ assert(state);
+
/*
* Do pre- and post-relocation init, then start up U-Boot. This will
* never return.
*/
board_init_f(0);
+ /* TODO: this code is not reached! */
+
+ /* Execute command if required */
+ if (state->cmd) {
+#ifdef CONFIG_SYS_HUSH_PARSER
+ run_command(state->cmd, 0);
+#else
+ parse_string_outer(state->cmd, FLAG_PARSE_SEMICOLON |
+ FLAG_EXIT_FROM_LOOP);
+#endif
+ } else {
+ for (;;)
+ main_loop();
+ }
+ printf("U-Boot exited with state %d\n", state->exit_type);
+
return 0;
}
--
1.7.3.1
More information about the U-Boot
mailing list