xref: /openbsd-src/gnu/llvm/libcxx/include/cstring (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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