Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / primitives / strings / string / string.C
blob0a1011adcb25340f37ebbfa969aea8c32dfcbf09
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "string.H"
27 #include "stringOps.H"
30 /* * * * * * * * * * * * * * * Static Member Data  * * * * * * * * * * * * * */
32 const char* const Foam::string::typeName = "string";
33 int Foam::string::debug(Foam::debug::debugSwitch(string::typeName, 0));
34 const Foam::string Foam::string::null;
37 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
39 // Count and return the number of a given character in the string
40 Foam::string::size_type Foam::string::count(const char c) const
42     register size_type cCount = 0;
44     for (const_iterator iter = begin(); iter != end(); ++iter)
45     {
46         if (*iter == c)
47         {
48             ++cCount;
49         }
50     }
52     return cCount;
56 // Replace first occurence of sub-string oldStr with newStr
57 Foam::string& Foam::string::replace
59     const string& oldStr,
60     const string& newStr,
61     size_type start
64     size_type newStart = start;
66     if ((newStart = find(oldStr, newStart)) != npos)
67     {
68         std::string::replace(newStart, oldStr.size(), newStr);
69     }
71     return *this;
75 // Replace all occurences of sub-string oldStr with newStr
76 Foam::string& Foam::string::replaceAll
78     const string& oldStr,
79     const string& newStr,
80     size_type start
83     if (oldStr.size())
84     {
85         size_type newStart = start;
87         while ((newStart = find(oldStr, newStart)) != npos)
88         {
89             std::string::replace(newStart, oldStr.size(), newStr);
90             newStart += newStr.size();
91         }
92     }
94     return *this;
98 Foam::string& Foam::string::expand(const bool allowEmpty)
100     stringOps::inplaceExpand(*this, allowEmpty);
101     return *this;
105 // Remove repeated characters returning true if string changed
106 bool Foam::string::removeRepeated(const char character)
108     bool changed = false;
110     if (character && find(character) != npos)
111     {
112         register string::size_type nChar=0;
113         iterator iter2 = begin();
115         register char prev = 0;
117         for
118         (
119             string::const_iterator iter1 = iter2;
120             iter1 != end();
121             iter1++
122         )
123         {
124             register char c = *iter1;
126             if (prev == c && c == character)
127             {
128                 changed = true;
129             }
130             else
131             {
132                 *iter2 = prev = c;
133                 ++iter2;
134                 ++nChar;
135             }
136         }
137         resize(nChar);
138     }
140     return changed;
144 // Return string with repeated characters removed
145 Foam::string Foam::string::removeRepeated(const char character) const
147     string str(*this);
148     str.removeRepeated(character);
149     return str;
153 // Remove trailing character returning true if string changed
154 bool Foam::string::removeTrailing(const char character)
156     bool changed = false;
158     string::size_type nChar = size();
159     if (character && nChar > 1 && operator[](nChar-1) == character)
160     {
161         resize(nChar-1);
162         changed = true;
163     }
165     return changed;
169 // Return string with trailing character removed
170 Foam::string Foam::string::removeTrailing(const char character) const
172     string str(*this);
173     str.removeTrailing(character);
174     return str;
178 // ************************************************************************* //