Changeset 209:765619b7cbb2 in lemon-1.2 for lemon/arg_parser.cc
- Timestamp:
- 07/13/08 20:51:02 (17 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 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 64 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 78 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 92 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 106 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 120 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 165 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 179 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 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 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 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 248 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 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 303 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 311 312 313 314 315 316 317 318 319 320 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 323 i!=_others_help.end();++i) 324 324 { 325 326 327 328 329 330 331 332 333 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 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 385 std::cerr << _command_name 386 387 388 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 394 395 396 397 398 std::cerr << _command_name 399 400 401 402 403 404 405 406 std::cerr << _command_name 407 408 409 410 411 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 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 426 _file_args.push_back(arg); 427 427 } 428 428 else { 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 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.