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