/*
 * Copyright (c) 2012-2017 Roberto E. Vargas Caballero
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */
/*
 * Portions copyright (c) 2018-2025, Arm Limited and Contributors.
 * Portions copyright (c) 2023, Intel Corporation. All rights reserved.
 * All rights reserved.
 */

#ifndef STRING_H
#define STRING_H

#include <stddef.h>

/*
 * When conditions are right, the compiler may have a baked-in call that can be
 * inlined and that will be much more optimal than our generic implementation.
 * When it doesn't, it will emit a call to the original function for which we
 * provide an implementation.
 */
#define memcpy  __builtin_memcpy
#define memset  __builtin_memset
#define memcmp  __builtin_memcmp
#define memchr  __builtin_memchr
#define strcmp  __builtin_strcmp
#define strncmp __builtin_strncmp
#define strchr  __builtin_strchr
#define strlen  __builtin_strlen
#define strrchr __builtin_strrchr

int memcpy_s(void *dst, size_t dsize, const void *src, size_t ssize);
void *memmove(void *dst, const void *src, size_t len);
void *memrchr(const void *src, int c, size_t len);
size_t strnlen(const char *s, size_t maxlen);
size_t strlcpy(char * dst, const char * src, size_t dsize);
size_t strlcat(char * dst, const char * src, size_t dsize);
char *strtok_r(char *s, const char *delim, char **last);
size_t strnlen_secure(const char *str, size_t maxlen);
int strcpy_secure(char *restrict dest, size_t dest_size, const char *restrict src);

#endif /* STRING_H */
