Prechádzať zdrojové kódy

Pass non-escaped quote tests.

Sam Jaffe 4 rokov pred
rodič
commit
e5eca7dfae
2 zmenil súbory, kde vykonal 6 pridanie a 3 odobranie
  1. 5 2
      src/tokenizer.cxx
  2. 1 1
      test/tokenizer_test.cxx

+ 5 - 2
src/tokenizer.cxx

@@ -48,11 +48,14 @@ std::vector<std::string> tokenizer::operator()(std::string const &input) const {
   std::size_t from = 0;
   bool in_quote{false};
   for (std::size_t pos = 0; pos < input.size() && rval.size() < max; ++pos) {
-    if (input.find(divider_.c_str(), pos, divider_.size()) != pos || in_quote) {
+    if (input[pos] == quote_.on) {
+      in_quote = !in_quote;
+    } else if (input.find(divider_.c_str(), pos, divider_.size()) != pos ||
+               in_quote) {
       buffer.append(1, input[pos]);
     } else if (escapable_ && countback(input, pos, '\\') % 2) {
       buffer.back() = input[pos];
-    } else {
+    } else if (!in_quote) {
       if (!ignore_empty_tokens_ || buffer.size()) {
         rval.emplace_back(buffer);
       }

+ 1 - 1
test/tokenizer_test.cxx

@@ -96,5 +96,5 @@ TEST(TokenizerTest, QuotedTokensAreEscapable) {
 TEST(TokenizerTest, QuotesDontNeedToBeAtStartAndEnd) {
   std::string const input = R"(A,B",C")";
   std::vector<std::string> const expected{"A", "B,C"};
-  EXPECT_THAT(tokenizer(",", {'"', "\\\""})(input), expected);
+  EXPECT_THAT(tokenizer(",", {'"'})(input), expected);
 }