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