You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.4 KiB

/**
* @file args.h
* Parses command line arguments.
*
* This differs from the GNU/getopt way in that:
* - parameters cannot mixed "-e -f" is not the same as "-ef"
* - knowledge of the complete set of parameters is not required
* - this means you can handle args in multiple spots
* - it is more portable
*
* @author Ben Gardner
* @license GPL v2+
*/
#ifndef ARGS_H_INCLUDED
#define ARGS_H_INCLUDED
#include "base_types.h"
class Args
{
protected:
size_t m_count; //! number of command line arguments
char **m_values; //! pointer array to each argument
UINT8 *m_used; //! bit array with one flag per argument
public:
/**
* Initializes the argument library.
* Store the values and allocates enough memory for the 'used' flags.
* This keeps a reference to argv, so don't change it.
*
* @param argc number of command line parameter passed to main()
* @param argv pointer array to command line parameters
*/
Args(int argc, char **argv);
//! Standard destructor
~Args();
/**
* Checks to see if an arg w/o a value is present.
* Scans the args looking for an exact match.
*
* "-c" matches "-c", but not "-call" or "-ec"
*
* @param token The token string to match
*
* @return true/false -- Whether the argument was present
*/
bool Present(const char *token);
/**
* Calls Args::Params() with index 0
*
* @param token The token string to match
*
* @return nullptr or the pointer to the string
*/
const char *Param(const char *token);
/**
* Check for an arg with a value.
* Returns only the first match.
*
* Assuming the token "-c"...
* "-call" returns "all"
* "-c=all" returns "all"
* "-c", "all" returns "all"
* "-c=", "all" returns ""
*
* @param token the token string to match
* @param[in, out] index search start position, in case that something is
* found, it will get the succeeding position number
* assigned
*
* @return nullptr or the pointer to the string
*/
const char *Params(const char *token, size_t &index);
/**
* Marks an argument as being used.
*
* @param idx The index of the argument
*/
void SetUsed(size_t idx);
/**
* Gets whether an argument has been used, by index.
*
* @param idx The index of the argument
*/
bool GetUsed(size_t idx);
/**
* This function retrieves all unused parameters.
* You must set the index before the first call.
* Set the index to 1 to skip argv[0].
*
* @param idx Pointer to the index
*
* @return nullptr (done) or the pointer to the string
*/
const char *Unused(size_t &idx);
/**
* Takes text and splits it into arguments.
* args is an array of char pointers that will get populated.
* num_args is the maximum number of args split off.
* If there are more than num_args, the remaining text is ignored.
* Note that text is modified (zeroes are inserted)
*
* @param text the text to split (modified)
* @param[out] args array of pointers to be populated
* @param num_args number of items in input string
*
* @return The number of arguments parsed (always <= num_args)
*/
static size_t SplitLine(char *text, char *args[], size_t num_args);
};
#endif /* ARGS_H_INCLUDED */