xref: /freebsd/contrib/atf/atf-c++/detail/text.hpp (revision c243e4902be8df1e643c76b5f18b68bb77cc5268)
1*c243e490SMarcel Moolenaar //
2*c243e490SMarcel Moolenaar // Automated Testing Framework (atf)
3*c243e490SMarcel Moolenaar //
4*c243e490SMarcel Moolenaar // Copyright (c) 2007 The NetBSD Foundation, Inc.
5*c243e490SMarcel Moolenaar // All rights reserved.
6*c243e490SMarcel Moolenaar //
7*c243e490SMarcel Moolenaar // Redistribution and use in source and binary forms, with or without
8*c243e490SMarcel Moolenaar // modification, are permitted provided that the following conditions
9*c243e490SMarcel Moolenaar // are met:
10*c243e490SMarcel Moolenaar // 1. Redistributions of source code must retain the above copyright
11*c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer.
12*c243e490SMarcel Moolenaar // 2. Redistributions in binary form must reproduce the above copyright
13*c243e490SMarcel Moolenaar //    notice, this list of conditions and the following disclaimer in the
14*c243e490SMarcel Moolenaar //    documentation and/or other materials provided with the distribution.
15*c243e490SMarcel Moolenaar //
16*c243e490SMarcel Moolenaar // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*c243e490SMarcel Moolenaar // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*c243e490SMarcel Moolenaar // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*c243e490SMarcel Moolenaar // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*c243e490SMarcel Moolenaar // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*c243e490SMarcel Moolenaar // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*c243e490SMarcel Moolenaar // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*c243e490SMarcel Moolenaar // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*c243e490SMarcel Moolenaar // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*c243e490SMarcel Moolenaar // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*c243e490SMarcel Moolenaar // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*c243e490SMarcel Moolenaar // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*c243e490SMarcel Moolenaar //
29*c243e490SMarcel Moolenaar 
30*c243e490SMarcel Moolenaar #if !defined(_ATF_CXX_TEXT_HPP_)
31*c243e490SMarcel Moolenaar #define _ATF_CXX_TEXT_HPP_
32*c243e490SMarcel Moolenaar 
33*c243e490SMarcel Moolenaar extern "C" {
34*c243e490SMarcel Moolenaar #include <stdint.h>
35*c243e490SMarcel Moolenaar }
36*c243e490SMarcel Moolenaar 
37*c243e490SMarcel Moolenaar #include <sstream>
38*c243e490SMarcel Moolenaar #include <stdexcept>
39*c243e490SMarcel Moolenaar #include <string>
40*c243e490SMarcel Moolenaar #include <vector>
41*c243e490SMarcel Moolenaar 
42*c243e490SMarcel Moolenaar namespace atf {
43*c243e490SMarcel Moolenaar namespace text {
44*c243e490SMarcel Moolenaar 
45*c243e490SMarcel Moolenaar //!
46*c243e490SMarcel Moolenaar //! \brief Duplicates a C string using the new[] allocator.
47*c243e490SMarcel Moolenaar //!
48*c243e490SMarcel Moolenaar //! Replaces the functionality of strdup by using the new[] allocator and
49*c243e490SMarcel Moolenaar //! thus allowing the resulting memory to be managed by utils::auto_array.
50*c243e490SMarcel Moolenaar //!
51*c243e490SMarcel Moolenaar char* duplicate(const char*);
52*c243e490SMarcel Moolenaar 
53*c243e490SMarcel Moolenaar //!
54*c243e490SMarcel Moolenaar //! \brief Joins multiple words into a string.
55*c243e490SMarcel Moolenaar //!
56*c243e490SMarcel Moolenaar //! Joins a list of words into a string, separating them using the provided
57*c243e490SMarcel Moolenaar //! separator.  Empty words are not omitted.
58*c243e490SMarcel Moolenaar //!
59*c243e490SMarcel Moolenaar template< class T >
60*c243e490SMarcel Moolenaar std::string
61*c243e490SMarcel Moolenaar join(const T& words, const std::string& separator)
62*c243e490SMarcel Moolenaar {
63*c243e490SMarcel Moolenaar     std::string str;
64*c243e490SMarcel Moolenaar 
65*c243e490SMarcel Moolenaar     typename T::const_iterator iter = words.begin();
66*c243e490SMarcel Moolenaar     bool done = iter == words.end();
67*c243e490SMarcel Moolenaar     while (!done) {
68*c243e490SMarcel Moolenaar         str += *iter;
69*c243e490SMarcel Moolenaar         iter++;
70*c243e490SMarcel Moolenaar         if (iter != words.end())
71*c243e490SMarcel Moolenaar             str += separator;
72*c243e490SMarcel Moolenaar         else
73*c243e490SMarcel Moolenaar             done = true;
74*c243e490SMarcel Moolenaar     }
75*c243e490SMarcel Moolenaar 
76*c243e490SMarcel Moolenaar     return str;
77*c243e490SMarcel Moolenaar }
78*c243e490SMarcel Moolenaar 
79*c243e490SMarcel Moolenaar //!
80*c243e490SMarcel Moolenaar //! \brief Checks if the string matches a regular expression.
81*c243e490SMarcel Moolenaar //!
82*c243e490SMarcel Moolenaar bool match(const std::string&, const std::string&);
83*c243e490SMarcel Moolenaar 
84*c243e490SMarcel Moolenaar //!
85*c243e490SMarcel Moolenaar //! \brief Splits a string into words.
86*c243e490SMarcel Moolenaar //!
87*c243e490SMarcel Moolenaar //! Splits the given string into multiple words, all separated by the
88*c243e490SMarcel Moolenaar //! given delimiter.  Multiple occurrences of the same delimiter are
89*c243e490SMarcel Moolenaar //! not condensed so that rejoining the words later on using the same
90*c243e490SMarcel Moolenaar //! delimiter results in the original string.
91*c243e490SMarcel Moolenaar //!
92*c243e490SMarcel Moolenaar std::vector< std::string > split(const std::string&, const std::string&);
93*c243e490SMarcel Moolenaar 
94*c243e490SMarcel Moolenaar //!
95*c243e490SMarcel Moolenaar //! \brief Removes whitespace from the beginning and end of a string.
96*c243e490SMarcel Moolenaar //!
97*c243e490SMarcel Moolenaar std::string trim(const std::string&);
98*c243e490SMarcel Moolenaar 
99*c243e490SMarcel Moolenaar //!
100*c243e490SMarcel Moolenaar //! \brief Converts a string to a boolean value.
101*c243e490SMarcel Moolenaar //!
102*c243e490SMarcel Moolenaar bool to_bool(const std::string&);
103*c243e490SMarcel Moolenaar 
104*c243e490SMarcel Moolenaar //!
105*c243e490SMarcel Moolenaar //! \brief Converts the given string to a bytes size.
106*c243e490SMarcel Moolenaar //!
107*c243e490SMarcel Moolenaar int64_t to_bytes(std::string);
108*c243e490SMarcel Moolenaar 
109*c243e490SMarcel Moolenaar //!
110*c243e490SMarcel Moolenaar //! \brief Changes the case of a string to lowercase.
111*c243e490SMarcel Moolenaar //!
112*c243e490SMarcel Moolenaar //! Returns a new string that is a lowercased version of the original
113*c243e490SMarcel Moolenaar //! one.
114*c243e490SMarcel Moolenaar //!
115*c243e490SMarcel Moolenaar std::string to_lower(const std::string&);
116*c243e490SMarcel Moolenaar 
117*c243e490SMarcel Moolenaar //!
118*c243e490SMarcel Moolenaar //! \brief Converts the given object to a string.
119*c243e490SMarcel Moolenaar //!
120*c243e490SMarcel Moolenaar //! Returns a string with the representation of the given object.  There
121*c243e490SMarcel Moolenaar //! must exist an operator<< method for that object.
122*c243e490SMarcel Moolenaar //!
123*c243e490SMarcel Moolenaar template< class T >
124*c243e490SMarcel Moolenaar std::string
125*c243e490SMarcel Moolenaar to_string(const T& ob)
126*c243e490SMarcel Moolenaar {
127*c243e490SMarcel Moolenaar     std::ostringstream ss;
128*c243e490SMarcel Moolenaar     ss << ob;
129*c243e490SMarcel Moolenaar     return ss.str();
130*c243e490SMarcel Moolenaar }
131*c243e490SMarcel Moolenaar 
132*c243e490SMarcel Moolenaar //!
133*c243e490SMarcel Moolenaar //! \brief Converts the given string to another type.
134*c243e490SMarcel Moolenaar //!
135*c243e490SMarcel Moolenaar //! Attempts to convert the given string to the requested type.  Throws
136*c243e490SMarcel Moolenaar //! an exception if the conversion failed.
137*c243e490SMarcel Moolenaar //!
138*c243e490SMarcel Moolenaar template< class T >
139*c243e490SMarcel Moolenaar T
140*c243e490SMarcel Moolenaar to_type(const std::string& str)
141*c243e490SMarcel Moolenaar {
142*c243e490SMarcel Moolenaar     std::istringstream ss(str);
143*c243e490SMarcel Moolenaar     T value;
144*c243e490SMarcel Moolenaar     ss >> value;
145*c243e490SMarcel Moolenaar     if (!ss.eof() || (ss.eof() && (ss.fail() || ss.bad())))
146*c243e490SMarcel Moolenaar         throw std::runtime_error("Cannot convert string to requested type");
147*c243e490SMarcel Moolenaar     return value;
148*c243e490SMarcel Moolenaar }
149*c243e490SMarcel Moolenaar 
150*c243e490SMarcel Moolenaar } // namespace text
151*c243e490SMarcel Moolenaar } // namespace atf
152*c243e490SMarcel Moolenaar 
153*c243e490SMarcel Moolenaar #endif // !defined(_ATF_CXX_TEXT_HPP_)
154