| //===----------------------------------------------------------------------===// |
| // |
| // 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 |