Skip to content
Snippets Groups Projects
getopt.h 2.25 KiB
Newer Older
  • Learn to ignore specific revisions
  • Simon Glass's avatar
    Simon Glass committed
    /*
     * 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 {
    
    Simon Glass's avatar
    Simon Glass committed
    	/* 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 = { \
    
    Simon Glass's avatar
    Simon Glass committed
    		.flag = #f, \
    		.flag_short = s, \
    		.help = h, \
    		.has_arg = ha, \
    
    		.callback = sandbox_cmdline_cb_##f, \
    
    Simon Glass's avatar
    Simon Glass committed
    	}; \
    	/* 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
    
    Simon Glass's avatar
    Simon Glass committed
    
    /**
     * 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");
    
    Simon Glass's avatar
    Simon Glass committed
     * 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.
    
    Simon Glass's avatar
    Simon Glass committed
     */
    
    #define SANDBOX_CMDLINE_OPT(f, ha, h) _SANDBOX_CMDLINE_OPT(f, 0, ha, h)
    
    Simon Glass's avatar
    Simon Glass committed
    /*
     * Same as above, but @s is used to specify a short flag e.g.
    
     *   SANDBOX_CMDLINE_OPT(foo, 'f', 0, "The foo arg");
    
    Simon Glass's avatar
    Simon Glass committed
     */
    
    #define SANDBOX_CMDLINE_OPT_SHORT(f, s, ha, h) _SANDBOX_CMDLINE_OPT(f, s, ha, h)
    
    Simon Glass's avatar
    Simon Glass committed
    
    #endif