pykd/pykd_ext/arglist.cpp
2017-11-03 15:24:08 +04:00

91 lines
1.9 KiB
C++

#include "stdafx.h"
#include <boost/tokenizer.hpp>
#include <regex>
#include <list>
#include "arglist.h"
namespace {
typedef boost::escaped_list_separator<char> char_separator_t;
typedef boost::tokenizer< char_separator_t > char_tokenizer_t;
ArgsList getArgsList(const std::string& argsStr)
{
char_tokenizer_t token(argsStr, char_separator_t("", " \t", "\""));
ArgsList argsList;
for (char_tokenizer_t::iterator it = token.begin(); it != token.end(); ++it)
{
if (*it != "")
argsList.push_back(*it);
}
return argsList;
}
} // anonymous namespace
static const std::regex versionRe("^-([2,3])(?:\\.(\\d+))?$");
Options::Options(const std::string& cmdline) :
pyMajorVersion(-1),
pyMinorVersion(-1),
global(false),
showHelp(false)
{
args = getArgsList( cmdline );
if ( args.empty() )
{
global = true;
}
for (auto it = args.begin(); it != args.end();)
{
if (*it == "--global" || *it == "-g")
{
global = true;
it = args.erase(it);
continue;
}
if (*it == "--local" || *it == "-l")
{
global = false;
it = args.erase(it);
continue;
}
if (*it == "--help" || *it == "-h")
{
showHelp = true;
it = args.erase(it);
continue;
}
std::smatch mres;
if (std::regex_match(*it, mres, versionRe))
{
pyMajorVersion = atol(std::string(mres[1].first, mres[1].second).c_str());
if (mres[2].matched)
{
pyMinorVersion = atol(std::string(mres[2].first, mres[2].second).c_str());
}
it = args.erase(it);
continue;
}
break;
}
}