]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - include/lldb/Utility/RegularExpression.h
Vendor import of lldb trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / include / lldb / Utility / RegularExpression.h
1 //===-- RegularExpression.h -------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_RegularExpression_h_
11 #define liblldb_RegularExpression_h_
12
13 #ifdef _WIN32
14 #include "../lib/Support/regex_impl.h"
15
16 typedef llvm_regmatch_t regmatch_t;
17 typedef llvm_regex_t regex_t;
18
19 inline int regcomp(llvm_regex_t *a, const char *b, int c) {
20   return llvm_regcomp(a, b, c);
21 }
22
23 inline size_t regerror(int a, const llvm_regex_t *b, char *c, size_t d) {
24   return llvm_regerror(a, b, c, d);
25 }
26
27 inline int regexec(const llvm_regex_t *a, const char *b, size_t c,
28                    llvm_regmatch_t d[], int e) {
29   return llvm_regexec(a, b, c, d, e);
30 }
31
32 inline void regfree(llvm_regex_t *a) { llvm_regfree(a); }
33 #else
34 #ifdef __ANDROID__
35 #include <regex>
36 #endif
37 #include <regex.h>
38 #endif
39
40 #include <string>
41 #include <vector>
42
43 #include <stddef.h>
44 #include <stdint.h>
45
46 namespace llvm {
47 class StringRef;
48 } // namespace llvm
49
50 namespace lldb_private {
51
52 //----------------------------------------------------------------------
53 /// @class RegularExpression RegularExpression.h
54 /// "lldb/Utility/RegularExpression.h"
55 /// A C++ wrapper class for regex.
56 ///
57 /// This regular expression class wraps the posix regex functions \c
58 /// regcomp(), \c regerror(), \c regexec(), and \c regfree() from the header
59 /// file in \c /usr/include/regex\.h.
60 //----------------------------------------------------------------------
61 class RegularExpression {
62 public:
63   class Match {
64   public:
65     Match(uint32_t max_matches) : m_matches() {
66       if (max_matches > 0)
67         m_matches.resize(max_matches + 1);
68     }
69
70     void Clear() {
71       const size_t num_matches = m_matches.size();
72       regmatch_t invalid_match = {-1, -1};
73       for (size_t i = 0; i < num_matches; ++i)
74         m_matches[i] = invalid_match;
75     }
76
77     size_t GetSize() const { return m_matches.size(); }
78
79     regmatch_t *GetData() {
80       return (m_matches.empty() ? nullptr : m_matches.data());
81     }
82
83     bool GetMatchAtIndex(llvm::StringRef s, uint32_t idx,
84                          std::string &match_str) const;
85
86     bool GetMatchAtIndex(llvm::StringRef s, uint32_t idx,
87                          llvm::StringRef &match_str) const;
88
89     bool GetMatchSpanningIndices(llvm::StringRef s, uint32_t idx1,
90                                  uint32_t idx2,
91                                  llvm::StringRef &match_str) const;
92
93   protected:
94     std::vector<regmatch_t>
95         m_matches; ///< Where parenthesized subexpressions results are stored
96   };
97
98   //------------------------------------------------------------------
99   /// Default constructor.
100   ///
101   /// The default constructor that initializes the object state such that it
102   /// contains no compiled regular expression.
103   //------------------------------------------------------------------
104   RegularExpression();
105
106   explicit RegularExpression(llvm::StringRef string);
107
108   //------------------------------------------------------------------
109   /// Destructor.
110   ///
111   /// Any previously compiled regular expression contained in this object will
112   /// be freed.
113   //------------------------------------------------------------------
114   ~RegularExpression();
115
116   RegularExpression(const RegularExpression &rhs);
117
118   const RegularExpression &operator=(const RegularExpression &rhs);
119
120   //------------------------------------------------------------------
121   /// Compile a regular expression.
122   ///
123   /// Compile a regular expression using the supplied regular expression text.
124   /// The compiled regular expression lives in this object so that it can be
125   /// readily used for regular expression matches. Execute() can be called
126   /// after the regular expression is compiled. Any previously compiled
127   /// regular expression contained in this object will be freed.
128   ///
129   /// @param[in] re
130   ///     A NULL terminated C string that represents the regular
131   ///     expression to compile.
132   ///
133   /// @return
134   ///     \b true if the regular expression compiles successfully,
135   ///     \b false otherwise.
136   //------------------------------------------------------------------
137   bool Compile(llvm::StringRef string);
138   bool Compile(const char *) = delete;
139
140   //------------------------------------------------------------------
141   /// Executes a regular expression.
142   ///
143   /// Execute a regular expression match using the compiled regular expression
144   /// that is already in this object against the match string \a s. If any
145   /// parens are used for regular expression matches \a match_count should
146   /// indicate the number of regmatch_t values that are present in \a
147   /// match_ptr.
148   ///
149   /// @param[in] string
150   ///     The string to match against the compile regular expression.
151   ///
152   /// @param[in] match
153   ///     A pointer to a RegularExpression::Match structure that was
154   ///     properly initialized with the desired number of maximum
155   ///     matches, or nullptr if no parenthesized matching is needed.
156   ///
157   /// @return
158   ///     \b true if \a string matches the compiled regular
159   ///     expression, \b false otherwise.
160   //------------------------------------------------------------------
161   bool Execute(llvm::StringRef string, Match *match = nullptr) const;
162   bool Execute(const char *, Match * = nullptr) = delete;
163
164   size_t GetErrorAsCString(char *err_str, size_t err_str_max_len) const;
165
166   //------------------------------------------------------------------
167   /// Free the compiled regular expression.
168   ///
169   /// If this object contains a valid compiled regular expression, this
170   /// function will free any resources it was consuming.
171   //------------------------------------------------------------------
172   void Free();
173
174   //------------------------------------------------------------------
175   /// Access the regular expression text.
176   ///
177   /// Returns the text that was used to compile the current regular
178   /// expression.
179   ///
180   /// @return
181   ///     The NULL terminated C string that was used to compile the
182   ///     current regular expression
183   //------------------------------------------------------------------
184   llvm::StringRef GetText() const;
185
186   //------------------------------------------------------------------
187   /// Test if valid.
188   ///
189   /// Test if this object contains a valid regular expression.
190   ///
191   /// @return
192   ///     \b true if the regular expression compiled and is ready
193   ///     for execution, \b false otherwise.
194   //------------------------------------------------------------------
195   bool IsValid() const;
196
197   void Clear() {
198     Free();
199     m_re.clear();
200     m_comp_err = 1;
201   }
202
203   int GetErrorCode() const { return m_comp_err; }
204
205   bool operator<(const RegularExpression &rhs) const;
206
207 private:
208   //------------------------------------------------------------------
209   // Member variables
210   //------------------------------------------------------------------
211   std::string m_re; ///< A copy of the original regular expression text
212   int m_comp_err;   ///< Status code for the regular expression compilation
213   regex_t m_preg;   ///< The compiled regular expression
214 };
215
216 } // namespace lldb_private
217
218 #endif // liblldb_RegularExpression_h_