Commit 4dd29333ddd508e9804fabe89a146ed4f2a7e618

Authored by Henry Fredrick Schreiner
1 parent 25d4cbaf

New regexless split, same behavior

include/CLI.hpp
@@ -189,7 +189,6 @@ struct EmptyError : public Error { @@ -189,7 +189,6 @@ struct EmptyError : public Error {
189 EmptyError(std::string name) : Error("EmptyError", name, 9) {} 189 EmptyError(std::string name) : Error("EmptyError", name, 9) {}
190 }; 190 };
191 191
192 -const std::regex reg_split{R"regex((?:([a-zA-Z_]?)(?:,|$)|^)([a-zA-Z0-9_][a-zA-Z0-9_\-]*)?)regex"};  
193 const std::regex reg_short{R"regex(-([a-zA-Z_])(.*))regex"}; 192 const std::regex reg_short{R"regex(-([a-zA-Z_])(.*))regex"};
194 const std::regex reg_long{R"regex(--([^-^=][^=]*)=?(.*))regex"}; 193 const std::regex reg_long{R"regex(--([^-^=][^=]*)=?(.*))regex"};
195 194
@@ -215,20 +214,7 @@ inline bool split_long(const std::string &current, std::string &name, std::strin @@ -215,20 +214,7 @@ inline bool split_long(const std::string &current, std::string &name, std::strin
215 return false; 214 return false;
216 } 215 }
217 216
218 -// Splits a string into long and short names  
219 -inline std::tuple<std::string, std::string> split(std::string fullname) {  
220 -  
221 - std::smatch match;  
222 - if (std::regex_match(fullname, match, reg_split)) {  
223 - std::string sname = match[1];  
224 - std::string lname = match[2];  
225 - if(sname == "" and lname == "")  
226 - throw BadNameString("EMPTY");  
227 - return std::tuple<std::string, std::string>(sname, lname);  
228 - } else throw BadNameString(fullname);  
229 -}  
230 -  
231 -// Splits a string into multiple long and short names (not implemented) 217 +// Splits a string into multiple long and short names
232 inline std::vector<std::string> split_names(std::string current) { 218 inline std::vector<std::string> split_names(std::string current) {
233 std::vector<std::string> output; 219 std::vector<std::string> output;
234 size_t val; 220 size_t val;
@@ -241,6 +227,48 @@ inline std::vector&lt;std::string&gt; split_names(std::string current) { @@ -241,6 +227,48 @@ inline std::vector&lt;std::string&gt; split_names(std::string current) {
241 227
242 } 228 }
243 229
  230 +// Currently just throws an error if name is incorrect. May clean later.
  231 +inline void cleanup_names(const std::vector<std::string> &input) {
  232 +
  233 + for(const std::string &name : input) {
  234 + if(name.compare(0, 2, "--") == 0)
  235 + //output = output.substring(2);
  236 + throw BadNameString(name);
  237 + else if(name.compare(0, 1, std::string("-")) == 0)
  238 + throw BadNameString(name);
  239 + //output = output.substring(1);
  240 + }
  241 +}
  242 +
  243 +// Splits a string into long and short names
  244 +inline std::tuple<std::string, std::string> split(std::string fullname) {
  245 + if(fullname.find(" ") != std::string::npos)
  246 + throw BadNameString("Cannot have space in name string: "+fullname);
  247 + std::vector<std::string> output = split_names(fullname);
  248 + cleanup_names(output);
  249 +
  250 + if(output.size() > 2)
  251 + throw BadNameString(fullname);
  252 + else if (output.size() == 2) {
  253 + if(output[0].length()==0 && output[1].length()==0)
  254 + throw BadNameString("EMPTY");
  255 + else if(output[0].length()<2)
  256 + return std::tuple<std::string,std::string>(output[0], output[1]);
  257 + else if(output[1].length() < 2)
  258 + return std::tuple<std::string,std::string>(output[0], output[1]);
  259 + else
  260 + throw BadNameString(fullname);
  261 + } else {
  262 + if(output[0].length()==0)
  263 + throw BadNameString("EMPTY");
  264 + else if(output[0].length() == 1)
  265 + return std::tuple<std::string,std::string>(output[0], "");
  266 + else
  267 + return std::tuple<std::string,std::string>("", output[0]);
  268 + }
  269 +}
  270 +
  271 +
244 const Combiner NOTHING {0, false,false,false, {}}; 272 const Combiner NOTHING {0, false,false,false, {}};
245 const Combiner REQUIRED {1, false,true, false, {}}; 273 const Combiner REQUIRED {1, false,true, false, {}};
246 const Combiner DEFAULT {1, false,false,true, {}}; 274 const Combiner DEFAULT {1, false,false,true, {}};
tests/SmallTest.cpp
@@ -33,13 +33,14 @@ TEST(Split, GoodStrings) { @@ -33,13 +33,14 @@ TEST(Split, GoodStrings) {
33 } 33 }
34 34
35 TEST(Split, BadStrings) { 35 TEST(Split, BadStrings) {
36 - std::vector<std::string> test_fails= {"a,,boo", "a,b,c", "ssd,sfd", "-a", "", ",", "one two"};  
37 36
38 - for(std::string name : test_fails) {  
39 - EXPECT_THROW(CLI::split(name), CLI::BadNameString);  
40 - }  
41 -  
42 - 37 + EXPECT_THROW(CLI::split("a,,boo"), CLI::BadNameString);
  38 + EXPECT_THROW(CLI::split("a,b,c"), CLI::BadNameString);
  39 + EXPECT_THROW(CLI::split("ssd,sfd"), CLI::BadNameString);
  40 + EXPECT_THROW(CLI::split("-a"), CLI::BadNameString);
  41 + EXPECT_THROW(CLI::split(""), CLI::BadNameString);
  42 + EXPECT_THROW(CLI::split(","), CLI::BadNameString);
  43 + EXPECT_THROW(CLI::split("one two"), CLI::BadNameString);
43 } 44 }
44 45
45 TEST(Validators, FileExists) { 46 TEST(Validators, FileExists) {