| Index: base/strings/string_tokenizer.h
|
| diff --git a/base/strings/string_tokenizer.h b/base/strings/string_tokenizer.h
|
| index 8defbac3b8d0779fbceb6f9744c394428249d482..6afa53a869d99d54a5781aa8a4386d9954abca5b 100644
|
| --- a/base/strings/string_tokenizer.h
|
| +++ b/base/strings/string_tokenizer.h
|
| @@ -58,6 +58,22 @@ namespace base {
|
| //
|
| // EXAMPLE 3:
|
| //
|
| +// std::string input = "<foo, bar>, \"bar, foo\", private";
|
| +// StringTokenizer t(input, ", ");
|
| +// t.set_paired_quote_chars("\"<", "\">");
|
| +// while (t.GetNext()) {
|
| +// printf("%s\n", t.token().c_str());
|
| +// }
|
| +//
|
| +// Output:
|
| +//
|
| +// <foo, bar>
|
| +// "bar, foo"
|
| +// private
|
| +//
|
| +//
|
| +// EXAMPLE 4:
|
| +//
|
| // bool next_is_option = false, next_is_value = false;
|
| // std::string input = "text/html; charset=UTF-8; foo=bar";
|
| // StringTokenizer t(input, "; =");
|
| @@ -120,13 +136,24 @@ class StringTokenizerT {
|
| // it ignores delimiters that it finds. It switches out of this mode once it
|
| // finds another instance of the quote char. If a backslash is encountered
|
| // within a quoted string, then the next character is skipped.
|
| - void set_quote_chars(const str& quotes) { quotes_ = quotes; }
|
| + void set_quote_chars(const str& quotes) {
|
| + set_paired_quote_chars(quotes, quotes);
|
| + }
|
| +
|
| + // Similar to set_quote_chars, but makes it possible to have a different char
|
| + // to start and end a quoted string. The open_quotes and close_quotes
|
| + // parameters must have the same number of characters.
|
| + void set_paired_quote_chars(const str& open_quotes, const str& close_quotes) {
|
| + DCHECK_EQ(open_quotes.size(), close_quotes.size());
|
| + open_quotes_ = open_quotes;
|
| + close_quotes_ = close_quotes;
|
| + }
|
|
|
| // Call this method to advance the tokenizer to the next delimiter. This
|
| // returns false if the tokenizer is complete. This method must be called
|
| // before calling any of the token* methods.
|
| bool GetNext() {
|
| - if (quotes_.empty() && options_ == 0)
|
| + if (open_quotes_.empty() && options_ == 0)
|
| return QuickGetNext();
|
| else
|
| return FullGetNext();
|
| @@ -210,8 +237,11 @@ class StringTokenizerT {
|
| return delims_.find(c) != str::npos;
|
| }
|
|
|
| - bool IsQuote(char_type c) const {
|
| - return quotes_.find(c) != str::npos;
|
| + bool IsQuote(char_type c, char_type* close_quote) const {
|
| + size_t pos = open_quotes_.find(c);
|
| + if (pos != str::npos)
|
| + *close_quote = close_quotes_[pos];
|
| + return pos != str::npos;
|
| }
|
|
|
| struct AdvanceState {
|
| @@ -234,7 +264,7 @@ class StringTokenizerT {
|
| } else {
|
| if (IsDelim(c))
|
| return false;
|
| - state->in_quote = IsQuote(state->quote_char = c);
|
| + state->in_quote = IsQuote(c, &state->quote_char);
|
| }
|
| return true;
|
| }
|
| @@ -244,7 +274,8 @@ class StringTokenizerT {
|
| const_iterator token_end_;
|
| const_iterator end_;
|
| str delims_;
|
| - str quotes_;
|
| + str open_quotes_;
|
| + str close_quotes_;
|
| int options_;
|
| bool token_is_delim_;
|
| };
|
|
|