RegularExpression.cpp revision f892c42725ed36c97e8ce10e758170cf6f1aff83
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" 11f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton#include "llvm/ADT/StringRef.h" 12a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <string.h> 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::RegularExpression() : 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re(), 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err (1), 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_preg(), 2303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham m_compile_flags(REG_EXTENDED), 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches() 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner memset(&m_preg,0,sizeof(m_preg)); 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor that compiles "re" using "flags" and stores the 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// resulting compiled regular expression into this object. 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::RegularExpression(const char* re, int flags) : 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re(), 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err (1), 3697c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_preg(), 3797c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_compile_flags(flags) 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner memset(&m_preg,0,sizeof(m_preg)); 4003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile(re); 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// Constructor that compiles "re" using "flags" and stores the 4503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// resulting compiled regular expression into this object. 4603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//---------------------------------------------------------------------- 4703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::RegularExpression(const char* re) : 4803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham m_re(), 4903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham m_comp_err (1), 5097c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_preg(), 5197c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_compile_flags(REG_EXTENDED) 5203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 5303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham memset(&m_preg,0,sizeof(m_preg)); 5403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile(re); 5503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 5603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 5703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::RegularExpression(const RegularExpression &rhs) 5803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 5903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham memset(&m_preg,0,sizeof(m_preg)); 6003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile(rhs.GetText(), rhs.GetCompileFlags()); 6103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 6203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 6303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghamconst RegularExpression & 6403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::operator= (const RegularExpression &rhs) 6503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 6603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham if (&rhs != this) 6703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham { 6803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile (rhs.GetText(), rhs.GetCompileFlags()); 6903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham } 7003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham return *this; 7103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 7203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//---------------------------------------------------------------------- 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Any previosuly compiled regular expression contained in this 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// object will be freed. 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::~RegularExpression() 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Free(); 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compile a regular expression using the supplied regular 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression text and flags. The compied regular expression lives 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in this object so that it can be readily used for regular 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression matches. Execute() can be called after the regular 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression is compiled. Any previosuly compiled regular 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression contained in this object will be freed. 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// RETURNS 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// True of the refular expression compiles successfully, false 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// otherwise. 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 9603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::Compile(const char* re) 9703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 9803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham return Compile (re, m_compile_flags); 9903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 10003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 10103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghambool 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Compile(const char* re, int flags) 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Free(); 10503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham m_compile_flags = flags; 10603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (re && re[0]) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re = re; 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = ::regcomp (&m_preg, re, flags); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No valid regular expression 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = 1; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_comp_err == 0; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Execute a regular expression match using the compiled regular 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression that is already in this object against the match 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// string "s". If any parens are used for regular expression 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches "match_count" should indicate the number of regmatch_t 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// values that are present in "match_ptr". The regular expression 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// will be executed using the "execute_flags". 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Execute(const char* s, size_t num_matches, int execute_flags) const 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int match_result = 1; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_comp_err == 0) 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_matches > 0) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches.resize(num_matches + 1); 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches.clear(); 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner match_result = ::regexec (&m_preg, 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s, 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_matches.size(), 143928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton &m_matches[0], 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner execute_flags); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return match_result == 0; 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 150f892c42725ed36c97e8ce10e758170cf6f1aff83Greg ClaytonRegularExpression::ExecuteThreadSafe (const char* s, llvm::StringRef *match_srefs, size_t count, int execute_flags) const 151f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton{ 152f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton bool success = false; 153f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (m_comp_err == 0) 154f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 155f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton std::vector<regmatch_t> matches; 156f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 157f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (match_srefs && count > 0) 158f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton matches.resize(count + 1); 159f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 160f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton success = ::regexec (&m_preg, 161f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton s, 162f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton matches.size(), 163f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton matches.data(), 164f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton execute_flags) == 0; 165f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton for (size_t i=0; i<count; ++i) 166f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 167f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton size_t match_idx = i+1; 168f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (success && matches[match_idx].rm_so < matches[match_idx].rm_eo) 169f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_srefs[i] = llvm::StringRef(s + matches[match_idx].rm_so, matches[match_idx].rm_eo - matches[match_idx].rm_so); 170f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton else 171f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_srefs[i] = llvm::StringRef(); 172f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 173f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 174f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return success; 175f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton} 176f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 177f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Claytonbool 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::GetMatchAtIndex (const char* s, uint32_t idx, std::string& match_str) const 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx <= m_preg.re_nsub && idx < m_matches.size()) 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 182928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton if (m_matches[idx].rm_eo == m_matches[idx].rm_so) 183928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton { 184928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton // Matched the empty string... 185928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton match_str.clear(); 186928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton return true; 187928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton } 188928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton else if (m_matches[idx].rm_eo > m_matches[idx].rm_so) 189928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton { 190928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton match_str.assign (s + m_matches[idx].rm_so, 191928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton m_matches[idx].rm_eo - m_matches[idx].rm_so); 192928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton return true; 193928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton } 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Claytonbool 199f892c42725ed36c97e8ce10e758170cf6f1aff83Greg ClaytonRegularExpression::GetMatchAtIndex (const char* s, uint32_t idx, llvm::StringRef& match_str) const 200f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton{ 201f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (idx <= m_preg.re_nsub && idx < m_matches.size()) 202f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 203f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (m_matches[idx].rm_eo == m_matches[idx].rm_so) 204f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 205f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton // Matched the empty string... 206f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef(); 207f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 208f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 209f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton else if (m_matches[idx].rm_eo > m_matches[idx].rm_so) 210f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 211f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef (s + m_matches[idx].rm_so, m_matches[idx].rm_eo - m_matches[idx].rm_so); 212f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 213f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 214f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 215f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return false; 216f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton} 217f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 218f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Claytonbool 219f892c42725ed36c97e8ce10e758170cf6f1aff83Greg ClaytonRegularExpression::GetMatchSpanningIndices (const char* s, uint32_t idx1, uint32_t idx2, llvm::StringRef& match_str) const 220f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton{ 221f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (idx1 <= m_preg.re_nsub && idx1 < m_matches.size() && idx2 <= m_preg.re_nsub && idx2 < m_matches.size()) 222f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 223f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (m_matches[idx1].rm_so == m_matches[idx2].rm_eo) 224f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 225f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton // Matched the empty string... 226f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef(); 227f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 228f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 229f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton else if (m_matches[idx1].rm_so < m_matches[idx2].rm_eo) 230f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 231f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef (s + m_matches[idx1].rm_so, m_matches[idx2].rm_eo - m_matches[idx1].rm_so); 232f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 233f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 234f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 235f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return false; 236f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton} 237f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the regular expression compiled and is ready 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for execution. 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::IsValid () const 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_comp_err == 0; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns the text that was used to compile the current regular 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression. 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char* 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::GetText () const 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (m_re.empty()) 25773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return NULL; 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_re.c_str(); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Free any contained compiled regular expressions. 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Free() 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_comp_err == 0) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re.clear(); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regfree(&m_preg); 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a compile error since we no longer have a valid regex 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = 1; 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2756bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 2766bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Claytonsize_t 2776bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonRegularExpression::GetErrorAsCString (char *err_str, size_t err_str_max_len) const 2786bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton{ 2796bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton if (m_comp_err == 0) 2806bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 2816bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton if (err_str && err_str_max_len) 2826bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton *err_str = '\0'; 2836bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return 0; 2846bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 2856bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 2866bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return ::regerror (m_comp_err, &m_preg, err_str, err_str_max_len); 2876bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton} 2886bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 289886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatabool 290886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataRegularExpression::operator < (const RegularExpression& rhs) const 291886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 292886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return (m_re < rhs.m_re); 293886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 2946bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 295