diff options
Diffstat (limited to 'chromium/net/tools/balsa/split.cc')
-rw-r--r-- | chromium/net/tools/balsa/split.cc | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/chromium/net/tools/balsa/split.cc b/chromium/net/tools/balsa/split.cc new file mode 100644 index 00000000000..20be430d731 --- /dev/null +++ b/chromium/net/tools/balsa/split.cc @@ -0,0 +1,72 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/tools/balsa/split.h" + +#include <string.h> + +#include <vector> + +#include "base/strings/string_piece.h" + +namespace net { + +// Yea, this could be done with less code duplication using +// template magic, I know. +void SplitStringPieceToVector(const base::StringPiece& full, + const char* delim, + std::vector<base::StringPiece>* vec, + bool omit_empty_strings) { + vec->clear(); + if (full.empty() || delim[0] == '\0') + return; + + if (delim[1] == '\0') { + base::StringPiece::const_iterator s = full.begin(); + base::StringPiece::const_iterator e = s; + for (;e != full.end(); ++e) { + if (*e == delim[0]) { + if (e != s || !omit_empty_strings) { + vec->push_back(base::StringPiece(s, e - s)); + } + s = e; + ++s; + } + } + if (s != e) { + --e; + if (e != s || !omit_empty_strings) { + vec->push_back(base::StringPiece(s, e - s)); + } + } + } else { + base::StringPiece::const_iterator s = full.begin(); + base::StringPiece::const_iterator e = s; + for (;e != full.end(); ++e) { + bool one_matched = false; + for (const char *d = delim; *d != '\0'; ++d) { + if (*d == *e) { + one_matched = true; + break; + } + } + if (one_matched) { + if (e != s || !omit_empty_strings) { + vec->push_back(base::StringPiece(s, e - s)); + } + s = e; + ++s; + } + } + if (s != e) { + --e; + if (e != s || !omit_empty_strings) { + vec->push_back(base::StringPiece(s, e - s)); + } + } + } +} + +} // namespace net + |