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