/****************************************************************************
 * include/string.h
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.  The
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 ****************************************************************************/

#ifndef __INCLUDE_STRING_H
#define __INCLUDE_STRING_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>
#include <nuttx/compiler.h>

#include <stddef.h>
#include <alloca.h>

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

#define strcoll_l(s1, s2, l)    strcoll(s1, s2)
#define strdupa(x)              strcpy(alloca(strlen(x) + 1), x)
#define strerror_l(e, l)        strerror(e)
#define strxfrm_l(s1, s2, n, l) strxfrm(s1, s2, n)

#define strndupa(x, l) ({ \
  FAR const char *__old = (x); \
  size_t __len = strnlen(__old, (l)); \
  FAR char *__new = alloca(__len + 1); \
  __new[__len] = '\0'; \
  (FAR char *)memcpy(__new, __old, __len); \
})

/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif

FAR char  *strdup(FAR const char *s) malloc_like;
FAR char  *strndup(FAR const char *s, size_t size) malloc_like;
FAR char  *strerror(int);
int        strerror_r(int, FAR char *, size_t);
size_t     strlen(FAR const char *);
size_t     strnlen(FAR const char *, size_t);
FAR char  *strcat(FAR char *, FAR const char *);
size_t     strlcat(FAR char *, FAR const char *, size_t);
FAR char  *strncat(FAR char *, FAR const char *, size_t);
int        strcmp(FAR const char *, FAR const char *);
int        strncmp(FAR const char *, FAR const char *, size_t);
int        strcoll(FAR const char *, FAR const char *s2);
FAR char  *strcpy(FAR char *dest, FAR const char *src);
FAR char  *stpcpy(FAR char *dest, FAR const char *src);
size_t     strlcpy(FAR char *dst, FAR const char *src, size_t size);
FAR char  *strncpy(FAR char *, FAR const char *, size_t);
FAR char  *stpncpy(FAR char *, FAR const char *, size_t);
FAR char  *strpbrk(FAR const char *, FAR const char *);
FAR char  *strchr(FAR const char *s, int c);
FAR char  *strchrnul(FAR const char *s, int c);
FAR char  *strrchr(FAR const char *s, int c);
size_t     strspn(FAR const char *, FAR const char *);
size_t     strcspn(FAR const char *, FAR const char *);
FAR char  *strstr(FAR const char *, FAR const char *);
FAR char  *strcasestr(FAR const char *, FAR const char *);
FAR char  *strsep(FAR char **, FAR const char *);
FAR char  *strsignal(int signum);
FAR char  *strtok(FAR char *, FAR const char *);
FAR char  *strtok_r(FAR char *, FAR const char *, FAR char **);
size_t     strxfrm(FAR char *, FAR const char *, size_t n);
int        strverscmp(FAR const char *s1, FAR const char *s2);

FAR void  *memchr(FAR const void *s, int c, size_t n);
FAR void  *memrchr(FAR const void *s, int c, size_t n);
FAR void  *rawmemchr(FAR const void *s, int c);
FAR void  *memccpy(FAR void *s1, FAR const void *s2, int c, size_t n);
int        memcmp(FAR const void *s1, FAR const void *s2, size_t n);
FAR void  *memcpy(FAR void *dest, FAR const void *src, size_t n);
FAR void  *mempcpy(FAR void *dest, FAR const void *src, size_t n);
FAR void  *memmove(FAR void *dest, FAR const void *src, size_t count);
FAR void  *memset(FAR void *s, int c, size_t n);
FAR void  *memmem(FAR const void *haystack, size_t haystacklen,
                  FAR const void *needle, size_t needlelen);

void explicit_bzero(FAR void *s, size_t n);
int timingsafe_bcmp(FAR const void *b1, FAR const void *b2, size_t n);

#ifdef __KERNEL__
#  define strdup(s)       nx_strdup(s)
#  define strndup(s,sz)   nx_strndup(s,sz)
#endif

FAR char *nx_strdup(FAR const char *s) malloc_like;
FAR char *nx_strndup(FAR const char *s, size_t size) malloc_like;

#if CONFIG_FORTIFY_SOURCE > 0
fortify_function(strcat) FAR char *strcat(FAR char *dest,
                                          FAR const char *src)
{
  fortify_assert(strlen(dest) + strlen(src) + 1 <= fortify_size(dest, 0));
  return __real_strcat(dest, src);
}

fortify_function(strlcat) size_t strlcat(FAR char *dst,
                                         FAR const char *src,
                                         size_t dsize)
{
  fortify_assert(dsize <= fortify_size(dst, 0));
  return __real_strlcat(dst, src, dsize);
}

fortify_function(strncat) FAR char *strncat(FAR char *dest,
                                            FAR const char *src,
                                            size_t n)
{
  fortify_assert(n <= fortify_size(dest, 0));
  return __real_strncat(dest, src, n);
}

fortify_function(strcpy) FAR char *strcpy(FAR char *dest,
                                          FAR const char *src)
{
  fortify_assert(strlen(src) + 1 <= fortify_size(dest, 0));
  return __real_strcpy(dest, src);
}

fortify_function(stpcpy) FAR char *stpcpy(FAR char *dest,
                                          FAR const char *src)
{
  fortify_assert(strlen(src) + 1 <= fortify_size(dest, 0));
  return __real_stpcpy(dest, src);
}

fortify_function(stpncpy) FAR char *stpncpy(FAR char *dest,
                                            FAR const char *src,
                                            size_t n)
{
  fortify_assert(n <= fortify_size(dest, 0));
  return __real_stpncpy(dest, src, n);
}

fortify_function(strlcpy) size_t strlcpy(FAR char *dst,
                                         FAR const char *src,
                                         size_t size)
{
  fortify_assert(size <= fortify_size(dst, 0));
  return __real_strlcpy(dst, src, size);
}

fortify_function(strncpy) FAR char *strncpy(FAR char *dest,
                                            FAR const char *src,
                                            size_t n)
{
  fortify_assert(n <= fortify_size(dest, 0));
  return __real_strncpy(dest, src, n);
}

fortify_function(memmove) FAR void *memmove(FAR void *dest,
                                            FAR const void *src,
                                            size_t count)
{
  fortify_assert(count <= fortify_size(dest, 0) &&
                 count <= fortify_size(src, 0));
  return __real_memmove(dest, src, count);
}

fortify_function(memcpy) FAR void *memcpy(FAR void *dest,
                                          FAR const void *src,
                                          size_t n)
{
  fortify_assert(n <= fortify_size(dest, 0) && n <= fortify_size(src, 0));
  return __real_memcpy(dest, src, n);
}

fortify_function(memset) FAR void *memset(FAR void *s, int c, size_t n)
{
  fortify_assert(n <= fortify_size(s, 0));
  return __real_memset(s, c, n);
}

fortify_function(mempcpy) FAR void *mempcpy(FAR void *dest,
                                            FAR const void *src,
                                            size_t n)
{
  fortify_assert(n <= fortify_size(dest, 0) && n <= fortify_size(src, 0));
  return __real_mempcpy(dest, src, n);
}

fortify_function(explicit_bzero) void explicit_bzero(FAR void *s,
                                                     size_t n)
{
  fortify_assert(n <= fortify_size(s, 0));
  __real_explicit_bzero(s, n);
}
#endif

#undef EXTERN
#if defined(__cplusplus)
}
#endif
#endif /* __INCLUDE_STRING_H */
