//===-- RegularExpression.h -------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_RegularExpression_h_ #define liblldb_RegularExpression_h_ #ifdef _WIN32 #include "../lib/Support/regex_impl.h" typedef llvm_regmatch_t regmatch_t; typedef llvm_regex_t regex_t; inline int regcomp(llvm_regex_t *a, const char *b, int c) { return llvm_regcomp(a, b, c); } inline size_t regerror(int a, const llvm_regex_t *b, char *c, size_t d) { return llvm_regerror(a, b, c, d); } inline int regexec(const llvm_regex_t *a, const char *b, size_t c, llvm_regmatch_t d[], int e) { return llvm_regexec(a, b, c, d, e); } inline void regfree(llvm_regex_t *a) { llvm_regfree(a); } #else #ifdef __ANDROID__ #include #endif #include #endif #include #include #include #include namespace llvm { class StringRef; } // namespace llvm namespace lldb_private { //---------------------------------------------------------------------- /// @class RegularExpression RegularExpression.h /// "lldb/Utility/RegularExpression.h" /// A C++ wrapper class for regex. /// /// This regular expression class wraps the posix regex functions \c /// regcomp(), \c regerror(), \c regexec(), and \c regfree() from the header /// file in \c /usr/include/regex\.h. //---------------------------------------------------------------------- class RegularExpression { public: class Match { public: Match(uint32_t max_matches) : m_matches() { if (max_matches > 0) m_matches.resize(max_matches + 1); } void Clear() { const size_t num_matches = m_matches.size(); regmatch_t invalid_match = {-1, -1}; for (size_t i = 0; i < num_matches; ++i) m_matches[i] = invalid_match; } size_t GetSize() const { return m_matches.size(); } regmatch_t *GetData() { return (m_matches.empty() ? nullptr : m_matches.data()); } bool GetMatchAtIndex(llvm::StringRef s, uint32_t idx, std::string &match_str) const; bool GetMatchAtIndex(llvm::StringRef s, uint32_t idx, llvm::StringRef &match_str) const; bool GetMatchSpanningIndices(llvm::StringRef s, uint32_t idx1, uint32_t idx2, llvm::StringRef &match_str) const; protected: std::vector m_matches; ///< Where parenthesized subexpressions results are stored }; //------------------------------------------------------------------ /// Default constructor. /// /// The default constructor that initializes the object state such that it /// contains no compiled regular expression. //------------------------------------------------------------------ RegularExpression(); explicit RegularExpression(llvm::StringRef string); //------------------------------------------------------------------ /// Destructor. /// /// Any previously compiled regular expression contained in this object will /// be freed. //------------------------------------------------------------------ ~RegularExpression(); RegularExpression(const RegularExpression &rhs); const RegularExpression &operator=(const RegularExpression &rhs); //------------------------------------------------------------------ /// Compile a regular expression. /// /// Compile a regular expression using the supplied regular expression text. /// The compiled regular expression lives in this object so that it can be /// readily used for regular expression matches. Execute() can be called /// after the regular expression is compiled. Any previously compiled /// regular expression contained in this object will be freed. /// /// @param[in] re /// A NULL terminated C string that represents the regular /// expression to compile. /// /// @return /// \b true if the regular expression compiles successfully, /// \b false otherwise. //------------------------------------------------------------------ bool Compile(llvm::StringRef string); bool Compile(const char *) = delete; //------------------------------------------------------------------ /// Executes a regular expression. /// /// Execute a regular expression match using the compiled regular expression /// that is already in this object against the match string \a s. If any /// parens are used for regular expression matches \a match_count should /// indicate the number of regmatch_t values that are present in \a /// match_ptr. /// /// @param[in] string /// The string to match against the compile regular expression. /// /// @param[in] match /// A pointer to a RegularExpression::Match structure that was /// properly initialized with the desired number of maximum /// matches, or nullptr if no parenthesized matching is needed. /// /// @return /// \b true if \a string matches the compiled regular /// expression, \b false otherwise. //------------------------------------------------------------------ bool Execute(llvm::StringRef string, Match *match = nullptr) const; bool Execute(const char *, Match * = nullptr) = delete; size_t GetErrorAsCString(char *err_str, size_t err_str_max_len) const; //------------------------------------------------------------------ /// Free the compiled regular expression. /// /// If this object contains a valid compiled regular expression, this /// function will free any resources it was consuming. //------------------------------------------------------------------ void Free(); //------------------------------------------------------------------ /// Access the regular expression text. /// /// Returns the text that was used to compile the current regular /// expression. /// /// @return /// The NULL terminated C string that was used to compile the /// current regular expression //------------------------------------------------------------------ llvm::StringRef GetText() const; //------------------------------------------------------------------ /// Test if valid. /// /// Test if this object contains a valid regular expression. /// /// @return /// \b true if the regular expression compiled and is ready /// for execution, \b false otherwise. //------------------------------------------------------------------ bool IsValid() const; void Clear() { Free(); m_re.clear(); m_comp_err = 1; } int GetErrorCode() const { return m_comp_err; } bool operator<(const RegularExpression &rhs) const; private: //------------------------------------------------------------------ // Member variables //------------------------------------------------------------------ std::string m_re; ///< A copy of the original regular expression text int m_comp_err; ///< Status code for the regular expression compilation regex_t m_preg; ///< The compiled regular expression }; } // namespace lldb_private #endif // liblldb_RegularExpression_h_