Пример #1
0
bool
CmdOptions::Parse (int argc, char *argv[])
{
  try {
    int a(1);
    bool keepParsing (true);
    QString word;
    while (a < argc) {
      word = QString (argv[a]);
      if (word == "--") {
        keepParsing = false;
      } else if (keepParsing && word.startsWith("--")) {
        ParseLong (word, argv, a, argc+1);
      } else if (keepParsing && word.startsWith("-")) {
        ParseShort (word, argv, a, argc+1);
      } else {
        mArgs += word;
      }
      a++;
    }
  } catch (...) {
    bad = true;
    return false;
  }
  bad = false;
  return true;  
}
Пример #2
0
void AppArgs::Parse(int argc, const char* const* argv)
{
  for (int i=1; i<argc; i++) {
    // this shouldn't occur
    if (argv[i] == NULL)
      return;
      
    if (IsOption(argv[i])) {
      if (IsLongOption(argv[i])) {
        std::string name, val;
        bool hasVal;
        if (ParseLong(argv[i], name, val, hasVal)) {
          AA_LONG_MAP::iterator it = s_longMap.find(name);
          if (it != s_longMap.end()) {
            AppArgOption_t* pOpt = (*it).second;
            pOpt->found = true;
            pOpt->hasVal = hasVal;
            pOpt->val = val;
          }
        }
      }
      else {
        char name;
        std::string val;
        bool hasVal;
        ParseShort(argv[i], name, val, hasVal);
        AA_SHORT_MAP::iterator it = s_shortMap.find(name);
        if (it != s_shortMap.end()) {
          AppArgOption_t* pOpt = (*it).second;
          pOpt->found = true;
          if (hasVal) {
            pOpt->hasVal = true;
            pOpt->val = val;
          }
          else {
            if (i+1 < argc && !IsOption(argv[i+1])) {
              pOpt->hasVal = true;
              pOpt->val = argv[i+1];
              i++;
            }
            else {
              pOpt->hasVal = false;
            }
          }
        }
      }
    }
    else {
      s_valList.push_back(argv[i]);
    }
  }
}
Пример #3
0
void OptionParser::Run_(int& argc, const char** argv)
{
    argv0 = argv[0];
    int endp = 1;
    if (argc == 1)
    {
        if (no_opts_help)
        {
            ShowHelp();
            throw Exit{true};
        }
        else return;
    }

    std::array<Option*, 256> short_opts{};
    NEPTOOLS_STATIC_ASSERT(CHAR_BIT == 8);
    std::map<const char*, Option*, OptCmp> long_opts;

    for (auto g : groups)
        for (auto o : g->GetOptions())
        {
            if (!o->enabled) continue;
            if (o->short_name)
            {
                if (short_opts[static_cast<unsigned char>(o->short_name)])
                    NEPTOOLS_THROW(std::logic_error{"Duplicate short option"});
                short_opts[static_cast<unsigned char>(o->short_name)] = o;
            }

            auto x = long_opts.insert(std::make_pair(o->name, o));
            if (!x.second)
                NEPTOOLS_THROW(std::logic_error{"Duplicate long option"});
        }

    for (int i = 1; i < argc; ++i)
    {
        // option: "--"something, "-"something
        // non option: something, "-"
        // special: "--"

        // non option
        if (argv[i][0] != '-' || (argv[i][0] == '-' && argv[i][1] == '\0'))
        {
            if (no_arg_fun) no_arg_fun(argv[i]);
            else argv[endp++] = argv[i];
        }
        else
        {
            if (argv[i][1] != '-') // short
                i += ParseShort(short_opts, argc, i, argv);
            else if (argv[i][1] == '-' && argv[i][2] != '\0') // long
                i += AddInfo(std::bind(ParseLong, long_opts, argc, i, argv),
                             [=](auto& e) { e << ProcessedOption{argv[i]}; });
            else // --: end of args
            {
                if (no_arg_fun)
                    for (++i; i < argc; ++i)
                        no_arg_fun(argv[i]);
                else
                    for (++i; i < argc; ++i)
                        argv[endp++] = argv[i];
                break;
            }
        }
    }

    argc = endp;
    argv[argc] = nullptr;
}