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