// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/shared/regex.h"

#include <lib/syslog/cpp/macros.h>

namespace debug_ipc {

Regex::Regex() = default;

Regex::~Regex() {
  if (handle_.has_value())
    regfree(&handle_.value());
}

Regex::Regex(Regex&& other) : handle_(std::move(other.handle_)) { other.handle_.reset(); }

Regex& Regex::operator=(Regex&& other) {
  if (this == &other)
    return *this;

  handle_ = std::move(other.handle_);
  other.handle_.reset();
  return *this;
}

bool Regex::Init(const std::string& regexp, Regex::CompareType compare_type) {
  if (valid())
    return false;

  regex_t r;
  int flags = REG_EXTENDED;
  if (compare_type == Regex::CompareType::kCaseInsensitive)
    flags |= REG_ICASE;
  int status = regcomp(&r, regexp.c_str(), flags);
  if (status) {
    return false;
  }

  handle_ = r;
  return true;
}

bool Regex::Match(const std::string& candidate) const {
  FX_DCHECK(valid());

  int status = regexec(&handle_.value(), candidate.c_str(), 0, nullptr, 0);
  return status == 0;
}

}  // namespace debug_ipc
