/usr/include/cxxtools/split.h is in libcxxtools-dev 2.2.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | /*
* Copyright (C) 2010 Tommi Maekitalo
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* As a special exception, you may use this file as part of a free
* software library without restriction. Specifically, if other files
* instantiate templates or use macros or inline functions from this
* file, or you compile this file and link it with other files to
* produce an executable, this file does not by itself cause the
* resulting executable to be covered by the GNU General Public
* License. This exception does not however invalidate any other
* reasons why the executable file might be covered by the GNU Library
* General Public License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef CXXTOOLS_SPLIT_H
#define CXXTOOLS_SPLIT_H
#include <string>
#include <cxxtools/regex.h>
namespace cxxtools
{
/** @brief Splits a std::string into tokens using a delimiter character
This is a little helper functions, which splits a string into tokens.
A delimiter character is passed as a character and the resulting tokens
are written to a output iterator.
The most common output iterator is a std::back_inserter.
Example (prints username and uid on a unix system:
\code
std::ifstream passwd("/etc/passwd");
std::string line;
while (std::getline(passwd, line))
{
std::vector<std::string> tokens;
cxxtools::split(':', line, std::back_inserter(tokens));
if (tokens.size() > 2)
std::cout << "username: " << tokens[0] << " uid=" << tokens[2] << std::endl;
}
\endcode
*/
template <typename outputIterator, typename characterType>
void split(characterType ch, const std::basic_string<characterType>& line, outputIterator it)
{
std::basic_string<characterType> s(line);
typename std::basic_string<characterType>::size_type pos;
while ((pos = s.find(ch)) != std::basic_string<characterType>::npos)
{
*it = s.substr(0, pos);
++it;
s.erase(0, pos + 1);
}
*it = s;
++it;
}
/** @brief Splits a std::string into tokens using a set of delimiter characters
This is a little helper functions, which splits a string into tokens.
A set of delimiter characters is passed as a zero terminated char array and
the resulting tokens are written to a output iterator.
The most common output iterator is a std::back_inserter.
Example (splits a line on white space):
\code
std::string line = ...;
std::vector<std::string> tokens;
cxxtools::split("[ \t]+", line, std::back_inserter(tokens));
\endcode
*/
template <typename outputIterator, typename characterType>
void split(const characterType* chars, const std::basic_string<characterType>& line, outputIterator it)
{
std::basic_string<characterType> s(line);
typename std::basic_string<characterType>::size_type pos;
while ((pos = s.find_first_of(chars)) != std::basic_string<characterType>::npos)
{
*it = s.substr(0, pos);
++it;
s.erase(0, pos + 1);
}
*it = s;
++it;
}
/** @brief Splits a std::string into tokens using a set of delimiter characters
This is a little helper functions, which splits a string into tokens.
A set of delimiter characters is passed as a string and the resulting tokens
are written to a output iterator.
The most common output iterator is a std::back_inserter.
Example (splits a line on white space):
\code
std::string line = ...;
std::vector<std::string> tokens;
cxxtools::split("[ \t]+", line, std::back_inserter(tokens));
\endcode
*/
template <typename outputIterator, typename characterType>
void split(const std::basic_string<characterType>& chars, const std::basic_string<characterType>& line, outputIterator it)
{
std::basic_string<characterType> s(line);
typename std::basic_string<characterType>::size_type pos;
while ((pos = s.find_first_of(chars)) != std::basic_string<characterType>::npos)
{
*it = s.substr(0, pos);
++it;
s.erase(0, pos + 1);
}
*it = s;
++it;
}
/** @brief Splits a std::string into tokens using a regular expression.
This function is much like the other split function, but uses a regular
expression to find a delimiter. This is useful e.g. to split a string
using white space:
Example (splits a line on white space):
\code
std::string line = ...;
std::vector<std::string> tokens;
cxxtools::split(cxxtools::Regex("[ \t]+"), line, std::back_inserter(tokens));
\endcode
*/
template <typename outputIterator>
void split(const Regex& re, const std::string& line, outputIterator it)
{
std::string s(line);
RegexSMatch sm;
while (re.match(s, sm))
{
*it = s.substr(0, sm.offsetBegin(0));
++it;
s.erase(0, sm.offsetEnd(0));
}
*it = s;
++it;
}
}
#endif // CXXTOOLS_SPLIT_H
|