437 {
439 _program_name =
argv[0];
440 _program_name.erase(0, _program_name.find_last_of("/\\") + 1);
441 if (argc >= 2)
442 {
443 if (!std::strcmp(argv[1], "--help") || !std::strcmp(argv[1], "-h"))
444 {
445 std::cout << *this;
446 std::exit(0);
447 }
448 else
449 {
450 for (const auto &arg : _arg_map)
451 {
452 const auto &func =
arg.second->_func;
453 if (func && !std::strcmp(argv[1],
arg.first.c_str()))
454 {
455 func();
456 std::exit(0);
457 }
458 }
459 }
460 }
461
462
463
464
465 size_t parg_num = _positional_arg_vec.size();
466
467 size_t required_oarg_num = 0;
468 for (auto arg : _optional_arg_vec)
469 {
470 if (
arg._is_required)
471 required_oarg_num++;
472 }
473
474 for (
int c = 1; c <
argc;)
475 {
476 std::string arg_name{
argv[c++]};
477 auto arg = _arg_map.find(arg_name);
478
479 if (arg == _arg_map.end())
480 {
481 if (parg_num)
482 {
483 auto it = _positional_arg_vec.begin();
484 std::advance(it, _positional_arg_vec.size() - parg_num);
485 (*it)._values.clear();
486 (*it)._values.emplace_back(arg_name);
487 parg_num--;
488 }
489 else
490 throw std::runtime_error("Invalid argument. "
491 "You've given more positional argument than necessary.");
492 }
493 else
494 {
495
496 if (
arg->second->_is_required)
497 required_oarg_num--;
498 arg->second->_values.clear();
499 for (uint32_t n = 0; n <
arg->second->_nargs; n++)
500 {
501 if (c >= argc)
502 throw std::runtime_error("Invalid argument. "
503 "You must have missed some argument.");
504 arg->second->_values.emplace_back(argv[c++]);
505 }
506
507 if (
arg->second->_is_accumulated)
508 {
509 arg->second->_accum_values.emplace_back(
arg->second->_values);
510 }
511 if (
arg->second->_nargs == 0)
512 {
513
514 arg->second->_values.emplace_back(
"1");
515 }
516 }
517 }
518 if (parg_num || required_oarg_num)
519 throw std::runtime_error("Invalid argument. "
520 "You must have missed some argument.");
521 }