Forward compatibility: flex
[foam-extend-3.2.git] / src / OSspecific / POSIX / regExp.C
blob4f540efe799039f066ffc534deb36a1f18887bdc
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include <sys/types.h>
28 #include "regExp.H"
29 #include "label.H"
30 #include "foamString.H"
31 #include "List.H"
32 #include "IOstreams.H"
34 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
36 Foam::regExp::regExp()
38     preg_(0)
42 Foam::regExp::regExp(const char* pattern, const bool ignoreCase)
44     preg_(0)
46     set(pattern, ignoreCase);
50 Foam::regExp::regExp(const std::string& pattern, const bool ignoreCase)
52     preg_(0)
54     set(pattern.c_str(), ignoreCase);
58 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
60 Foam::regExp::~regExp()
62     clear();
66 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
68 void Foam::regExp::set(const char* pattern, const bool ignoreCase) const
70     clear();
72     // avoid NULL pointer and zero-length patterns
73     if (pattern && *pattern)
74     {
75         preg_ = new regex_t;
77         int cflags = REG_EXTENDED;
78         if (ignoreCase)
79         {
80             cflags |= REG_ICASE;
81         }
83         if (regcomp(preg_, pattern, cflags) != 0)
84         {
85             FatalErrorIn
86             (
87                 "regExp::set(const char*)"
88             )   << "Failed to compile regular expression '" << pattern << "'"
89                 << exit(FatalError);
90         }
91     }
95 void Foam::regExp::set(const std::string& pattern, const bool ignoreCase) const
97     return set(pattern.c_str(), ignoreCase);
101 bool Foam::regExp::clear() const
103     if (preg_)
104     {
105         regfree(preg_);
106         delete preg_;
107         preg_ = 0;
109         return true;
110     }
112     return false;
116 std::string::size_type Foam::regExp::find(const std::string& str) const
118     if (preg_ && str.size())
119     {
120         size_t nmatch = 1;
121         regmatch_t pmatch[1];
123         if (regexec(preg_, str.c_str(), nmatch, pmatch, 0) == 0)
124         {
125             return pmatch[0].rm_so;
126         }
127     }
129     return string::npos;
133 bool Foam::regExp::match(const std::string& str) const
135     if (preg_ && str.size())
136     {
137         size_t nmatch = 1;
138         regmatch_t pmatch[1];
140         // also verify that the entire string was matched
141         // pmatch[0] is the entire match
142         if
143         (
144             regexec(preg_, str.c_str(), nmatch, pmatch, 0) == 0
145          && (pmatch[0].rm_so == 0 && pmatch[0].rm_eo == label(str.size()))
146         )
147         {
148             return true;
149         }
150     }
152     return false;
156 bool Foam::regExp::match(const string& str, List<string>& groups) const
158     if (preg_ && str.size())
159     {
160         size_t nmatch = ngroups() + 1;
161         regmatch_t pmatch[nmatch];
163         // also verify that the entire string was matched
164         // pmatch[0] is the entire match
165         // pmatch[1..] are the (...) sub-groups
166         if
167         (
168             regexec(preg_, str.c_str(), nmatch, pmatch, 0) == 0
169          && (pmatch[0].rm_so == 0 && pmatch[0].rm_eo == label(str.size()))
170         )
171         {
172             groups.setSize(ngroups());
173             label groupI = 0;
175             for (size_t matchI = 1; matchI < nmatch; matchI++)
176             {
177                 if (pmatch[matchI].rm_so != -1 && pmatch[matchI].rm_eo != -1)
178                 {
179                     groups[groupI] = str.substr
180                     (
181                         pmatch[matchI].rm_so,
182                         pmatch[matchI].rm_eo - pmatch[matchI].rm_so
183                     );
184                 }
185                 else
186                 {
187                     groups[groupI].clear();
188                 }
189                 groupI++;
190             }
192             return true;
193         }
194     }
196     groups.clear();
197     return false;
201 // * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * * //
203 void Foam::regExp::operator=(const char* pat)
205     set(pat);
209 void Foam::regExp::operator=(const std::string& pat)
211     set(pat);
215 // ************************************************************************* //