split.cc revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string.h> 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <vector> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/string_piece.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Yea, this could be done with less code duplication using 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// template magic, I know. 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SplitStringPieceToVector(const base::StringPiece& full, 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* delim, 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::vector<base::StringPiece>* vec, 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool omit_empty_strings) { 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vec->clear(); 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (full.size() == 0 || delim[0] == '\0') 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (delim[1] == '\0') { 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::StringPiece::const_iterator s = full.begin(); 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::StringPiece::const_iterator e = s; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (;e != full.end(); ++e) { 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*e == delim[0]) { 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e != s || !omit_empty_strings) { 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vec->push_back(base::StringPiece(s, e - s)); 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = e; 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++s; 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s != e) { 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --e; 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e != s || !omit_empty_strings) { 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vec->push_back(base::StringPiece(s, e - s)); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::StringPiece::const_iterator s = full.begin(); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::StringPiece::const_iterator e = s; 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (;e != full.end(); ++e) { 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool one_matched = false; 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (const char *d = delim; *d != '\0'; ++d) { 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (*d == *e) { 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott one_matched = true; 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (one_matched) { 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e != s || !omit_empty_strings) { 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vec->push_back(base::StringPiece(s, e - s)); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s = e; 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++s; 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (s != e) { 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott --e; 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (e != s || !omit_empty_strings) { 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott vec->push_back(base::StringPiece(s, e - s)); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 71