blob: f4c339f70f9d47a6df5d344e9305a2654965912b [file] [edit]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Implementation of regcomp (stub).
///
//===----------------------------------------------------------------------===//
#include "src/regex/regcomp.h"
#include "hdr/regex_macros.h"
#include "src/__support/CPP/new.h"
#include "src/__support/CPP/string_view.h"
#include "src/__support/alloc-checker.h"
#include "src/__support/macros/config.h"
#include "src/string/memory_utils/inline_memcpy.h"
namespace LIBC_NAMESPACE_DECL {
LLVM_LIBC_FUNCTION(int, regcomp,
(regex_t *__restrict preg, const char *__restrict pattern,
int cflags)) {
// Silencing unused parameter warning for the stub.
(void)cflags;
// Note: POSIX requires callers to call regfree() before reusing a preg
// object. We therefore do not attempt to free any previous __internal here
// — preg is uninitialized on first use and the pointer would be garbage.
cpp::string_view pattern_view(pattern);
size_t len = pattern_view.size();
AllocChecker ac;
char *copy = new (ac) char[len + 1];
if (!ac)
return REG_ESPACE;
inline_memcpy(copy, pattern, len + 1);
// TODO: This is a stub. re_nsub is always 0 because parenthesised
// subexpressions are not yet parsed. REG_NOSUB is effectively always active.
preg->re_nsub = 0;
preg->__internal = copy;
return 0;
}
} // namespace LIBC_NAMESPACE_DECL