Changeset 209:765619b7cbb2 in lemon-main for lemon/arg_parser.cc
- Timestamp:
- 07/13/08 20:51:02 (17 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
-
lemon/arg_parser.cc (modified) (22 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lemon/arg_parser.cc
r137 r209 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 5 * Copyright (C) 2003-2008 … … 39 39 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) 40 40 if(i->second.self_delete) 41 switch(i->second.type) {42 case BOOL:43 delete i->second.bool_p;44 break;45 case STRING:46 delete i->second.string_p;47 break;48 case DOUBLE:49 delete i->second.double_p;50 break;51 case INTEGER:52 delete i->second.int_p;53 break;54 case UNKNOWN:55 break;56 case FUNC:57 break;58 }59 } 60 41 switch(i->second.type) { 42 case BOOL: 43 delete i->second.bool_p; 44 break; 45 case STRING: 46 delete i->second.string_p; 47 break; 48 case DOUBLE: 49 delete i->second.double_p; 50 break; 51 case INTEGER: 52 delete i->second.int_p; 53 break; 54 case UNKNOWN: 55 break; 56 case FUNC: 57 break; 58 } 59 } 60 61 61 62 62 ArgParser &ArgParser::intOption(const std::string &name, 63 const std::string &help,64 int value, bool obl)63 const std::string &help, 64 int value, bool obl) 65 65 { 66 66 ParData p; … … 75 75 76 76 ArgParser &ArgParser::doubleOption(const std::string &name, 77 const std::string &help,78 double value, bool obl)77 const std::string &help, 78 double value, bool obl) 79 79 { 80 80 ParData p; … … 89 89 90 90 ArgParser &ArgParser::boolOption(const std::string &name, 91 const std::string &help,92 bool value, bool obl)91 const std::string &help, 92 bool value, bool obl) 93 93 { 94 94 ParData p; … … 103 103 104 104 ArgParser &ArgParser::stringOption(const std::string &name, 105 const std::string &help,106 std::string value, bool obl)105 const std::string &help, 106 std::string value, bool obl) 107 107 { 108 108 ParData p; … … 117 117 118 118 ArgParser &ArgParser::refOption(const std::string &name, 119 const std::string &help,120 int &ref, bool obl)119 const std::string &help, 120 int &ref, bool obl) 121 121 { 122 122 ParData p; … … 162 162 163 163 ArgParser &ArgParser::refOption(const std::string &name, 164 const std::string &help,165 std::string &ref, bool obl)164 const std::string &help, 165 std::string &ref, bool obl) 166 166 { 167 167 ParData p; … … 176 176 177 177 ArgParser &ArgParser::funcOption(const std::string &name, 178 const std::string &help,179 void (*func)(void *),void *data)178 const std::string &help, 179 void (*func)(void *),void *data) 180 180 { 181 181 ParData p; … … 191 191 192 192 ArgParser &ArgParser::optionGroup(const std::string &group, 193 const std::string &opt)193 const std::string &opt) 194 194 { 195 195 Opts::iterator i = _opts.find(opt); 196 196 LEMON_ASSERT(i!=_opts.end(), "Unknown option: '"+opt+"'"); 197 LEMON_ASSERT(!(i->second.ingroup), 197 LEMON_ASSERT(!(i->second.ingroup), 198 198 "Option already in option group: '"+opt+"'"); 199 199 GroupData &g=_groups[group]; … … 211 211 212 212 ArgParser &ArgParser::synonym(const std::string &syn, 213 const std::string &opt)213 const std::string &opt) 214 214 { 215 215 Opts::iterator o = _opts.find(opt); … … 234 234 235 235 ArgParser &ArgParser::other(const std::string &name, 236 const std::string &help)236 const std::string &help) 237 237 { 238 238 _others_help.push_back(OtherArg(name,help)); … … 245 245 if(i->second.has_syn) 246 246 for(Opts::iterator j=_opts.begin();j!=_opts.end();++j) 247 if(j->second.syn&&j->second.help==i->first)248 os << "|-" << j->first;247 if(j->second.syn&&j->second.help==i->first) 248 os << "|-" << j->first; 249 249 switch(i->second.type) { 250 250 case STRING: … … 271 271 } 272 272 } 273 273 274 274 void ArgParser::showHelp(Opts::iterator i) 275 275 { … … 284 284 if(i->help.size()==0) return; 285 285 std::cerr << " " << i->name << std::endl 286 << " " << i->help << std::endl;287 } 288 286 << " " << i->help << std::endl; 287 } 288 289 289 void ArgParser::shortHelp() 290 290 { … … 300 300 if(!g->second.mandatory) cstr << ']'; 301 301 if(pos+cstr.str().size()>LINE_LEN) { 302 std::cerr << std::endl << indent;303 pos=indent.size();302 std::cerr << std::endl << indent; 303 pos=indent.size(); 304 304 } 305 305 std::cerr << cstr.str(); … … 308 308 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) 309 309 if(!i->second.ingroup&&!i->second.syn) { 310 std::ostringstream cstr;311 cstr << ' ';312 if(!i->second.mandatory) cstr << '[';313 show(cstr,i);314 if(!i->second.mandatory) cstr << ']';315 if(pos+cstr.str().size()>LINE_LEN) {316 std::cerr << std::endl << indent;317 pos=indent.size();318 }319 std::cerr << cstr.str();320 pos+=cstr.str().size();310 std::ostringstream cstr; 311 cstr << ' '; 312 if(!i->second.mandatory) cstr << '['; 313 show(cstr,i); 314 if(!i->second.mandatory) cstr << ']'; 315 if(pos+cstr.str().size()>LINE_LEN) { 316 std::cerr << std::endl << indent; 317 pos=indent.size(); 318 } 319 std::cerr << cstr.str(); 320 pos+=cstr.str().size(); 321 321 } 322 322 for(std::vector<OtherArg>::iterator i=_others_help.begin(); 323 i!=_others_help.end();++i)323 i!=_others_help.end();++i) 324 324 { 325 std::ostringstream cstr;326 cstr << ' ' << i->name;327 328 if(pos+cstr.str().size()>LINE_LEN) {329 std::cerr << std::endl << indent;330 pos=indent.size();331 }332 std::cerr << cstr.str();333 pos+=cstr.str().size();325 std::ostringstream cstr; 326 cstr << ' ' << i->name; 327 328 if(pos+cstr.str().size()>LINE_LEN) { 329 std::cerr << std::endl << indent; 330 pos=indent.size(); 331 } 332 std::cerr << cstr.str(); 333 pos+=cstr.str().size(); 334 334 } 335 335 std::cerr << std::endl; 336 336 } 337 337 338 338 void ArgParser::showHelp() 339 339 { … … 341 341 std::cerr << "Where:\n"; 342 342 for(std::vector<OtherArg>::iterator i=_others_help.begin(); 343 i!=_others_help.end();++i) showHelp(i);343 i!=_others_help.end();++i) showHelp(i); 344 344 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i); 345 345 exit(1); 346 346 } 347 348 349 void ArgParser::unknownOpt(std::string arg) 347 348 349 void ArgParser::unknownOpt(std::string arg) 350 350 { 351 351 std::cerr << "\nUnknown option: " << arg << "\n"; … … 354 354 exit(1); 355 355 } 356 357 void ArgParser::requiresValue(std::string arg, OptType t) 356 357 void ArgParser::requiresValue(std::string arg, OptType t) 358 358 { 359 359 std::cerr << "Argument '" << arg << "' requires a"; … … 374 374 showHelp(); 375 375 } 376 376 377 377 378 378 void ArgParser::checkMandatories() … … 380 380 bool ok=true; 381 381 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) 382 if(i->second.mandatory&&!i->second.set) 383 {384 if(ok)385 std::cerr << _command_name 386 << ": The following mandatory arguments are missing.\n";387 ok=false;388 showHelp(i);389 }382 if(i->second.mandatory&&!i->second.set) 383 { 384 if(ok) 385 std::cerr << _command_name 386 << ": The following mandatory arguments are missing.\n"; 387 ok=false; 388 showHelp(i); 389 } 390 390 for(Groups::iterator i=_groups.begin();i!=_groups.end();++i) 391 391 if(i->second.mandatory||i->second.only_one) 392 {393 int set=0;394 for(GroupData::Opts::iterator o=i->second.opts.begin();395 o!=i->second.opts.end();++o)396 if(_opts.find(*o)->second.set) ++set;397 if(i->second.mandatory&&!set) {398 std::cerr << _command_name 399 << ": At least one of the following arguments is mandatory.\n";400 ok=false;401 for(GroupData::Opts::iterator o=i->second.opts.begin();402 o!=i->second.opts.end();++o)403 showHelp(_opts.find(*o));404 }405 if(i->second.only_one&&set>1) {406 std::cerr << _command_name 407 << ": At most one of the following arguments can be given.\n";408 ok=false;409 for(GroupData::Opts::iterator o=i->second.opts.begin();410 o!=i->second.opts.end();++o)411 showHelp(_opts.find(*o));412 }413 }392 { 393 int set=0; 394 for(GroupData::Opts::iterator o=i->second.opts.begin(); 395 o!=i->second.opts.end();++o) 396 if(_opts.find(*o)->second.set) ++set; 397 if(i->second.mandatory&&!set) { 398 std::cerr << _command_name 399 << ": At least one of the following arguments is mandatory.\n"; 400 ok=false; 401 for(GroupData::Opts::iterator o=i->second.opts.begin(); 402 o!=i->second.opts.end();++o) 403 showHelp(_opts.find(*o)); 404 } 405 if(i->second.only_one&&set>1) { 406 std::cerr << _command_name 407 << ": At most one of the following arguments can be given.\n"; 408 ok=false; 409 for(GroupData::Opts::iterator o=i->second.opts.begin(); 410 o!=i->second.opts.end();++o) 411 showHelp(_opts.find(*o)); 412 } 413 } 414 414 if(!ok) { 415 415 std::cerr << "\nType '" << _command_name << 416 " --help' to obtain a short summary on the usage.\n\n";416 " --help' to obtain a short summary on the usage.\n\n"; 417 417 exit(1); 418 418 } … … 424 424 std::string arg(_argv[ar]); 425 425 if (arg[0] != '-' || arg.size() == 1) { 426 _file_args.push_back(arg);426 _file_args.push_back(arg); 427 427 } 428 428 else { 429 Opts::iterator i = _opts.find(arg.substr(1));430 if(i==_opts.end()) unknownOpt(arg);431 else {432 if(i->second.syn) i=_opts.find(i->second.help);433 ParData &p(i->second);434 if (p.type==BOOL) *p.bool_p=true;435 else if (p.type==FUNC) p.func_p.p(p.func_p.data);436 else if(++ar==_argc) requiresValue(arg, p.type);437 else {438 std::string val(_argv[ar]);439 std::istringstream vals(val);440 switch(p.type) {441 case STRING:442 *p.string_p=val;443 break;444 case INTEGER:445 vals >> *p.int_p;446 break;447 case DOUBLE:448 vals >> *p.double_p;449 break;450 default:451 break;452 }453 if(p.type!=STRING&&(!vals||!vals.eof()))454 requiresValue(arg, p.type);455 }456 p.set = true;457 }429 Opts::iterator i = _opts.find(arg.substr(1)); 430 if(i==_opts.end()) unknownOpt(arg); 431 else { 432 if(i->second.syn) i=_opts.find(i->second.help); 433 ParData &p(i->second); 434 if (p.type==BOOL) *p.bool_p=true; 435 else if (p.type==FUNC) p.func_p.p(p.func_p.data); 436 else if(++ar==_argc) requiresValue(arg, p.type); 437 else { 438 std::string val(_argv[ar]); 439 std::istringstream vals(val); 440 switch(p.type) { 441 case STRING: 442 *p.string_p=val; 443 break; 444 case INTEGER: 445 vals >> *p.int_p; 446 break; 447 case DOUBLE: 448 vals >> *p.double_p; 449 break; 450 default: 451 break; 452 } 453 if(p.type!=STRING&&(!vals||!vals.eof())) 454 requiresValue(arg, p.type); 455 } 456 p.set = true; 457 } 458 458 } 459 459 } … … 461 461 462 462 return *this; 463 } 463 } 464 464 465 465 }
Note: See TracChangeset
for help on using the changeset viewer.

