RegularExpression.cpp revision a408326b499c3ffdfed2378738598c4ad0cf745f
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- RegularExpression.cpp -----------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 11a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <string.h> 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::RegularExpression() : 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re(), 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err (1), 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_preg(), 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches() 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner memset(&m_preg,0,sizeof(m_preg)); 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor that compiles "re" using "flags" and stores the 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// resulting compiled regular expression into this object. 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::RegularExpression(const char* re, int flags) : 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re(), 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err (1), 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_preg() 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner memset(&m_preg,0,sizeof(m_preg)); 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Compile(re, flags); 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Any previosuly compiled regular expression contained in this 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// object will be freed. 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::~RegularExpression() 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Free(); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compile a regular expression using the supplied regular 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression text and flags. The compied regular expression lives 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in this object so that it can be readily used for regular 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression matches. Execute() can be called after the regular 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression is compiled. Any previosuly compiled regular 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression contained in this object will be freed. 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// RETURNS 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// True of the refular expression compiles successfully, false 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// otherwise. 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Compile(const char* re, int flags) 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Free(); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (re && re[0]) 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re = re; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = ::regcomp (&m_preg, re, flags); 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No valid regular expression 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = 1; 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_comp_err == 0; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Execute a regular expression match using the compiled regular 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression that is already in this object against the match 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// string "s". If any parens are used for regular expression 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches "match_count" should indicate the number of regmatch_t 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// values that are present in "match_ptr". The regular expression 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// will be executed using the "execute_flags". 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Execute(const char* s, size_t num_matches, int execute_flags) const 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int match_result = 1; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_comp_err == 0) 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_matches > 0) 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches.resize(num_matches + 1); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches.clear(); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner match_result = ::regexec (&m_preg, 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s, 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches.size(), 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const_cast<regmatch_t *>(m_matches.data()), 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner execute_flags); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return match_result == 0; 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::GetMatchAtIndex (const char* s, uint32_t idx, std::string& match_str) const 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx <= m_preg.re_nsub && idx < m_matches.size()) 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner match_str.assign (s + m_matches[idx].rm_so, 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches[idx].rm_eo - m_matches[idx].rm_so); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the regular expression compiled and is ready 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for execution. 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::IsValid () const 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_comp_err == 0; 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns the text that was used to compile the current regular 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression. 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char* 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::GetText () const 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_re.c_str(); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Free any contained compiled regular expressions. 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Free() 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_comp_err == 0) 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re.clear(); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regfree(&m_preg); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a compile error since we no longer have a valid regex 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = 1; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 156