Skip to content

Commit

Permalink
Merge pull request #2120 from diffblue/optional_optnr
Browse files Browse the repository at this point in the history
use optional<size_t> instead of stupid -1
  • Loading branch information
Daniel Kroening authored Apr 26, 2018
2 parents 10d0042 + 8f7d9f0 commit 53dfa0a
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 56 deletions.
6 changes: 3 additions & 3 deletions src/goto-cc/goto_cc_cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ bool goto_cc_cmdlinet::prefix_in_list(

std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string)
{
int optnr;
optionalt<std::size_t> optnr;
cmdlinet::optiont option;

if(has_prefix(opt_string, "--")) // starts with -- ?
Expand Down Expand Up @@ -107,13 +107,13 @@ std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string)
}

// new?
if(optnr==-1)
if(!optnr.has_value())
{
options.push_back(option);
return options.size()-1;
}

return optnr;
return *optnr;
}

void goto_cc_cmdlinet::add_infile_arg(const std::string &arg)
Expand Down
14 changes: 7 additions & 7 deletions src/goto-cc/ms_cl_cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
if(std::string(s, 1, std::string::npos)==ms_cl_flags[j])
{
cmdlinet::optiont option;
int optnr;
optionalt<std::size_t> optnr;

if(s.size()==2)
{
Expand All @@ -442,13 +442,13 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
optnr=getoptnr(option.optstring);
}

if(optnr==-1)
if(!optnr.has_value())
{
options.push_back(option);
optnr=options.size()-1;
}

options[optnr].isset=true;
options[*optnr].isset=true;
return;
}
}
Expand All @@ -461,7 +461,7 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
{
cmdlinet::optiont option;

int optnr;
optionalt<std::size_t> optnr;

if(ms_cl_prefix.size()==1)
{
Expand All @@ -478,14 +478,14 @@ void ms_cl_cmdlinet::process_cl_option(const std::string &s)
optnr=getoptnr(option.optstring);
}

if(optnr==-1)
if(!optnr.has_value())
{
options.push_back(option);
optnr=options.size()-1;
}

options[optnr].isset=true;
options[optnr].values.push_back(
options[*optnr].isset=true;
options[*optnr].values.push_back(
std::string(s, ms_cl_prefix.size()+1, std::string::npos));

return;
Expand Down
110 changes: 67 additions & 43 deletions src/util/cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,92 +26,114 @@ void cmdlinet::clear()

bool cmdlinet::isset(char option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);
if(i.has_value())
return options[*i].isset;
else
return false;
return options[i].isset;
}

bool cmdlinet::isset(const char *option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);
if(i.has_value())
return options[*i].isset;
else
return false;
return options[i].isset;
}

std::string cmdlinet::get_value(char option) const
{
int i=getoptnr(option);
if(i<0)
return "";
if(options[i].values.empty())
auto i=getoptnr(option);

if(i.has_value())
{
if(options[*i].values.empty())
return "";
else
return options[*i].values.front();
}
else
return "";
return options[i].values.front();
}

void cmdlinet::set(const std::string &option)
{
int i=getoptnr(option);
if(i<0)
return; // ignore
options[i].isset=true;
auto i=getoptnr(option);

if(i.has_value())
options[*i].isset=true;

// otherwise ignore
}

void cmdlinet::set(const std::string &option, const std::string &value)
{
int i=getoptnr(option);
if(i<0)
return; // ignore
options[i].isset=true;
options[i].values.push_back(value);
auto i=getoptnr(option);

if(i.has_value())
{
options[*i].isset=true;
options[*i].values.push_back(value);
}

// otherwise ignore
}

static std::list<std::string> immutable_empty_list;

const std::list<std::string> &cmdlinet::get_values(char option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);

if(i.has_value())
return options[*i].values;
else
return immutable_empty_list;
return options[i].values;
}

std::string cmdlinet::get_value(const char *option) const
{
int i=getoptnr(option);
if(i<0)
return "";
if(options[i].values.empty())
auto i=getoptnr(option);

if(i.has_value())
{
if(options[*i].values.empty())
return "";
else
return options[*i].values.front();
}
else
return "";
return options[i].values.front();
}

const std::list<std::string> &cmdlinet::get_values(
const std::string &option) const
{
int i=getoptnr(option);
if(i<0)
auto i=getoptnr(option);

if(i.has_value())
return options[*i].values;
else
return immutable_empty_list;
return options[i].values;
}

int cmdlinet::getoptnr(char option) const
optionalt<std::size_t> cmdlinet::getoptnr(char option) const
{
for(std::size_t i=0; i<options.size(); i++)
if(options[i].optchar==option)
return i;

return -1;
return optionalt<std::size_t>();
}

int cmdlinet::getoptnr(const std::string &option) const
optionalt<std::size_t> cmdlinet::getoptnr(const std::string &option) const
{
for(std::size_t i=0; i<options.size(); i++)
if(options[i].optstring==option)
return i;

return -1;
return optionalt<std::size_t>();
}

bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
Expand Down Expand Up @@ -165,7 +187,7 @@ bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
args.push_back(argv[i]);
else
{
int optnr;
optionalt<std::size_t> optnr;

if(argv[i][1]!=0 && argv[i][2]==0)
optnr=getoptnr(argv[i][1]); // single-letter option -X
Expand All @@ -177,29 +199,31 @@ bool cmdlinet::parse(int argc, const char **argv, const char *optstring)
// We first try single-letter.
optnr=getoptnr(argv[i][1]);

if(optnr<0) // try multi-letter
if(!optnr.has_value()) // try multi-letter
optnr=getoptnr(argv[i]+1);
}

if(optnr<0)
if(!optnr.has_value())
{
unknown_arg=argv[i];
return true;
}
options[optnr].isset=true;
if(options[optnr].hasval)

options[*optnr].isset=true;

if(options[*optnr].hasval)
{
if(argv[i][2]==0 || options[optnr].islong)
if(argv[i][2]==0 || options[*optnr].islong)
{
i++;
if(i==argc)
return true;
if(argv[i][0]=='-' && argv[i][1]!=0)
return true;
options[optnr].values.push_back(argv[i]);
options[*optnr].values.push_back(argv[i]);
}
else
options[optnr].values.push_back(argv[i]+2);
options[*optnr].values.push_back(argv[i]+2);
}
}
}
Expand Down
8 changes: 5 additions & 3 deletions src/util/cmdline.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ Author: Daniel Kroening, [email protected]
#include <list>
#include <string>

#include "optional.h"

class cmdlinet
{
public:
Expand Down Expand Up @@ -53,13 +55,13 @@ class cmdlinet
hasval(false),
islong(false),
optchar(0)
{}
{}
};

std::vector<optiont> options;

int getoptnr(char option) const;
int getoptnr(const std::string &option) const;
optionalt<std::size_t> getoptnr(char option) const;
optionalt<std::size_t> getoptnr(const std::string &option) const;
};

#endif // CPROVER_UTIL_CMDLINE_H

0 comments on commit 53dfa0a

Please sign in to comment.