/* PIP - Platform Independent Primitives Command-Line Parser Copyright (C) 2018 Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "picli.h" #include "pisysteminfo.h" /*! \class PICLI * \brief Command-line arguments parser * * \section PICLI_sec0 Synopsis * This class provide handy parsing of command-line arguments. First you should add * arguments to PICLI with function \a addArgument(). Then you can check if there * is some argument in application command-line with function \a hasArgument(); * \section PICLI_sec1 Example * \snippet picli.cpp main */ PICLI::PICLI(int argc, char * argv[]) { setName("CLI"); needParse = true; _prefix_short = "-"; _prefix_full = "--"; _count_opt = 0; _count_mand = 0; for (int i = 0; i < argc; ++i) _args_raw << argv[i]; if (argc > 0) PISystemInfo::instance()->execCommand = argv[0]; } void PICLI::parse() { if (!needParse) return; PIString cra, full; Argument * last = 0; for (int i = 1; i < _args_raw.size_s(); ++i) { cra = _args_raw[i]; if (cra.left(2) == _prefix_full) { last = 0; full = cra.right(cra.length() - 2); piForeach (Argument & a, _args) { if (a.full_key == full) { a.found = true; last = &a; break; } } } else { if (cra.left(1) == _prefix_short) { last = 0; for (int j = 1; j < cra.length(); ++j) { bool found = false; piForeach (Argument & a, _args) { if (a.short_key == cra[j]) { a.found = true; last = &a; found = true; break; } } if (!found) break; } } else { if (last == 0 ? true : !last->has_value) { if (_args_mand.size_s() < _count_mand) { _args_mand << cra; continue; } if (_args_opt.size_s() < _count_opt || _count_opt < 0) { _args_opt << cra; continue; } piCoutObj << "[PICli] Arguments overflow, \"" << cra << "\" ignored"; } if (last == 0 ? false : last->has_value) { last->value = cra; last = 0; } } } } needParse = false; }