#include <errno.h>
#include <functional>
#include <string>
#include <vector>
#include <map>
class PscArgp {
public :
PscArgp( ) ;
~PscArgp( ) ;
typedef std:: function < void ( std:: string arg) > Callback;
void setName( std:: string const & name) ;
void setEmail( std:: string const & email) ;
void addOption( std:: string name, std:: string help, Callback f, int key, std:: string arg = "" ) ;
void addOptionRequired( std:: string name, std:: string help, Callback f, int key, std:: string arg = "" ) ;
void addOptionHeader( std:: string header) ;
void parse( int argc, char * argv[ ] ) ;
private :
void add( std:: string name, std:: string help, int key, std:: string arg, int flags, Callback f) ;
error_t parser( int key, char * arg, struct argp_state * state) ;
std:: vector < struct argp_option> options;
std:: map < int , Callback> callbacks;
} ;
#include <vector>
#include <string>
#include <argp.h>
PscArgp:: PscArgp ( ) {
}
PscArgp:: ~PscArgp( ) {
}
//extern "C" {
error_t PscArgp:: parser ( int key, char * arg, struct argp_state * state) {
Callback f = callbacks.find ( key) - > second;
f( arg) ;
return 0 ;
}
//}
using std:: placeholders :: _1;
using std:: placeholders :: _2;
using std:: placeholders :: _3;
void PscArgp:: parse ( int argc, char * argv[ ] ) {
std:: function < error_t ( int , char * , struct argp_state* ) > f = std:: bind ( & PscArgp:: parser , this , _1, _2, _3) ;
struct argp argp_parser;
argp_parser.options = options.data ( ) ;
argp_parser.parser = f;
//argp_parser.args_doc =
//argp_parser.doc =
//argp_parser.children =
//argp_parse(&argp_parser, argc, argv, 0, 0, 0);
}
void PscArgp:: setName ( std:: string const & name) {
argp_program_version = name.c_str ( ) ;
}
void PscArgp:: setEmail ( std:: string const & email) {
argp_program_bug_address = email.c_str ( ) ;
}
void PscArgp:: add ( std:: string name, std:: string help, int key, std:: string arg, int flags, Callback f) {
struct argp_option opt = { 0 } ;
opt.key = key;
opt.flags = flags;
if ( ! name.empty ( ) ) opt.name = name.c_str ( ) ;
if ( ! help.empty ( ) ) opt.doc = help.c_str ( ) ;
options.push_back ( opt) ;
callbacks.insert ( std:: pair < int , Callback> ( key, f) ) ;
}
void PscArgp:: addOption ( std:: string name, std:: string help, Callback f, int key, std:: string arg) {
add( name, help, key, arg, OPTION_ARG_OPTIONAL, f) ;
}
void PscArgp:: addOptionHeader ( std:: string header) {
add( "" , header, 0 , "" , 0 , NULL ) ;
}
void PscArgp:: addOptionRequired ( std:: string name, std:: string help, Callback f, int key, std:: string arg) {
add( name, help, key, arg, 0 , f) ;
}
#include <iostream>
struct config {
int cpu;
} config;
void parseCpu( std:: string const & arg) {
std:: cout << "setting cpu: " << arg << std:: endl ;
config.cpu = 1 ;
}
int main( int argc, char * argv[ ] )
{
PscArgp program;
program.setName ( "MyWorld" ) ;
program.setEmail ( "user@doma.cx" ) ;
std:: function < void ( std:: string ) > f = parseCpu;
//program.addOption("compile", "Do something with your object", 'c', "file");
program.addOptionRequired ( "cpu" , "Specific the cpu to run on" , parseCpu, 'u' , "cpu" ) ;
program.parse ( argc, argv) ;
}
I2luY2x1ZGUgPGVycm5vLmg+CgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtYXA+CgpjbGFzcyBQc2NBcmdwIHsKCXB1YmxpYzoKCQlQc2NBcmdwKCk7CgkJflBzY0FyZ3AoKTsKCgkJdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgYXJnKT4gQ2FsbGJhY2s7CgoJCXZvaWQgc2V0TmFtZShzdGQ6OnN0cmluZyBjb25zdCAmIG5hbWUpOwoJCXZvaWQgc2V0RW1haWwoc3RkOjpzdHJpbmcgY29uc3QgJiBlbWFpbCk7CgkJdm9pZCBhZGRPcHRpb24oc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaGVscCwgQ2FsbGJhY2sgZiwgaW50IGtleSwgc3RkOjpzdHJpbmcgYXJnID0gIiIpOwoJCXZvaWQgYWRkT3B0aW9uUmVxdWlyZWQoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaGVscCwgQ2FsbGJhY2sgZiwgaW50IGtleSwgc3RkOjpzdHJpbmcgYXJnID0gIiIpOwoJCXZvaWQgYWRkT3B0aW9uSGVhZGVyKHN0ZDo6c3RyaW5nIGhlYWRlcik7CgkJdm9pZCBwYXJzZShpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSk7CgkKCXByaXZhdGU6CgkJdm9pZCBhZGQoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaGVscCwgaW50IGtleSwgc3RkOjpzdHJpbmcgYXJnLCBpbnQgZmxhZ3MsIENhbGxiYWNrIGYpOwoJCWVycm9yX3QgcGFyc2VyKGludCBrZXksIGNoYXIgKiBhcmcsIHN0cnVjdCBhcmdwX3N0YXRlICogc3RhdGUpOwoJCXN0ZDo6dmVjdG9yPHN0cnVjdCBhcmdwX29wdGlvbj4gb3B0aW9uczsKCQlzdGQ6Om1hcDxpbnQsIENhbGxiYWNrPiBjYWxsYmFja3M7CQkKfTsKCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxhcmdwLmg+CgpQc2NBcmdwOjpQc2NBcmdwKCkgewp9CgpQc2NBcmdwOjp+UHNjQXJncCgpIHsKfQoKLy9leHRlcm4gIkMiIHsKZXJyb3JfdCBQc2NBcmdwOjpwYXJzZXIoaW50IGtleSwgY2hhciAqIGFyZywgc3RydWN0IGFyZ3Bfc3RhdGUgKiBzdGF0ZSkgewoJQ2FsbGJhY2sgZiA9IGNhbGxiYWNrcy5maW5kKGtleSktPnNlY29uZDsKCWYoYXJnKTsKCXJldHVybiAwOwp9Ci8vfQp1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzE7CnVzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMjsKdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8zOwp2b2lkIFBzY0FyZ3A6OnBhcnNlKGludCBhcmdjLCBjaGFyICogYXJndltdKSB7CglzdGQ6OmZ1bmN0aW9uPGVycm9yX3QgKGludCwgY2hhciosIHN0cnVjdCBhcmdwX3N0YXRlKik+IGYgPSBzdGQ6OmJpbmQoJlBzY0FyZ3A6OnBhcnNlciwgdGhpcywgXzEsIF8yLCBfMyk7CglzdHJ1Y3QgYXJncCBhcmdwX3BhcnNlcjsKCWFyZ3BfcGFyc2VyLm9wdGlvbnMgPSBvcHRpb25zLmRhdGEoKTsKCWFyZ3BfcGFyc2VyLnBhcnNlciA9IGY7CgkvL2FyZ3BfcGFyc2VyLmFyZ3NfZG9jID0gCgkvL2FyZ3BfcGFyc2VyLmRvYyA9IAoJLy9hcmdwX3BhcnNlci5jaGlsZHJlbiA9IAoKCS8vYXJncF9wYXJzZSgmYXJncF9wYXJzZXIsIGFyZ2MsIGFyZ3YsIDAsIDAsIDApOwp9Cgp2b2lkIFBzY0FyZ3A6OnNldE5hbWUoc3RkOjpzdHJpbmcgY29uc3QgJiBuYW1lKSB7CglhcmdwX3Byb2dyYW1fdmVyc2lvbiA9IG5hbWUuY19zdHIoKTsKfQoKdm9pZCBQc2NBcmdwOjpzZXRFbWFpbChzdGQ6OnN0cmluZyBjb25zdCAmIGVtYWlsKSB7CglhcmdwX3Byb2dyYW1fYnVnX2FkZHJlc3MgPSBlbWFpbC5jX3N0cigpOwp9Cgp2b2lkIFBzY0FyZ3A6OmFkZChzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBoZWxwLCBpbnQga2V5LCBzdGQ6OnN0cmluZyBhcmcsIGludCBmbGFncywgQ2FsbGJhY2sgZikgewoJc3RydWN0IGFyZ3Bfb3B0aW9uIG9wdCA9IHswfTsKCW9wdC5rZXkgPSBrZXk7CglvcHQuZmxhZ3MgPSBmbGFnczsKCWlmICghbmFtZS5lbXB0eSgpKSBvcHQubmFtZSA9IG5hbWUuY19zdHIoKTsKCWlmICghaGVscC5lbXB0eSgpKSBvcHQuZG9jID0gaGVscC5jX3N0cigpOwoKCW9wdGlvbnMucHVzaF9iYWNrKG9wdCk7CgljYWxsYmFja3MuaW5zZXJ0KHN0ZDo6cGFpcjxpbnQsIENhbGxiYWNrPihrZXksIGYpKTsKfQoKdm9pZCBQc2NBcmdwOjphZGRPcHRpb24oc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaGVscCwgQ2FsbGJhY2sgZiwgaW50IGtleSwgc3RkOjpzdHJpbmcgYXJnKSB7CglhZGQobmFtZSwgaGVscCwga2V5LCBhcmcsIE9QVElPTl9BUkdfT1BUSU9OQUwsIGYpOwp9Cgp2b2lkIFBzY0FyZ3A6OmFkZE9wdGlvbkhlYWRlcihzdGQ6OnN0cmluZyBoZWFkZXIpIHsKCWFkZCgiIiwgaGVhZGVyLCAwLCAiIiwgMCwgTlVMTCk7Cn0KCnZvaWQgUHNjQXJncDo6YWRkT3B0aW9uUmVxdWlyZWQoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgaGVscCwgQ2FsbGJhY2sgZiwgaW50IGtleSwgc3RkOjpzdHJpbmcgYXJnKSB7CglhZGQobmFtZSwgaGVscCwga2V5LCBhcmcsIDAsIGYpOwp9CgojaW5jbHVkZSA8aW9zdHJlYW0+CnN0cnVjdCBjb25maWcgewoJaW50IGNwdTsKfSBjb25maWc7Cgp2b2lkIHBhcnNlQ3B1KHN0ZDo6c3RyaW5nIGNvbnN0ICYgYXJnKSB7CglzdGQ6OmNvdXQgPDwgInNldHRpbmcgY3B1OiAiIDw8IGFyZyA8PCBzdGQ6OmVuZGw7Cgljb25maWcuY3B1ID0gMTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJUHNjQXJncCBwcm9ncmFtOwoJcHJvZ3JhbS5zZXROYW1lKCJNeVdvcmxkIik7Cglwcm9ncmFtLnNldEVtYWlsKCJ1c2VyQGRvbWEuY3giKTsKCglzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcpPiBmID0gcGFyc2VDcHU7CgkvL3Byb2dyYW0uYWRkT3B0aW9uKCJjb21waWxlIiwgIkRvIHNvbWV0aGluZyB3aXRoIHlvdXIgb2JqZWN0IiwgJ2MnLCAiZmlsZSIpOwoJcHJvZ3JhbS5hZGRPcHRpb25SZXF1aXJlZCgiY3B1IiwgIlNwZWNpZmljIHRoZSBjcHUgdG8gcnVuIG9uIiwgcGFyc2VDcHUsICd1JywgImNwdSIpOwoJcHJvZ3JhbS5wYXJzZShhcmdjLCBhcmd2KTsKCn0KCg==