/* PIP - Platform Independent Primitives Command-Line Parser Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #include "picli.h" #include "pisysteminfo.h" //! \class PICLI picli.h //! \details //! \~english \section PICLI_sec0 Synopsis //! \~russian \section PICLI_sec0 Краткий обзор //! \~english //! 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(), //! or obtain argument value by \a argumentValue(). //! //! \~russian //! Этот класс предоставляет удобный механизм для разбора аргументов командной строки. //! Сперва необходимо добавить аргументы в %PICLI с помощью методов \a addArgument(). //! Далее можно проверять аргументы на наличие в командной строке методом \a hasArgument(), //! а также получить их значения при помощи \a argumentValue(). //! //! \~english \section PICLI_sec1 Example //! \~russian \section PICLI_sec1 Пример //! \~\code //! int main(int argc, char ** argv) { //! PICLI cli(argc, argv); //! cli.addArgument("console"); //! cli.addArgument("debug"); //! cli.addArgument("Value", "v", "value", true); //! if (cli.hasArgument("console")) //! piCout << "console active"; //! if (cli.hasArgument("debug")) //! piCout << "debug active"; //! piCout << "Value =" << cli.argumentValue("Value"); //! return 0; //! } //! //! These executions are similar: //! a.out -cd -v 10 //! a.out --value 10 -dc //! a.out -c -v 10 -d //! a.out --console -d -v 10 //! a.out --debug -c --value 10 //! \endcode //! PICLI::PICLI(int argc, char * argv[]) { needParse = debug_ = 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 != '\0') && (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; }