📄 cmdl.h
字号:
/***************************************************************
File: CMDL.H Copyright 1992 by Dlugosz Software
header file for the CMDL package for command-line parsing
This version may be used freely, with attribution.
***************************************************************/
class cmdlscan; //used internally
class cmdl {
public:
// need to put the type first
enum errval { OK, NotFound, Duplicate, NoValue, BadValue }; //more later
private:
// linked list management
static cmdl* head;
static cmdl* last;
cmdl* next;
// parser helpers
static bool parse_switches (cmdlscan&, unsigned flags);
static bool parse_keywords (cmdlscan&, unsigned flags);
static cmdl* find_positional (unsigned flags);
static cmdl* find_switch (char);
static cmdl* find_switch (char*);
static cmdl* find_keyword (char);
static cmdl* find_keyword (char*);
protected:
// recognition
virtual char* getvalue (cmdlscan&);
bool prelude();
virtual bool scan (cmdlscan&) =0;
virtual void post_process (unsigned) {}
virtual void validate (unsigned fl);
union {
char cname;
const char* sname;
};
unsigned flags;
enum {charname=1024, noname= 2048, used=4096, valueoptional=8192};
const char* helpstring;
// constructor helpers
void linkin();
public:
// error output
static char* signon_string;
static void output (const char*);
static void output (char);
virtual void report_error();
virtual void output_name();
void foutput (const char*); //formatted output
// types
enum {keyword=1, caps=2, required=4, expand_file= 8, once= 16};
// constructors and destructor
cmdl (const char* name, const char* helpstring= 0, unsigned flags= 0);
cmdl (char name, const char* helpstring= 0, unsigned flags= 0);
~cmdl() {}
// use
enum parse_flags {plain=1};
static bool parseit (cmdlscan& s, unsigned fl);
static bool parseit (char*, unsigned flags=0);
static bool parseit (unsigned flags=0);
static void reset() { head= last= 0; }
static void signon (char* s) { signon_string= s; }
static void show_usage();
// misc
bool iskeyword() { return flags&keyword; }
bool ischar() { return flags&charname; }
bool hasvalue() { return (flags&used); }
static errval error;
static int count; //how many parameters were found
bool matchname (const char* s);
const char* get_helpstring() { return helpstring; }
// linked list traversal
static cmdl* get_head() { return head; }
cmdl* get_next() { return next; }
};
class cmdl_flag : public cmdl { // a boolean switch or flag
protected:
bool scan (cmdlscan&);
bool value;
void report_error();
public:
cmdl_flag (const char* name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {value= FALSE;}
cmdl_flag (char name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {value= FALSE;}
bool operator()() { return value; }
void set (bool val= TRUE) { value= val; }
void clear() { value= FALSE; }
};
class cmdl_string : public cmdl {
protected:
bool scan (cmdlscan&);
char* value;
void report_error();
public:
cmdl_string (const char* name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {value= 0;}
cmdl_string (char name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {value= 0;}
char* operator()() { return value; }
void set (char* val) { value= val; } //note: string not duplicated!
};
class cmdl_int : public cmdl {
protected:
bool scan (cmdlscan&);
int value;
void report_error();
public:
cmdl_int (const char* name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {value= 0;}
cmdl_int (char name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {value= 0;}
int operator()() { return value; }
void set (int val) { value= val; }
};
class cmdl_help : public cmdl { //special switch for invoking help
protected:
bool scan (cmdlscan&);
public:
cmdl_help (const char* name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {flags|=valueoptional;}
cmdl_help (char name, const char* helpstring= 0, unsigned flags= 0) : cmdl (name,helpstring,flags) {flags|=valueoptional;}
cmdl_help(); //simple form for -? ability
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -