diff options
Diffstat (limited to 'tools/lldb-mi/MIUtilParse.cpp')
-rw-r--r-- | tools/lldb-mi/MIUtilParse.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/tools/lldb-mi/MIUtilParse.cpp b/tools/lldb-mi/MIUtilParse.cpp new file mode 100644 index 000000000000..27e25b8b7431 --- /dev/null +++ b/tools/lldb-mi/MIUtilParse.cpp @@ -0,0 +1,75 @@ +//===-- MIUtilParse.cpp ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// Third party headers: +#include <memory> + +// In-house headers: +#include "MIUtilParse.h" + +//++ ------------------------------------------------------------------------------------ +// Details: CRegexParser constructor. +// Type: Method. +// Args: regexStr - Pointer to the regular expression to compile. +// Return: None. +// Throws: None. +//-- +MIUtilParse::CRegexParser::CRegexParser(const char *regexStr) + : m_isValid(llvm_regcomp(&m_emma, regexStr, REG_EXTENDED) == 0) +{ +} + +//++ ------------------------------------------------------------------------------------ +// Details: CRegexParser destructor. +// Type: Method. +// Args: None. +// Return: None. +// Throws: None. +//-- +MIUtilParse::CRegexParser::~CRegexParser() +{ + // Free up memory held within regex. + if (m_isValid) + llvm_regfree(&m_emma); +} + +//++ ------------------------------------------------------------------------------------ +// Details: CRegexParser regex executer. +// 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. +// Type: Method. +// Args: input (R) - Pointer to UTF8 text data to be parsed. +// match (RW) - Reference to Match class. +// minMatches (R) - Minimum number of regex matches expected. +// Return: bool - True = minimum matches were met, +// false = minimum matches were not met or regex failed. +// Throws: None. +//-- +bool +MIUtilParse::CRegexParser::Execute(const char *input, Match& match, size_t minMatches) +{ + if (!m_isValid) + return false; + + std::unique_ptr<llvm_regmatch_t[]> matches(new llvm_regmatch_t[match.m_maxMatches]); // Array of matches + + if (llvm_regexec(&m_emma, input, match.m_maxMatches, matches.get(), 0) != 0) + return false; + + size_t i; + for (i = 0; i < match.m_maxMatches && matches[i].rm_so >= 0; i++) + { + const int n = matches[i].rm_eo - matches[i].rm_so; + match.m_matchStrs[i].assign(input + matches[i].rm_so, n); + } + return i >= minMatches; +} |