blob: 3b55ccb148b15b795ba5e36ac57b03b3f50f6bb6 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
// Copyright (c) 2008 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#ifndef ZIRCON_KERNEL_LIB_LIBC_INCLUDE_STRING_H_
#define ZIRCON_KERNEL_LIB_LIBC_INCLUDE_STRING_H_
// Other libc++ headers use <cstring> but libc++'s <cstring> complains if it
// thinks <string.h> is not its own wrapper, which we do not need. We always
// get the kernel's <string.h> before the libc++ with the way the include paths
// are set up, which is necessary because of other headers where preempting
// libc++'s header is unavoidable for the kernel environment. So just we
// define the macro that <cstring> checks for to keep it happy.
#define _LIBCPP_STRING_H
#include <stddef.h>
#include <zircon/compiler.h>
__BEGIN_CDECLS
int memcmp(const void*, const void*, size_t) __PURE;
void* memcpy(void*, const void*, size_t);
void* memmove(void*, const void*, size_t);
void* memset(void*, int, size_t);
char* strcat(char*, const char*);
int strcmp(const char*, const char*) __PURE;
char* strcpy(char*, const char*);
size_t strlen(const char*) __PURE;
char* strncat(char*, const char*, size_t);
int strncmp(const char*, const char*, size_t) __PURE;
char* strncpy(char*, const char*, size_t);
size_t strspn(const char*, const char*) __PURE;
size_t strcspn(const char* s, const char*) __PURE;
char* strtok(char*, const char*);
int strcoll(const char* s1, const char* s2) __PURE;
size_t strxfrm(char* dest, const char* src, size_t n) __PURE;
// Not actually defined in the kernel, but <cstring> expects the declaration.
char* strerror(int);
// Nonstandard.
size_t strlcat(char*, const char*, size_t);
size_t strlcpy(char*, const char*, size_t);
int strncasecmp(const char*, const char*, size_t) __PURE;
int strnicmp(const char*, const char*, size_t) __PURE;
size_t strnlen(const char* s, size_t count) __PURE;
// Used by address sanitizer.
__typeof(memcpy) __unsanitized_memcpy;
__typeof(memmove) __unsanitized_memmove;
__typeof(memset) __unsanitized_memset;
__END_CDECLS
// C++ wants overloads for const and non-const versions of some functions.
#ifdef __cplusplus
const char* strchr(const char*, int) __asm__("strchr") __PURE;
inline char* strchr(char* s, int c) {
return const_cast<char*>(strchr(const_cast<const char*>(s), c));
}
const char* strpbrk(const char*, const char*) __asm__("strpbrk") __PURE;
inline char* strpbrk(char* s1, const char* s2) {
return const_cast<char*>(strpbrk(const_cast<const char*>(s1), s2));
}
const char* strrchr(const char*, int) __asm__("strrchr") __PURE;
inline char* strrchr(char* s, int c) {
return const_cast<char*>(strrchr(const_cast<const char*>(s), c));
}
const void* memchr(const void*, int, size_t) __asm__("memchr") __PURE;
inline void* memchr(void* s, int c, size_t n) {
return const_cast<void*>(memchr(const_cast<const void*>(s), c, n));
}
const char* strstr(const char*, const char*) __asm__("strstr") __PURE;
inline char* strstr(char* s1, const char* s2) {
return const_cast<char*>(strstr(const_cast<const char*>(s1), s2));
}
#else
void* memchr(const void*, int, size_t);
char* strchr(const char*, int) __PURE;
char* strpbrk(const char*, const char*) __PURE;
char* strrchr(const char*, int) __PURE;
char* strstr(const char*, const char*) __PURE;
#endif // __cplusplus
#endif // ZIRCON_KERNEL_LIB_LIBC_INCLUDE_STRING_H_