| 1. Purpose 2. Supported 3. Headers 3.1. C++ header: argh.hh |
3.2. C header: argh.h 4. Copying 5. Requirements 6. Downloading |
#ifndef optrar_argh_hh
#define optrar_argh_hh
/* Copyright (C) 1992,2003 Bisqwit (http://iki.fi/bisqwit/) */
/*
* C++ USAGE EXAMPLE
*
#include <argh.hh>
int main(int argc, const char *const *argv)
{
vector<string> files;
string buildfn;
bool worst = false;
ParamHandler Argh;
Argh.AddLong("worst", 'w').SetBool().SetDesc("Least optimal.");
Argh.AddLong("help", 'h').SetBool().SetDesc("This help.");
Argh.AddLong("version", 'V').SetBool().SetDesc("Displays version information.");
Argh.AddLong("build", 'b').SetString().SetDesc("Builds the archive.", "<file>");
Argh.AddLong("make", 'b');
Argh.AddBool('k');
Argh.AddDesc('k', "This option does nothing.");
Argh.AddLong("idle", 500).SetDesc("This option does nothing.");
Argh.StartParse(argc, argv);
for(;;)
{
int c = Argh.GetParam();
if(c == -1)break;
switch(c)
{
case 'w': worst = Argh.GetBool(); break;
case 'V': printf("%s\n", VERSION); return 0;
case 'b': buildfn = Argh.GetString(); break;
case 'k': break; // -k
case 500: break; // --idle
case 'h':
printf(
"This is software\n"
"\nUsage: software [<option> [<...>]] <file> [<...>]\n"
"\nThis software does something for the files.\n"
"\nOptions:\n");
Argh.ListOptions();
printf("\nNo warranty whatsoever.\n");
return 0;
default:
files.push_back(Argh.GetString());
}
}
if(!Argh.ok())return -1;
if(!files.size())
{
fprintf(stderr, "Error: At least one file must be specified.\n");
return -1;
}
...
}
*/
/* The header begins here. */
#include <string>
class ParamHandler
{
private:
/* No copying */
void operator=(const ParamHandler &);
ParamHandler (const ParamHandler &);
class Reference;
public:
typedef long keytype;
ParamHandler();
virtual ~ParamHandler();
virtual void PrintOpt(unsigned space, const std::string &opts, const std::string &desc);
Reference AddLong(const std::string &longname, keytype alias);
Reference AddBool(keytype c);
Reference AddInt(keytype c, int min, int max);
Reference AddFloat(keytype c, double min, double max);
Reference AddString(keytype c, unsigned min=1, unsigned max=std::string::npos);
Reference AddDesc(keytype c, const std::string &s, const std::string ¶m="");
// Support for many conventions
void StartParse(int ac, const char *const *av, int firstarg=1);
void StartParse(int ac, const char **av, int firstarg=1);
void StartParse(int ac, char **av, int firstarg=1);
void StartParse(int ac, char *const*av, int firstarg=1);
const std::string ProgName() const { return A0; }
/* --not-x, --no-x, --without-x and --with-x are recognized.
* Therefore you should use GetBool().
*/
inline const bool GetBool() const { return polarity; }
inline const int GetInt() const { return intparm; }
inline const double GetFloat() const { return doubleparm; }
inline const std::string &GetString() const { return param; }
inline const bool ok() const { return !error; }
keytype GetParam();
void ListOptions();
private:
static inline keytype char2opt(char c1, char c2) { return (unsigned char)c1 + (unsigned char)c2 * 256; }
static inline keytype char3opt(char c1, char c2, char c3) { return (unsigned char)c1 + 256 * char2opt(c2, c3); }
void ErrorIllegalOption(keytype key);
void ErrorNeedsArg(keytype key);
void ErrorNeedsArg(const std::string &longo);
void ErrorNeedNoArg(const std::string &longo);
void InternalError(keytype key, const char *s);
void ErrorOutOfRange(const std::string ¶m);
void ErrorUnknownOption(const char *s, bool negafail);
public:
/* argh_atypemap needs this and I don't know how to make it friend. */
class ArgInfo { public: char type; int min,max;unsigned maxl;double fmin,fmax; };
private:
class argh_aliasmap *aliases;
class argh_descsmap *descs;
class argh_atypemap *argtypes;
class Reference
{
ParamHandler *par;
keytype key;
public:
Reference(ParamHandler *p, keytype k) : par(p), key(k) { }
Reference &SetBool();
Reference &SetInt(int min, int max);
Reference &SetFloat(double min, double max);
Reference &SetString(unsigned min=1, unsigned max=std::string::npos);
Reference &SetDesc(const std::string &s, const std::string ¶m="");
};
Reference MakeRef(keytype key);
int ParseError();
int ShortOpt(keytype key, const char *s);
private:
int argc; const char *const *argv;
const char *A0;
/* parser volatile */
int argpos; bool opts; std::string longo, longobuf; std::string param;
const char *shortpointer; bool error, polarity; int intparm; double doubleparm;
};
#endif
#ifndef optrar_argh_h
#define optrar_argh_h
/* Copyright (C) 1992,2003 Bisqwit (http://iki.fi/bisqwit/) */
#ifdef __cplusplus
extern "C" {
#endif
extern void argh_init(void);
extern void argh_done(void);
extern void argh_add_long(const char *longname, int alias);
extern void argh_add_bool(int alias);
extern void argh_add_int(int c, int min, int max);
extern void argh_add_float(int c, double min, double max);
extern void argh_add_string(int c, unsigned minlen, unsigned maxlen);
extern void argh_add_desc(int c, const char *s, const char *optparam);
extern void argh_start_parse(int argc, const char *const *argv);
extern int argh_get_bool(void);
extern int argh_get_int(void);
extern double argh_get_float(void);
extern int argh_ok(void);
extern int argh_get_param(void);
extern void argh_list_options(void);
/* Note: This pointer is only valid until next argh_get_param() call */
/* Attention: Do not try to free() it. */
extern const char *argh_get_string(void);
#ifdef __cplusplus
}
#endif
/* C language usage example:
static int stereo=0;
static int Rate =43200;
static char *host = NULL;
static void PrintVersionInfo(void)
{
printf("erec - polydriving recording server v"VERSION" (C) 1992,2000 Bisqwit\n");
}
#include <argh.h>
int main(int argc, const char *const *argv)
{
int Heelp = 0;
argh_init();
argh_add_long("stereo", '2'); argh_add_bool('2'); argh_add_desc('2', "Specifies stereo sound. Default is mono.", NULL);
argh_add_long("mono", 'm'); argh_add_bool('m'); argh_add_desc('m', "Redundant. It's here for esd compatibility.", NULL);
argh_add_long("rate", 'r'); argh_add_int('r',18,999999); argh_add_desc('r', "Specifies recording rate. 43200 is default.", "<num>");
argh_add_long("device", 'd'); argh_add_string('d',1,1023); argh_add_desc('d', "Specify device.", "<file>");
argh_add_long("help", 'h'); argh_add_bool('h'); argh_add_desc('h', "Help", NULL);
argh_add_long("version",'V'); argh_add_bool('V'); argh_add_desc('V', "Version information", NULL);
argh_start_parse(argc, argv);
for(;;)
{
int c = argh_get_param();
if(c == -1)break;
switch(c)
{
case 'V':
PrintVersionInfo();
return 0;
case 'h':
Heelp = 1;
break;
case '2':
if(argh_get_bool())++stereo;else stereo=0;
break;
case 'm':
if(argh_get_bool())stereo = 0;else ++stereo;
break;
case 'r':
Rate = argh_get_int();
break;
case 'd':
strncpy(Device, argh_get_string(), sizeof Device);
Device[sizeof(Device)-1] = 0;
break;
default:
{
const char *s = argh_get_string();
host = (char *)malloc(strlen(s)+1);
strcpy(host, s);
}
}
}
if(!host)host = (char *)"10.104.2.2";
if(!argh_ok())return -1;
if(Heelp)
{
PrintVersionInfo();
printf(
"\nAllows multiple applications request recorded data"
"\nat the same time with different stream attributes.\n");
printf(
"Usage: erec [<options> [<...>]] [<host> | none]\n"
"Options:\n");
argh_list_options();
printf("\n"
"If <host> is other than none, the output will be sent with esdcat.\n");
return 0;
}
...
}
*/
#endif
Generated from
progdesc.php (last updated: Sat, 25 Jan 2003 16:52:14 +0200)
with docmaker.php (last updated: Thu, 13 Feb 2003 15:11:29 +0200)
at Sat, 27 Sep 2003 16:17:09 +0300