//===-- RegularExpression.h -------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_RegularExpression_h_
#define liblldb_RegularExpression_h_

#ifdef _WIN32
#include "../lib/Support/regex_impl.h"

typedef llvm_regmatch_t regmatch_t;
typedef llvm_regex_t regex_t;

inline int regcomp(llvm_regex_t *a, const char *b, int c) {
  return llvm_regcomp(a, b, c);
}

inline size_t regerror(int a, const llvm_regex_t *b, char *c, size_t d) {
  return llvm_regerror(a, b, c, d);
}

inline int regexec(const llvm_regex_t *a, const char *b, size_t c,
                   llvm_regmatch_t d[], int e) {
  return llvm_regexec(a, b, c, d, e);
}

inline void regfree(llvm_regex_t *a) { llvm_regfree(a); }
#else
#ifdef __ANDROID__
#include <regex>
#endif
#include <regex.h>
#endif

#include <string>
#include <vector>

#include <stddef.h> // for size_t
#include <stdint.h>

namespace llvm {
class StringRef;
} // namespace llvm

namespace lldb_private {

//----------------------------------------------------------------------
/// @class RegularExpression RegularExpression.h
/// "lldb/Utility/RegularExpression.h"
/// A C++ wrapper class for regex.
///
/// This regular expression class wraps the posix regex functions \c
/// regcomp(), \c regerror(), \c regexec(), and \c regfree() from the header
/// file in \c /usr/include/regex\.h.
//----------------------------------------------------------------------
class RegularExpression {
public:
  class Match {
  public:
    Match(uint32_t max_matches) : m_matches() {
      if (max_matches > 0)
        m_matches.resize(max_matches + 1);
    }

    void Clear() {
      const size_t num_matches = m_matches.size();
      regmatch_t invalid_match = {-1, -1};
      for (size_t i = 0; i < num_matches; ++i)
        m_matches[i] = invalid_match;
    }

    size_t GetSize() const { return m_matches.size(); }

    regmatch_t *GetData() {
      return (m_matches.empty() ? nullptr : m_matches.data());
    }

    bool GetMatchAtIndex(llvm::StringRef s, uint32_t idx,
                         std::string &match_str) const;

    bool GetMatchAtIndex(llvm::StringRef s, uint32_t idx,
                         llvm::StringRef &match_str) const;

    bool GetMatchSpanningIndices(llvm::StringRef s, uint32_t idx1,
                                 uint32_t idx2,
                                 llvm::StringRef &match_str) const;

  protected:
    std::vector<regmatch_t>
        m_matches; ///< Where parenthesized subexpressions results are stored
  };

  //------------------------------------------------------------------
  /// Default constructor.
  ///
  /// The default constructor that initializes the object state such that it
  /// contains no compiled regular expression.
  //------------------------------------------------------------------
  RegularExpression();

  explicit RegularExpression(llvm::StringRef string);

  //------------------------------------------------------------------
  /// Destructor.
  ///
  /// Any previously compiled regular expression contained in this object will
  /// be freed.
  //------------------------------------------------------------------
  ~RegularExpression();

  RegularExpression(const RegularExpression &rhs);

  const RegularExpression &operator=(const RegularExpression &rhs);

  //------------------------------------------------------------------
  /// Compile a regular expression.
  ///
  /// Compile a regular expression using the supplied regular expression text.
  /// The compiled regular expression lives in this object so that it can be
  /// readily used for regular expression matches. Execute() can be called
  /// after the regular expression is compiled. Any previously compiled
  /// regular expression contained in this object will be freed.
  ///
  /// @param[in] re
  ///     A NULL terminated C string that represents the regular
  ///     expression to compile.
  ///
  /// @return
  ///     \b true if the regular expression compiles successfully,
  ///     \b false otherwise.
  //------------------------------------------------------------------
  bool Compile(llvm::StringRef string);
  bool Compile(const char *) = delete;

  //------------------------------------------------------------------
  /// Executes a regular expression.
  ///
  /// Execute a regular expression match using the compiled regular expression
  /// that is already in this object against the match string \a s. If any
  /// parens are used for regular expression matches \a match_count should
  /// indicate the number of regmatch_t values that are present in \a
  /// match_ptr.
  ///
  /// @param[in] string
  ///     The string to match against the compile regular expression.
  ///
  /// @param[in] match
  ///     A pointer to a RegularExpression::Match structure that was
  ///     properly initialized with the desired number of maximum
  ///     matches, or nullptr if no parenthesized matching is needed.
  ///
  /// @return
  ///     \b true if \a string matches the compiled regular
  ///     expression, \b false otherwise.
  //------------------------------------------------------------------
  bool Execute(llvm::StringRef string, Match *match = nullptr) const;
  bool Execute(const char *, Match * = nullptr) = delete;

  size_t GetErrorAsCString(char *err_str, size_t err_str_max_len) const;

  //------------------------------------------------------------------
  /// Free the compiled regular expression.
  ///
  /// If this object contains a valid compiled regular expression, this
  /// function will free any resources it was consuming.
  //------------------------------------------------------------------
  void Free();

  //------------------------------------------------------------------
  /// Access the regular expression text.
  ///
  /// Returns the text that was used to compile the current regular
  /// expression.
  ///
  /// @return
  ///     The NULL terminated C string that was used to compile the
  ///     current regular expression
  //------------------------------------------------------------------
  llvm::StringRef GetText() const;

  //------------------------------------------------------------------
  /// Test if valid.
  ///
  /// Test if this object contains a valid regular expression.
  ///
  /// @return
  ///     \b true if the regular expression compiled and is ready
  ///     for execution, \b false otherwise.
  //------------------------------------------------------------------
  bool IsValid() const;

  void Clear() {
    Free();
    m_re.clear();
    m_comp_err = 1;
  }

  int GetErrorCode() const { return m_comp_err; }

  bool operator<(const RegularExpression &rhs) const;

private:
  //------------------------------------------------------------------
  // Member variables
  //------------------------------------------------------------------
  std::string m_re; ///< A copy of the original regular expression text
  int m_comp_err;   ///< Status code for the regular expression compilation
  regex_t m_preg;   ///< The compiled regular expression
};

} // namespace lldb_private

#endif // liblldb_RegularExpression_h_
