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(), 2300af72e395d138f459192b7f5450fa4c7854f135Greg Clayton m_compile_flags(REG_EXTENDED) 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner memset(&m_preg,0,sizeof(m_preg)); 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor that compiles "re" using "flags" and stores the 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// resulting compiled regular expression into this object. 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::RegularExpression(const char* re, int flags) : 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re(), 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err (1), 3597c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_preg(), 3697c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_compile_flags(flags) 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner memset(&m_preg,0,sizeof(m_preg)); 3903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile(re); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// Constructor that compiles "re" using "flags" and stores the 4403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// resulting compiled regular expression into this object. 4503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//---------------------------------------------------------------------- 4603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::RegularExpression(const char* re) : 4703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham m_re(), 4803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham m_comp_err (1), 4997c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_preg(), 5097c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_compile_flags(REG_EXTENDED) 5103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 5203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham memset(&m_preg,0,sizeof(m_preg)); 5303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile(re); 5403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 5503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 5603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::RegularExpression(const RegularExpression &rhs) 5703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 5803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham memset(&m_preg,0,sizeof(m_preg)); 5903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile(rhs.GetText(), rhs.GetCompileFlags()); 6003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 6103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 6203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghamconst RegularExpression & 6303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::operator= (const RegularExpression &rhs) 6403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 6503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham if (&rhs != this) 6603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham { 6703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham Compile (rhs.GetText(), rhs.GetCompileFlags()); 6803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham } 6903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham return *this; 7003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 7103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//---------------------------------------------------------------------- 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Any previosuly compiled regular expression contained in this 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// object will be freed. 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::~RegularExpression() 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Free(); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Compile a regular expression using the supplied regular 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression text and flags. The compied regular expression lives 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in this object so that it can be readily used for regular 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression matches. Execute() can be called after the regular 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression is compiled. Any previosuly compiled regular 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression contained in this object will be freed. 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// RETURNS 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// True of the refular expression compiles successfully, false 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// otherwise. 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 9503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamRegularExpression::Compile(const char* re) 9603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{ 9703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham return Compile (re, m_compile_flags); 9803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham} 9903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 10003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghambool 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Compile(const char* re, int flags) 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Free(); 10403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham m_compile_flags = flags; 10503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (re && re[0]) 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re = re; 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = ::regcomp (&m_preg, re, flags); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No valid regular expression 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = 1; 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_comp_err == 0; 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Execute a regular expression match using the compiled regular 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression that is already in this object against the match 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// string "s". If any parens are used for regular expression 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches "match_count" should indicate the number of regmatch_t 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// values that are present in "match_ptr". The regular expression 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// will be executed using the "execute_flags". 12700af72e395d138f459192b7f5450fa4c7854f135Greg Clayton//--------------------------------------------------------------------- 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 12900af72e395d138f459192b7f5450fa4c7854f135Greg ClaytonRegularExpression::Execute(const char* s, Match *match, int execute_flags) const 130f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton{ 13100af72e395d138f459192b7f5450fa4c7854f135Greg Clayton int err = 1; 132b1077c4b43d0e64654f4f02f97be0b7e16920570Greg Clayton if (s != NULL && m_comp_err == 0) 133f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 13400af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (match) 13500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton { 13600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton err = ::regexec (&m_preg, 137f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton s, 13800af72e395d138f459192b7f5450fa4c7854f135Greg Clayton match->GetSize(), 13900af72e395d138f459192b7f5450fa4c7854f135Greg Clayton match->GetData(), 14000af72e395d138f459192b7f5450fa4c7854f135Greg Clayton execute_flags); 14100af72e395d138f459192b7f5450fa4c7854f135Greg Clayton } 14200af72e395d138f459192b7f5450fa4c7854f135Greg Clayton else 143f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 14400af72e395d138f459192b7f5450fa4c7854f135Greg Clayton err = ::regexec (&m_preg, 14500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton s, 14600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton 0, 14700af72e395d138f459192b7f5450fa4c7854f135Greg Clayton NULL, 14800af72e395d138f459192b7f5450fa4c7854f135Greg Clayton execute_flags); 149f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 150f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 15100af72e395d138f459192b7f5450fa4c7854f135Greg Clayton 15200af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (err != 0) 15300af72e395d138f459192b7f5450fa4c7854f135Greg Clayton { 15400af72e395d138f459192b7f5450fa4c7854f135Greg Clayton // The regular expression didn't compile, so clear the matches 15500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (match) 15600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton match->Clear(); 15700af72e395d138f459192b7f5450fa4c7854f135Greg Clayton return false; 15800af72e395d138f459192b7f5450fa4c7854f135Greg Clayton } 15900af72e395d138f459192b7f5450fa4c7854f135Greg Clayton return true; 160f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton} 161f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 162f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Claytonbool 16300af72e395d138f459192b7f5450fa4c7854f135Greg ClaytonRegularExpression::Match::GetMatchAtIndex (const char* s, uint32_t idx, std::string& match_str) const 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16500af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (idx < m_matches.size()) 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 167928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton if (m_matches[idx].rm_eo == m_matches[idx].rm_so) 168928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton { 169928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton // Matched the empty string... 170928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton match_str.clear(); 171928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton return true; 172928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton } 173928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton else if (m_matches[idx].rm_eo > m_matches[idx].rm_so) 174928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton { 175928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton match_str.assign (s + m_matches[idx].rm_so, 176928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton m_matches[idx].rm_eo - m_matches[idx].rm_so); 177928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton return true; 178928d130789bd8ee38ce434ccb2d564e6069cf018Greg Clayton } 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Claytonbool 18400af72e395d138f459192b7f5450fa4c7854f135Greg ClaytonRegularExpression::Match::GetMatchAtIndex (const char* s, uint32_t idx, llvm::StringRef& match_str) const 185f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton{ 18600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (idx < m_matches.size()) 187f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 188f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (m_matches[idx].rm_eo == m_matches[idx].rm_so) 189f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 190f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton // Matched the empty string... 191f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef(); 192f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 193f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 194f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton else if (m_matches[idx].rm_eo > m_matches[idx].rm_so) 195f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 196f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef (s + m_matches[idx].rm_so, m_matches[idx].rm_eo - m_matches[idx].rm_so); 197f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 198f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 199f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 200f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return false; 201f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton} 202f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 203f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Claytonbool 20400af72e395d138f459192b7f5450fa4c7854f135Greg ClaytonRegularExpression::Match::GetMatchSpanningIndices (const char* s, uint32_t idx1, uint32_t idx2, llvm::StringRef& match_str) const 205f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton{ 20600af72e395d138f459192b7f5450fa4c7854f135Greg Clayton if (idx1 < m_matches.size() && idx2 < m_matches.size()) 207f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 208f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton if (m_matches[idx1].rm_so == m_matches[idx2].rm_eo) 209f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 210f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton // Matched the empty string... 211f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef(); 212f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 213f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 214f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton else if (m_matches[idx1].rm_so < m_matches[idx2].rm_eo) 215f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton { 216f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton match_str = llvm::StringRef (s + m_matches[idx1].rm_so, m_matches[idx2].rm_eo - m_matches[idx1].rm_so); 217f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return true; 218f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 219f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton } 220f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton return false; 221f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton} 222f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the regular expression compiled and is ready 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for execution. 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::IsValid () const 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_comp_err == 0; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns the text that was used to compile the current regular 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// expression. 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char* 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::GetText () const 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (m_re.empty()) 24273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return NULL; 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_re.c_str(); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Free any contained compiled regular expressions. 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegularExpression::Free() 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_comp_err == 0) 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_re.clear(); 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regfree(&m_preg); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a compile error since we no longer have a valid regex 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_comp_err = 1; 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2606bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 2616bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Claytonsize_t 2626bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg ClaytonRegularExpression::GetErrorAsCString (char *err_str, size_t err_str_max_len) const 2636bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton{ 2646bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton if (m_comp_err == 0) 2656bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton { 2666bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton if (err_str && err_str_max_len) 2676bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton *err_str = '\0'; 2686bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return 0; 2696bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton } 2706bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 2716bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton return ::regerror (m_comp_err, &m_preg, err_str, err_str_max_len); 2726bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton} 2736bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 274886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatabool 275886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataRegularExpression::operator < (const RegularExpression& rhs) const 276886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{ 277886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata return (m_re < rhs.m_re); 278886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata} 2796bc0b5d69f6f5f46055be6cfea6f9a0eb11b1943Greg Clayton 280