123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- #ifndef _ANYOPTION_H
- #define _ANYOPTION_H
- #define _CRT_SECURE_NO_WARNINGS /* Microsoft C/C++ Compiler: Disable C4996 \
- warnings for security-enhanced CRT \
- functions */
- #include <cstring>
- #include <fstream>
- #include <iostream>
- #include <stdlib.h>
- #include <string>
- #define COMMON_OPT 1
- #define COMMAND_OPT 2
- #define FILE_OPT 3
- #define COMMON_FLAG 4
- #define COMMAND_FLAG 5
- #define FILE_FLAG 6
- #define COMMAND_OPTION_TYPE 1
- #define COMMAND_FLAG_TYPE 2
- #define FILE_OPTION_TYPE 3
- #define FILE_FLAG_TYPE 4
- #define UNKNOWN_TYPE 5
- #define DEFAULT_MAXOPTS 10
- #define MAX_LONG_PREFIX_LENGTH 2
- #define DEFAULT_MAXUSAGE 3
- #define DEFAULT_MAXHELP 10
- #define TRUE_FLAG "true"
- using namespace std;
- class AnyOption {
- public: /* the public interface */
- AnyOption();
- explicit AnyOption(int maxoptions);
- explicit AnyOption(int maxoptions, int maxcharoptions);
- ~AnyOption();
- /*
- * following set methods specifies the
- * special characters and delimiters
- * if not set traditional defaults will be used
- */
- void setCommandPrefixChar(char _prefix); /* '-' in "-w" */
- void setCommandLongPrefix(const char *_prefix); /* '--' in "--width" */
- void setFileCommentChar(char _comment); /* '#' in shell scripts */
- void setFileDelimiterChar(char _delimiter); /* ':' in "width : 100" */
- /*
- * provide the input for the options
- * like argv[] for commnd line and the
- * option file name to use;
- */
- void useCommandArgs(int _argc, char **_argv);
- void useFiileName(const char *_filename);
- /*
- * turn off the POSIX style options
- * this means anything starting with a '-' or "--"
- * will be considered a valid option
- * which also means you cannot add a bunch of
- * POIX options chars together like "-lr" for "-l -r"
- *
- */
- void noPOSIX();
- /*
- * prints warning verbose if you set anything wrong
- */
- void setVerbose();
- /*
- * there are two types of options
- *
- * Option - has an associated value ( -w 100 )
- * Flag - no value, just a boolean flag ( -nogui )
- *
- * the options can be either a string ( GNU style )
- * or a character ( traditional POSIX style )
- * or both ( --width, -w )
- *
- * the options can be common to the command line and
- * the option file, or can belong only to either of
- * command line and option file
- *
- * following set methods, handle all the above
- * cases of options.
- */
- /* options command to command line and option file */
- void setOption(const char *opt_string);
- void setOption(char opt_char);
- void setOption(const char *opt_string, char opt_char);
- void setFlag(const char *opt_string);
- void setFlag(char opt_char);
- void setFlag(const char *opt_string, char opt_char);
- /* options read from command line only */
- void setCommandOption(const char *opt_string);
- void setCommandOption(char opt_char);
- void setCommandOption(const char *opt_string, char opt_char);
- void setCommandFlag(const char *opt_string);
- void setCommandFlag(char opt_char);
- void setCommandFlag(const char *opt_string, char opt_char);
- /* options read from an option file only */
- void setFileOption(const char *opt_string);
- void setFileOption(char opt_char);
- void setFileOption(const char *opt_string, char opt_char);
- void setFileFlag(const char *opt_string);
- void setFileFlag(char opt_char);
- void setFileFlag(const char *opt_string, char opt_char);
- /*
- * process the options, registered using
- * useCommandArgs() and useFileName();
- */
- void processOptions();
- void processCommandArgs();
- void processCommandArgs(int max_args);
- bool processFile();
- /*
- * process the specified options
- */
- void processCommandArgs(int _argc, char **_argv);
- void processCommandArgs(int _argc, char **_argv, int max_args);
- bool processFile(const char *_filename);
- /*
- * get the value of the options
- * will return NULL if no value is set
- */
- char *getValue(const char *_option);
- bool getFlag(const char *_option);
- char *getValue(char _optchar);
- bool getFlag(char _optchar);
- /*
- * Print Usage
- */
- void printUsage();
- void printAutoUsage();
- void addUsage(const char *line);
- void printHelp();
- /* print auto usage printing for unknown options or flag */
- void autoUsagePrint(bool flag);
- /*
- * get the argument count and arguments sans the options
- */
- int getArgc() const;
- char *getArgv(int index) const;
- bool hasOptions() const;
- private: /* the hidden data structure */
- int argc; /* command line arg count */
- char **argv; /* commnd line args */
- const char *filename; /* the option file */
- char *appname; /* the application name from argv[0] */
- int *new_argv; /* arguments sans options (index to argv) */
- int new_argc; /* argument count sans the options */
- int max_legal_args; /* ignore extra arguments */
- /* option strings storage + indexing */
- int max_options; /* maximum number of options */
- const char **options; /* storage */
- int *optiontype; /* type - common, command, file */
- int *optionindex; /* index into value storage */
- int option_counter; /* counter for added options */
- /* option chars storage + indexing */
- int max_char_options; /* maximum number options */
- char *optionchars; /* storage */
- int *optchartype; /* type - common, command, file */
- int *optcharindex; /* index into value storage */
- int optchar_counter; /* counter for added options */
- /* values */
- char **values; /* common value storage */
- int g_value_counter; /* globally updated value index LAME! */
- /* help and usage */
- const char **usage; /* usage */
- int max_usage_lines; /* max usage lines reserved */
- int usage_lines; /* number of usage lines */
- bool command_set; /* if argc/argv were provided */
- bool file_set; /* if a filename was provided */
- bool mem_allocated; /* if memory allocated in init() */
- bool posix_style; /* enables to turn off POSIX style options */
- bool verbose; /* silent|verbose */
- bool print_usage; /* usage verbose */
- bool print_help; /* help verbose */
- char opt_prefix_char; /* '-' in "-w" */
- char long_opt_prefix[MAX_LONG_PREFIX_LENGTH + 1]; /* '--' in "--width" */
- char file_delimiter_char; /* ':' in width : 100 */
- char file_comment_char; /* '#' in "#this is a comment" */
- char equalsign;
- char comment;
- char delimiter;
- char endofline;
- char whitespace;
- char nullterminate;
- bool set; // was static member
- bool once; // was static member
- bool hasoptions;
- bool autousage;
- private: /* the hidden utils */
- void init();
- void init(int maxopt, int maxcharopt);
- bool alloc();
- void allocValues(int index, size_t length);
- void cleanup();
- bool valueStoreOK();
- /* grow storage arrays as required */
- bool doubleOptStorage();
- bool doubleCharStorage();
- bool doubleUsageStorage();
- bool setValue(const char *option, char *value);
- bool setFlagOn(const char *option);
- bool setValue(char optchar, char *value);
- bool setFlagOn(char optchar);
- void addOption(const char *option, int type);
- void addOption(char optchar, int type);
- void addOptionError(const char *opt) const;
- void addOptionError(char opt) const;
- bool findFlag(char *value);
- void addUsageError(const char *line);
- bool CommandSet() const;
- bool FileSet() const;
- bool POSIX() const;
- char parsePOSIX(char *arg);
- int parseGNU(char *arg);
- bool matchChar(char c);
- int matchOpt(char *opt);
- /* dot file methods */
- char *readFile();
- char *readFile(const char *fname);
- bool consumeFile(char *buffer);
- void processLine(char *theline, int length);
- char *chomp(char *str);
- void valuePairs(char *type, char *value);
- void justValue(char *value);
- void printVerbose(const char *msg) const;
- void printVerbose(char *msg) const;
- void printVerbose(char ch) const;
- void printVerbose() const;
- };
- #endif /* ! _ANYOPTION_H */
|