//===-- MIUtilParse.h ------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #pragma once // Third party headers: #include "../lib/Support/regex_impl.h" // In-house headers: #include "MIUtilString.h" namespace MIUtilParse { //++ ============================================================================ // Details: MI common code utility class. Used to parse the output // returned from lldb commands using regex. //-- class CRegexParser { public: // Helper class for keeping track of regex matches. class Match { friend CRegexParser; public: /* ctor */ explicit Match(size_t nmatches) : m_matchStrs(nmatches), m_maxMatches(nmatches) { } size_t GetMatchCount() const { return m_matchStrs.size(); } CMIUtilString GetMatchAtIndex(size_t i) const { if (m_matchStrs.size() > i) return m_matchStrs[i]; return CMIUtilString(); } private: CMIUtilString::VecString_t m_matchStrs; const size_t m_maxMatches; }; // Methods: // Compile the regular expression. /* ctor */ explicit CRegexParser(const char *regexStr); // Free the memory used by the regular expression. /* dtor */ ~CRegexParser(); // No copies CRegexParser(const CRegexParser&) = delete; void operator=(CRegexParser&) = delete; // Return the match at the index. int GetMatchCount(const Match& match) const { if (m_isValid) return match.GetMatchCount(); return 0; } bool IsValid() const { return m_isValid; } // Match the input against the regular expression. Return an error // if the number of matches is less than minMatches. If the default // minMatches value of 0 is passed, an error will be returned if // the number of matches is less than the maxMatches value used to // initialize Match. bool Execute(const char *input, Match& match, size_t minMatches = 0); private: llvm_regex_t m_emma; const bool m_isValid; }; }