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:
65  { }
66 
67  explicit Regex(const char* ex, int cflags = REG_EXTENDED)
68  : expr(0)
69  {
70  if (ex && ex[0])
71  {
72  expr = new regex_t();
73  checkerr(::regcomp(expr.getPointer(), ex, cflags));
74  }
75  }
76 
77  explicit Regex(const std::string& ex, int cflags = REG_EXTENDED)
78  : expr(0)
79  {
80  if (!ex.empty())
81  {
82  expr = new regex_t();
83  checkerr(::regcomp(expr.getPointer(), ex.c_str(), cflags));
84  }
85  }
86 
87  bool match(const std::string& str_, RegexSMatch& smatch, int eflags = 0) const;
88  bool match(const std::string& str_, int eflags = 0) const;
89 
90  void free() { expr = 0; }
91  bool empty() const { return expr.getPointer() == 0; }
92  };
93 
96  {
97  friend class Regex;
98 
99  std::string str;
100  regmatch_t matchbuf[10];
101 
102  public:
104  {
105  matchbuf[0].rm_so = 0;
106  }
107 
109  unsigned size() const;
111  regoff_t offsetBegin(unsigned n) const { return matchbuf[n].rm_so; }
113  regoff_t offsetEnd(unsigned n) const { return matchbuf[n].rm_eo; }
114 
116  bool has(unsigned n) const
117  { return matchbuf[n].rm_so >= 0; }
119  std::string get(unsigned n) const;
121  std::string format(const std::string& s) const;
123  std::string operator[] (unsigned n) const
124  { return get(n); }
125  };
126 
127 }
128 
129 #endif // CXXTOOLS_REGEX_H
130