regex.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2008 Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 
30 #ifndef CXXTOOLS_REGEX_H
31 #define CXXTOOLS_REGEX_H
32 
33 #include <string>
34 #include <sys/types.h>
35 #include <regex.h>
36 #include <cxxtools/smartptr.h>
37 
38 namespace cxxtools
39 {
40  class RegexSMatch;
41 
42  template <typename objectType>
43  class RegexDestroyPolicy;
44 
45  template <>
46  class RegexDestroyPolicy<regex_t>
47  {
48  protected:
49  void destroy(regex_t* expr)
50  {
51  ::regfree(expr);
52  delete expr;
53  }
54  };
55 
57  class Regex
58  {
60 
61  void checkerr(int ret) const;
62 
63  public:
66  { }
67 
69  explicit Regex(const char* ex, int cflags = REG_EXTENDED)
70  : expr(0)
71  {
72  if (ex && ex[0])
73  {
74  expr = new regex_t();
75  checkerr(::regcomp(expr.getPointer(), ex, cflags));
76  }
77  }
78 
80  explicit Regex(const std::string& ex, int cflags = REG_EXTENDED)
81  : expr(0)
82  {
83  if (!ex.empty())
84  {
85  expr = new regex_t();
86  checkerr(::regcomp(expr.getPointer(), ex.c_str(), cflags));
87  }
88  }
89 
91  bool matchp(const std::string& str_, std::string::size_type p, RegexSMatch& smatch, int eflags = 0) const;
92 
94  bool matchp(const std::string& str_, std::string::size_type p, int eflags = 0) const;
95 
97  bool match(const std::string& str_, RegexSMatch& smatch, int eflags = 0) const
98  { return matchp(str_, 0, smatch, eflags); }
99 
101  bool match(const std::string& str_, int eflags = 0) const
102  { return matchp(str_, 0, eflags); }
103 
106  std::string subst(const std::string& str, const std::string& expr, bool all = true);
107 
109  void free() { expr = 0; }
110 
112  bool empty() const { return expr.getPointer() == 0; }
113  };
114 
117  {
118  friend class Regex;
119 
120  std::string str;
121  regmatch_t matchbuf[10];
122 
123  public:
125  {
126  matchbuf[0].rm_so = 0;
127  }
128 
130  unsigned size() const;
132  regoff_t offsetBegin(unsigned n) const { return matchbuf[n].rm_so; }
134  regoff_t offsetEnd(unsigned n) const { return matchbuf[n].rm_eo; }
136  regoff_t size(unsigned n) const { return matchbuf[n].rm_eo - matchbuf[n].rm_so; }
137 
139  bool has(unsigned n) const
140  { return matchbuf[n].rm_so >= 0; }
142  std::string get(unsigned n) const;
144  std::string format(const std::string& s) const;
146  std::string operator[] (unsigned n) const
147  { return get(n); }
148  };
149 
150 }
151 
152 #endif // CXXTOOLS_REGEX_H
153