/*
 * Code for setting up command line flags like `./u-boot --help`
 *
 * Copyright (c) 2011 The Chromium OS Authors.
 *
 * Licensed under the GPL-2 or later.
 */

#ifndef __SANDBOX_GETOPT_H
#define __SANDBOX_GETOPT_H

struct sandbox_state;

/*
 * Internal structure for storing details about the flag.
 * Most people should not have to dig around in this as
 * it only gets parsed by the core sandbox code.  End
 * consumer code should focus on the macros below and
 * the callback function.
 */
struct sandbox_cmdline_option {
	/* The long flag name: "help" for "--help" */
	const char *flag;
	/* The (optional) short flag name: "h" for "-h" */
	int flag_short;
	/* The help string shown to the user when processing --help */
	const char *help;
	/* Whether this flag takes an argument */
	int has_arg;
	/* Callback into the end consumer code with the option */
	int (*callback)(struct sandbox_state *state, const char *opt);
};

/*
 * Internal macro to expand the lower macros into the necessary
 * magic junk that makes this all work.
 */
#define _SANDBOX_CMDLINE_OPT(f, s, ha, h) \
	static struct sandbox_cmdline_option sandbox_cmdline_option_##f = { \
		.flag = #f, \
		.flag_short = s, \
		.help = h, \
		.has_arg = ha, \
		.callback = sandbox_cmdline_cb_##f, \
	}; \
	/* Ppointer to the struct in a special section for the linker script */ \
	static __attribute__((section(".u_boot_sandbox_getopt"), used)) \
		struct sandbox_cmdline_option \
			*sandbox_cmdline_option_##f##_ptr = \
			&sandbox_cmdline_option_##f

/**
 * Macros for end code to declare new command line flags.
 *
 * @param f   The long flag name e.g. help
 * @param ha  Does the flag have an argument e.g. 0/1
 * @param h   The help string displayed when showing --help
 *
 * This invocation:
 *   SANDBOX_CMDLINE_OPT(foo, 0, "The foo arg");
 * Will create a new flag named "--foo" (no short option) that takes
 * no argument.  If the user specifies "--foo", then the callback func
 * sandbox_cmdline_cb_foo() will automatically be called.
 */
#define SANDBOX_CMDLINE_OPT(f, ha, h) _SANDBOX_CMDLINE_OPT(f, 0, ha, h)
/*
 * Same as above, but @s is used to specify a short flag e.g.
 *   SANDBOX_CMDLINE_OPT(foo, 'f', 0, "The foo arg");
 */
#define SANDBOX_CMDLINE_OPT_SHORT(f, s, ha, h) _SANDBOX_CMDLINE_OPT(f, s, ha, h)

#endif
