146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_CSTRING 1146035553Spatrick#define _LIBCPP_CSTRING 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick cstring synopsis 1546035553Spatrick 1646035553SpatrickMacros: 1746035553Spatrick 1846035553Spatrick NULL 1946035553Spatrick 2046035553Spatricknamespace std 2146035553Spatrick{ 2246035553Spatrick 2346035553SpatrickTypes: 2446035553Spatrick 2546035553Spatrick size_t 2646035553Spatrick 2746035553Spatrickvoid* memcpy(void* restrict s1, const void* restrict s2, size_t n); 2846035553Spatrickvoid* memmove(void* s1, const void* s2, size_t n); 2946035553Spatrickchar* strcpy (char* restrict s1, const char* restrict s2); 3046035553Spatrickchar* strncpy(char* restrict s1, const char* restrict s2, size_t n); 3146035553Spatrickchar* strcat (char* restrict s1, const char* restrict s2); 3246035553Spatrickchar* strncat(char* restrict s1, const char* restrict s2, size_t n); 3346035553Spatrickint memcmp(const void* s1, const void* s2, size_t n); 3446035553Spatrickint strcmp (const char* s1, const char* s2); 3546035553Spatrickint strncmp(const char* s1, const char* s2, size_t n); 3646035553Spatrickint strcoll(const char* s1, const char* s2); 3746035553Spatricksize_t strxfrm(char* restrict s1, const char* restrict s2, size_t n); 3846035553Spatrickconst void* memchr(const void* s, int c, size_t n); 3946035553Spatrick void* memchr( void* s, int c, size_t n); 4046035553Spatrickconst char* strchr(const char* s, int c); 4146035553Spatrick char* strchr( char* s, int c); 4246035553Spatricksize_t strcspn(const char* s1, const char* s2); 4346035553Spatrickconst char* strpbrk(const char* s1, const char* s2); 4446035553Spatrick char* strpbrk( char* s1, const char* s2); 4546035553Spatrickconst char* strrchr(const char* s, int c); 4646035553Spatrick char* strrchr( char* s, int c); 4746035553Spatricksize_t strspn(const char* s1, const char* s2); 4846035553Spatrickconst char* strstr(const char* s1, const char* s2); 4946035553Spatrick char* strstr( char* s1, const char* s2); 5046035553Spatrickchar* strtok(char* restrict s1, const char* restrict s2); 5146035553Spatrickvoid* memset(void* s, int c, size_t n); 5246035553Spatrickchar* strerror(int errnum); 5346035553Spatricksize_t strlen(const char* s); 5446035553Spatrick 5546035553Spatrick} // std 5646035553Spatrick 5746035553Spatrick*/ 5846035553Spatrick 59*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 6046035553Spatrick#include <__config> 61*4bdff4beSrobert#include <__type_traits/is_constant_evaluated.h> 62*4bdff4beSrobert 6346035553Spatrick#include <string.h> 6446035553Spatrick 65*4bdff4beSrobert#ifndef _LIBCPP_STRING_H 66*4bdff4beSrobert# error <cstring> tried including <string.h> but didn't find libc++'s <string.h> header. \ 67*4bdff4beSrobert This usually means that your header search paths are not configured properly. \ 68*4bdff4beSrobert The header search paths should contain the C++ Standard Library headers before \ 69*4bdff4beSrobert any C Standard Library, and you are probably using compiler flags that make that \ 70*4bdff4beSrobert not be the case. 71*4bdff4beSrobert#endif 72*4bdff4beSrobert 7346035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 7446035553Spatrick# pragma GCC system_header 7546035553Spatrick#endif 7646035553Spatrick 7746035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 7846035553Spatrick 7976d0caaeSpatrickusing ::size_t _LIBCPP_USING_IF_EXISTS; 8076d0caaeSpatrickusing ::memcpy _LIBCPP_USING_IF_EXISTS; 8176d0caaeSpatrickusing ::memmove _LIBCPP_USING_IF_EXISTS; 8276d0caaeSpatrickusing ::strcpy _LIBCPP_USING_IF_EXISTS; 8376d0caaeSpatrickusing ::strncpy _LIBCPP_USING_IF_EXISTS; 8476d0caaeSpatrickusing ::strcat _LIBCPP_USING_IF_EXISTS; 8576d0caaeSpatrickusing ::strncat _LIBCPP_USING_IF_EXISTS; 8676d0caaeSpatrickusing ::memcmp _LIBCPP_USING_IF_EXISTS; 8776d0caaeSpatrickusing ::strcmp _LIBCPP_USING_IF_EXISTS; 8876d0caaeSpatrickusing ::strncmp _LIBCPP_USING_IF_EXISTS; 8976d0caaeSpatrickusing ::strcoll _LIBCPP_USING_IF_EXISTS; 9076d0caaeSpatrickusing ::strxfrm _LIBCPP_USING_IF_EXISTS; 9176d0caaeSpatrickusing ::memchr _LIBCPP_USING_IF_EXISTS; 9276d0caaeSpatrickusing ::strchr _LIBCPP_USING_IF_EXISTS; 9376d0caaeSpatrickusing ::strcspn _LIBCPP_USING_IF_EXISTS; 9476d0caaeSpatrickusing ::strpbrk _LIBCPP_USING_IF_EXISTS; 9576d0caaeSpatrickusing ::strrchr _LIBCPP_USING_IF_EXISTS; 9676d0caaeSpatrickusing ::strspn _LIBCPP_USING_IF_EXISTS; 9776d0caaeSpatrickusing ::strstr _LIBCPP_USING_IF_EXISTS; 9876d0caaeSpatrickusing ::strtok _LIBCPP_USING_IF_EXISTS; 9976d0caaeSpatrickusing ::memset _LIBCPP_USING_IF_EXISTS; 10076d0caaeSpatrickusing ::strerror _LIBCPP_USING_IF_EXISTS; 10176d0caaeSpatrickusing ::strlen _LIBCPP_USING_IF_EXISTS; 10246035553Spatrick 103*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 size_t __constexpr_strlen(const char* __str) { 104*4bdff4beSrobert // GCC currently doesn't support __builtin_strlen for heap-allocated memory during constant evaluation. 105*4bdff4beSrobert // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70816 106*4bdff4beSrobert#ifdef _LIBCPP_COMPILER_GCC 107*4bdff4beSrobert if (__libcpp_is_constant_evaluated()) { 108*4bdff4beSrobert size_t __i = 0; 109*4bdff4beSrobert for (; __str[__i] != '\0'; ++__i) 110*4bdff4beSrobert ; 111*4bdff4beSrobert return __i; 112*4bdff4beSrobert } 113*4bdff4beSrobert#endif 114*4bdff4beSrobert return __builtin_strlen(__str); 115*4bdff4beSrobert} 116*4bdff4beSrobert 117*4bdff4beSroberttemplate <class _Tp> 118*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 int 119*4bdff4beSrobert__constexpr_memcmp(const _Tp* __lhs, const _Tp* __rhs, size_t __count) { 120*4bdff4beSrobert#ifdef _LIBCPP_COMPILER_GCC 121*4bdff4beSrobert if (__libcpp_is_constant_evaluated()) { 122*4bdff4beSrobert for (; __count; --__count, ++__lhs, ++__rhs) { 123*4bdff4beSrobert if (*__lhs < *__rhs) 124*4bdff4beSrobert return -1; 125*4bdff4beSrobert if (*__rhs < *__lhs) 126*4bdff4beSrobert return 1; 127*4bdff4beSrobert } 128*4bdff4beSrobert return 0; 129*4bdff4beSrobert } 130*4bdff4beSrobert#endif 131*4bdff4beSrobert return __builtin_memcmp(__lhs, __rhs, __count); 132*4bdff4beSrobert} 133*4bdff4beSrobert 134*4bdff4beSrobertinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const char* 135*4bdff4beSrobert__constexpr_char_memchr(const char* __str, int __char, size_t __count) { 136*4bdff4beSrobert#if __has_builtin(__builtin_char_memchr) 137*4bdff4beSrobert return __builtin_char_memchr(__str, __char, __count); 138*4bdff4beSrobert#else 139*4bdff4beSrobert if (!__libcpp_is_constant_evaluated()) 140*4bdff4beSrobert return static_cast<const char*>(std::memchr(__str, __char, __count)); 141*4bdff4beSrobert for (; __count; --__count) { 142*4bdff4beSrobert if (*__str == __char) 143*4bdff4beSrobert return __str; 144*4bdff4beSrobert ++__str; 145*4bdff4beSrobert } 146*4bdff4beSrobert return nullptr; 147*4bdff4beSrobert#endif 148*4bdff4beSrobert} 149*4bdff4beSrobert 15046035553Spatrick_LIBCPP_END_NAMESPACE_STD 15146035553Spatrick 15246035553Spatrick#endif // _LIBCPP_CSTRING 153