Loading...
osfmk/libsa/string.h xnu-12377.121.6 xnu-792
--- xnu/xnu-12377.121.6/osfmk/libsa/string.h
+++ xnu/xnu-792/osfmk/libsa/string.h
@@ -1,966 +1,66 @@
 /*
- * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
- *
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. The rights granted to you under the License
- * may not be used to create, or enable the creation or redistribution of,
- * unlawful or unlicensed copies of an Apple operating system, or to
- * circumvent, violate, or enable the circumvention or violation of, any
- * terms of an Apple operating system software license agreement.
- *
- * Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- *
- * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
  */
 /*
- * NOTICE: This file was modified by McAfee Research in 2004 to introduce
- * support for mandatory and extensible security protections.  This notice
- * is included in support of clause 2.2 (b) of the Apple Public License,
- * Version 2.0.
- */
-/*
- * HISTORY
  * @OSF_COPYRIGHT@
  */
+#ifndef	_STRING_H_
+#define	_STRING_H_	1
 
-#if (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT))
-
-#if !__has_include_next(<string.h>)
-#error Do not build with -nostdinc (use GCC_USE_STANDARD_INCLUDE_SEARCHING=NO)
-#endif /* !__has_include_next(<string.h>) */
-
-#include_next <string.h>
-
-#else /* (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT)) */
-
-#ifndef _STRING_H_
-#define _STRING_H_      1
-
-#include <sys/cdefs.h>
 #ifdef MACH_KERNEL_PRIVATE
 #include <types.h>
-#else /* MACH_KERNEL_PRIVATE */
+#else
 #include <sys/types.h>
-#endif /* MACH_KERNEL_PRIVATE */
-
-#ifdef KERNEL
-#include <machine/trap.h>
-#endif /* KERNEL */
-
-__BEGIN_DECLS
-
-#ifndef NULL
-#if defined (__cplusplus)
-#if __cplusplus >= 201103L
-#define NULL nullptr
-#else
-#define NULL 0
-#endif
-#else
-#define NULL ((void *)0)
-#endif
 #endif
 
-/*
- * Memory functions
- *
- *   int bcmp(const void *s1, const void *s2, size_t n);
- *   int memcmp(const void *s1, const void *s2, size_t n);
- *   int timingsafe_bcmp(const void *b1, const void *b2, size_t n);
- *
- *   void bzero(void *dst, size_t n);
- *   void *memset(void *s, int c, size_t n);
- *   int memset_s(void *s, size_t smax, int c, size_t n);
- *
- *   void bcopy(const void *src, void *dst, size_t n);
- *   void *memcpy(void *dst, const void *src, size_t n);
- *   void *memove(void *dst, const void *src, size_t n);
- *
- *
- * String functions
- *
- *   size_t strlen(const char *s);
- *   size_t strnlen(const char *s, size_t n);
- *
- *   int strcmp(const char *s1, const char *s2);
- *   int strncmp(const char *s1, const char *s2, size_t n);
- *   int strlcmp(const char *s1, const char *s2, size_t n);
- *   int strbufcmp(const char *s1, size_t n1, const char *s2, size_t n2);
- *   int strprefix(const char *s1, const char *s2);
- *   int strcasecmp(const char *s1, const char *s2);
- *   int strncasecmp(const char *s1, const char *s2, size_t n);
- *   int strlcasecmp(const char *s1, const char *s2, size_t n);
- *   int strbufcasecmp(const char *s1, size_t n1, const char *s2, size_t n2);
- *
- *   char *strchr(const char *s, int c);
- *   char *strrchr(const char *s, int c);
- *   char *strnstr(const char *s, const char *find, size_t slen);
- *
- *   size_t strlcpy(char *dst, const char *src, size_t n);
- *   const char *strbufcpy(char *dst, size_t dstlen, const char *src, size_t srclen);
- *   size_t strlcat(char *dst, const char *src, size_t n);
- *   const char *strbufcat(char *dst, size_t dstlen, const char *src, size_t srclen);
- *   char * __null_terminated strlcpy_ret(char *dst, const char *src, size_t n);
- */
-
-
-#pragma mark _FORTIFY_SOURCE helpers
-
-/*
- * If _FORTIFY_SOURCE is undefined, it is assumed to be 1.
- *
- * _FORTIFY_SOURCE > 0 will enable checked memory/string functions.
- *
- * _FORTIFY_SOURCE_STRICT will enable stricter checking (optional)
- * for memcpy/memmove/bcopy and will check that copies do not go
- * past the end of a struct member.
- */
-#if KASAN
-#  define __XNU_FORTIFY_SOURCE          0 /* kasan is a superset */
-#elif defined (_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 0
-#  define __XNU_FORTIFY_SOURCE          0 /* forcefully disabled */
-#elif XNU_KERNEL_PRIVATE || defined(_FORTIFY_SOURCE_STRICT)
-#  define __XNU_FORTIFY_SOURCE          2
-#else
-#  define __XNU_FORTIFY_SOURCE          1
+#ifdef __cplusplus
+extern "C" {
 #endif
 
-/*
- * The overloadable attribute is load bearing in two major ways:
- * - __builtin_${function} from ${function} would be infinite recursion and UB,
- * - we need to still expose the regular prototype for people wanting to take
- *   its address.
- */
-#define __xnu_string_inline \
-	static inline __attribute__((__always_inline__, __overloadable__))
-
-/*
- * We want to allow certain functions like strlen() to constant fold
- * at compile time (such as strlen("foo")).
- *
- * In order to do so, we need an overload that has a similar looking
- * signature but is different from the regular function so that it can
- * call its matching builtin without causing UB due to inifinite recursion.
- * We abuse that the pass_object_size class of attributes gives us
- * precisely that semantics.
- */
-#define __xnu_force_overload            __xnu_pass_object_size
-
-/*
- * The object_size extension defines two kinds of size: the "struct size" and
- * the "member size". The "struct size" is the size of the buffer from the
- * starting address to the end of the largest enclosing object. The "member
- * size" is the size of the buffer from the starting address to the end of the
- * immediately enclosing array. For instance, given this:
- *
- *  struct foo {
- *      char a[20];
- *      char b[20];
- *  } my_foo;
- *
- * The "struct size" for &my_foo.a[10] is 30 (`sizeof(struct foo) -
- * offsetof(struct foo, a[10])`), and the "member size" for it is 10
- * (`sizeof(my_foo.a) - 10`).
- *
- * In general, you should use the member size for string operations (as it is
- * always a mistake to go out of bounds of a char buffer with a string
- * operation) and the struct size for bytewise operations (like bcopy, bzero,
- * memset, etc). The object_size extension is intended to provide _some_ bounds
- * safety at a low engineering cost, and various patterns intentionally
- * overflowing from individual fields with bytewise operations have
- * historically been tolerated both by engineers and the compiler (despite
- * probably being undefined).
- *
- * As an important side note, -fbounds-safety does not allow naïvely
- * overflowing from individual fields. -fbounds-safety bounds checks are always
- * equivalent to checks against the member size.
- */
-
-#if __has_builtin(__builtin_dynamic_object_size)
-#  define __xnu_pass_struct_size        __attribute__((__pass_dynamic_object_size__(0)))
-#  define __xnu_pass_member_size        __attribute__((__pass_dynamic_object_size__(1)))
-#  define __xnu_struct_size(ptr)        __builtin_dynamic_object_size(ptr, 0)
-#  define __xnu_member_size(ptr)        __builtin_dynamic_object_size(ptr, 1)
-#else
-#  define __xnu_pass_struct_size        __attribute__((__pass_object_size__(0)))
-#  define __xnu_pass_member_size        __attribute__((__pass_object_size__(1)))
-#  define __xnu_struct_size(ptr)        __builtin_object_size(ptr, 0)
-#  define __xnu_member_size(ptr)        __builtin_object_size(ptr, 1)
+#ifndef	NULL
+#define NULL	0
 #endif
 
-#if __XNU_FORTIFY_SOURCE == 0 || !__has_attribute(diagnose_if)
-#  define __xnu_struct_size_precondition(ptr, size, message)
-#  define __xnu_member_size_precondition(ptr, size, message)
-#else
-#  define __xnu_struct_size_precondition(ptr, size, message) \
-	__attribute__((__diagnose_if__(__xnu_struct_size(ptr) < (size), message, "error")))
-#  define __xnu_member_size_precondition(ptr, size, message) \
-	__attribute__((__diagnose_if__(__xnu_member_size(ptr) < (size), message, "error")))
-#endif
+extern void	*memcpy(void *, const void *, size_t);
+extern int	memcmp(const void *, const void *, size_t);
+extern void	*memmove(void *, const void *, size_t);
+extern void	*memset(void *, int, size_t);
 
+extern size_t	strlen(const char *);
+extern char	*strcpy(char *, const char *);
+extern char	*strncpy(char *, const char *, size_t);
+extern char	*strcat(char *, const char *);
+extern char	*strncat(char *, const char *, size_t);
+extern int	strcmp(const char *, const char *);
+extern int	strncmp(const char *,const char *, size_t);
+extern int	strcasecmp(const char *s1, const char *s2);
+extern int	strncasecmp(const char *s1, const char *s2, size_t n);
+extern char	*strchr(const char *s, int c);
 
-#if __XNU_FORTIFY_SOURCE > 1
-#  define __xnu_object_size_precondition(...) \
-	__xnu_member_size_precondition(__VA_ARGS__)
-#  define __xnu_object_size_check(...) \
-	__xnu_member_size_check(__VA_ARGS__)
-#  define __xnu_pass_object_size        __xnu_pass_member_size
-#else
-#  define __xnu_object_size_precondition(...) \
-	__xnu_struct_size_precondition(__VA_ARGS__)
-#  define __xnu_object_size_check(...) \
-	__xnu_struct_size_check(__VA_ARGS__)
-#  define __xnu_pass_object_size        __xnu_pass_struct_size
-#endif
+extern int	bcmp(const void *, const void *, size_t);
+extern void	bcopy(const void *, void *, size_t);
+extern void	bzero(void *, size_t);
 
-#if __XNU_FORTIFY_SOURCE == 0 || __has_ptrcheck
-#define __xnu_struct_size_check(ptr, size, how)   ((void)0)
-#define __xnu_member_size_check(ptr, size, how)   ((void)0)
-#else
-__xnu_string_inline __cold __dead2 void
-__xnu_fortify_trap_write(void)
-{
-	ml_fatal_trap(0xbffe); /* XNU_HARD_TRAP_STRING_CHK */
-}
-
-__xnu_string_inline __cold void
-__xnu_fortify_trap_read(void)
-{
-	/* for now do not emit read traps yet */
-#if 0
-	ml_recoverable_trap(0xfffe); /* XNU_SOFT_TRAP_STRING_CHK */
-#endif
-}
-
-#define __xnu_struct_size_check(ptr, size, how)  ({ \
-	if (__xnu_struct_size(ptr) < (size)) {                                  \
-	        __xnu_fortify_trap_ ## how();                                   \
-	}                                                                       \
-})
-#define __xnu_member_size_check(ptr, size, how)  ({ \
-	if (__xnu_member_size(ptr) < (size)) {                                  \
-	        __xnu_fortify_trap_ ## how();                                   \
-	}                                                                       \
-})
-#endif
-
-/*
- * Verifies at compile-time that an expression is an array (of any type).
- */
-#if __has_builtin(__builtin_types_compatible_p)
-#define __xnu_is_array(A) __builtin_types_compatible_p(typeof((A)[0])[], typeof(A))
-#else
-#define __xnu_is_array(A) 1
-#endif
-#define __xnu_assert_is_array(A, MSG) _Static_assert(__xnu_is_array(A), MSG)
-
-#define __xnu_count_args1(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, N, ...) N
-#define __xnu_count_args(...) \
-	__xnu_count_args1(, ##__VA_ARGS__, _9, _8, _7, _6, _5, _4, _3, _2, _1, _0)
-
-#define __xnu_argc_overload1(base, N, ...) __CONCAT(base, N)(__VA_ARGS__)
-#define __xnu_argc_overload(base, ...) \
-	__xnu_argc_overload1(base, __xnu_count_args(__VA_ARGS__), ##__VA_ARGS__)
-
-#pragma mark memory functions
-
-
-extern int bcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
-
-__xnu_string_inline __stateful_pure
-int
-bcmp(
-	const void *const       s1 __xnu_pass_struct_size __sized_by(n),
-	const void *const       s2 __xnu_pass_struct_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(s1, n, "read overflow (first argument)")
-__xnu_struct_size_precondition(s2, n, "read overflow (second argument)")
-{
-	extern int __xnu_bcmp(
-		const void * __sized_by(n),
-		const void * __sized_by(n),
-		size_t n) __asm("_bcmp");
-
-	__xnu_struct_size_check(s1, n, read);
-	__xnu_struct_size_check(s2, n, read);
-#if __has_builtin(__builtin_bcmp)
-	return __builtin_bcmp(s1, s2, n);
-#else
-	return __xnu_bcmp(s1, s2, n);
-#endif
-}
-
-
-extern int memcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
-
-__xnu_string_inline __stateful_pure
-int
-memcmp(
-	const void *const       s1 __xnu_pass_struct_size __sized_by(n),
-	const void *const       s2 __xnu_pass_struct_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(s1, n, "read overflow (first argument)")
-__xnu_struct_size_precondition(s2, n, "read overflow (second argument)")
-{
-	extern int __xnu_memcmp(
-		const void *__sized_by(n),
-		const void *__sized_by(n),
-		size_t n) __asm("_memcmp");
-
-	__xnu_struct_size_check(s1, n, read);
-	__xnu_struct_size_check(s2, n, read);
-#if __has_builtin(__builtin_memcmp)
-	return __builtin_memcmp(s1, s2, n);
-#else
-	return __xnu_memcmp(s1, s2, n);
-#endif
-}
-
-
-#ifdef XNU_KERNEL_PRIVATE
-/*
- * memcmp_zero_ptr_aligned() checks string s of n bytes contains all zeros.
- * Address and size of the string s must be pointer-aligned.
- * Return 0 if true, 1 otherwise. Also return 0 if n is 0.
- */
-extern unsigned long memcmp_zero_ptr_aligned(const void *s __sized_by(n), size_t n) __stateful_pure;
-#endif
-
-
-extern int timingsafe_bcmp(const void *b1 __sized_by(n), const void *b2 __sized_by(n), size_t n);
-
-
-extern void bzero(void *s __sized_by(n), size_t n);
-
-__xnu_string_inline
-void
-bzero(
-	void *const             s __xnu_pass_struct_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(s, n, "write overflow")
-{
-	extern void __xnu_bzero(
-		const void *__sized_by(n),
-		size_t n) __asm("_bzero");
-
-	__xnu_struct_size_check(s, n, write);
-#if __has_builtin(__builtin_bzero)
-	__builtin_bzero(s, n);
-#else
-	__xnu_bzero(s, n);
-#endif
-}
-
-
-extern void *memset(void *s __sized_by(n), int c, size_t n);
-
-__xnu_string_inline
-void *
-__sized_by(n)
-memset(
-	void *const             s __xnu_pass_object_size __sized_by(n),
-	int                     c,
-	size_t                  n)
-__xnu_object_size_precondition(s, n, "write overflow")
-{
-	extern void __xnu_memset(
-		void *__sized_by(n),
-		int,
-		size_t n) __asm("_memset");
-
-	__xnu_object_size_check(s, n, write);
-#if __has_builtin(__builtin_memset)
-	return __builtin_memset(s, c, n);
-#else
-	return __xnu_memset(s, c, n);
-#endif
-}
-
-
-extern int memset_s(void *s __sized_by(smax), size_t smax, int c, size_t n);
-
-
-extern void *memmove(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
-
-__xnu_string_inline
-void *
-__sized_by(n)
-memmove(
-	void *const             dst __xnu_pass_object_size __sized_by(n),
-	const void *const       src __xnu_pass_object_size __sized_by(n),
-	size_t                  n)
-__xnu_object_size_precondition(dst, n, "write overflow")
-__xnu_object_size_precondition(src, n, "read overflow")
-{
-	extern void *__xnu_memmove(
-		void *dst __sized_by(n),
-		const void *src __sized_by(n),
-		size_t n) __asm("_memmove");
-
-	__xnu_object_size_check(dst, n, write);
-	__xnu_object_size_check(src, n, read);
-#if __has_builtin(__builtin_memmove)
-	return __builtin_memmove(dst, src, n);
-#else
-	return __xnu_memmove(dst, src, n);
-#endif
-}
-
-__xnu_string_inline
-void *
-__sized_by(n)
-__nochk_memmove(
-	void *const             dst __xnu_pass_struct_size __sized_by(n),
-	const void *const       src __xnu_pass_struct_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(dst, n, "write overflow")
-__xnu_struct_size_precondition(src, n, "read overflow")
-{
-	extern void *__xnu_memmove(
-		void *dst __sized_by(n),
-		const void *src __sized_by(n),
-		size_t n) __asm("_memmove");
-
-	__xnu_struct_size_check(dst, n, write);
-	__xnu_struct_size_check(src, n, read);
-#if __has_builtin(__builtin_memmove)
-	return __builtin_memmove(dst, src, n);
-#else
-	return __xnu_memmove(dst, src, n);
-#endif
-}
-
-
-extern void bcopy(const void *src __sized_by(n), void *dst __sized_by(n), size_t n);
-
-__xnu_string_inline
-void
-bcopy(
-	const void *const       src __xnu_pass_object_size __sized_by(n),
-	void *const             dst __xnu_pass_object_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(dst, n, "write overflow")
-__xnu_struct_size_precondition(src, n, "read overflow")
-{
-	(void)memmove(dst, src, n);
-}
-
-__xnu_string_inline
-void
-__nochk_bcopy(
-	const void *const       src __xnu_pass_struct_size __sized_by(n),
-	void *const             dst __xnu_pass_struct_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(dst, n, "write overflow")
-__xnu_struct_size_precondition(src, n, "read overflow")
-{
-	(void)__nochk_memmove(dst, src, n);
-}
-
-
-extern void *memcpy(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
-
-__xnu_string_inline
-void *
-__sized_by(n)
-memcpy(
-	void *const             dst __xnu_pass_object_size __sized_by(n),
-	const void *const       src __xnu_pass_object_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(dst, n, "write overflow")
-__xnu_struct_size_precondition(src, n, "read overflow")
-{
-	return memmove(dst, src, n);
-}
-
-__xnu_string_inline
-void *
-__sized_by(n)
-__nochk_memcpy(
-	void *const             dst __xnu_pass_struct_size __sized_by(n),
-	const void *const       src __xnu_pass_struct_size __sized_by(n),
-	size_t                  n)
-__xnu_struct_size_precondition(dst, n, "write overflow")
-__xnu_struct_size_precondition(src, n, "read overflow")
-{
-	return __nochk_memmove(dst, src, n);
-}
-
-
-#pragma mark string functions
-
-extern size_t strlen(const char *__null_terminated s) __stateful_pure;
-
-#if __has_builtin(__builtin_strlen)
-__xnu_string_inline __stateful_pure
-size_t
-strlen(const char * /* __null_terminated */ const s __xnu_force_overload)
-{
-	return __builtin_strlen(s);
+#ifdef __cplusplus
 }
 #endif
 
-
-extern size_t strnlen(const char *__counted_by(n)s, size_t n) __stateful_pure;
-
-#if __has_builtin(__builtin_strnlen)
-__xnu_string_inline __stateful_pure
-size_t
-strnlen(const char *const __counted_by(n) s __xnu_force_overload, size_t n)
-{
-	return __builtin_strnlen(s, n);
-}
-#endif
-
-
-/* strbuflen is the same as strnlen. */
-#define strbuflen_1(BUF) ({ \
-	__xnu_assert_is_array(BUF, "argument is not an array"); \
-	strnlen((BUF), sizeof(BUF)); \
-})
-#define strbuflen_2(BUF, LEN) strnlen(BUF, LEN)
-#define strbuflen(...) __xnu_argc_overload(strbuflen, __VA_ARGS__)
-
-
-extern int strcmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
-
-#if __has_builtin(__builtin_strcmp)
-__xnu_string_inline __stateful_pure
-int
-strcmp(
-	const char *const /* __null_terminated */ s1 __xnu_force_overload,
-	const char *const __null_terminated s2)
-{
-	return __builtin_strcmp(s1, s2);
-}
-#else
-#endif
-
-
-__ptrcheck_unavailable_r("strlcmp or strbufcmp")
-extern int strncmp(const char *__unsafe_indexable s1, const char *__unsafe_indexable s2, size_t n) __stateful_pure;
-
-#if __has_builtin(__builtin_strncmp)
-__ptrcheck_unavailable_r("strlcmp or strbufcmp")
-__xnu_string_inline __stateful_pure
-int
-strncmp(
-	const char *const __unsafe_indexable s1 __xnu_force_overload,
-	const char *const __unsafe_indexable s2, size_t n)
-{
-	return __builtin_strncmp(s1, s2, n);
-}
-#endif
-
-/*
- * Use strlcmp if you want to compare one string with a known length (with or
- * without a NUL terminator) and one string with an unknown length (that always
- * has a NUL terminator).
- * See docs/primitives/string-handling.md for more information.
- */
-extern int strlcmp(const char *__counted_by(n)s1, const char *s2, size_t n) __stateful_pure;
-
-#if __has_builtin(__builtin_strncmp)
-__xnu_string_inline __stateful_pure
-int
-strlcmp(
-	const char *const __counted_by(s1len) s1 __xnu_force_overload,
-	const char *const s2, size_t s1len)
-__xnu_member_size_precondition(s1, s1len, "read overflow")
-{
-	extern int __xnu_strlcmp(
-		const char * __counted_by(s1len) s1,
-		const char *__null_terminated s2,
-		size_t s1len) __asm("_strlcmp");
-
-	__xnu_member_size_check(s1, s1len, read);
-	return __xnu_strlcmp(s1, s2, s1len);
-}
-#endif
-
-
-/*
- * Use strbufcmp if you want to compare two strings and you know both of their
- * lengths. See docs/primitives/string-handling.md for more information.
- */
-extern int strbufcmp(const char *__counted_by(s1len)s1, size_t s1len, const char *__counted_by(s2len)s2, size_t s2len) __stateful_pure;
-
-__xnu_string_inline __stateful_pure
-int
-strbufcmp(
-	const char *const __counted_by(s1len) s1 __xnu_pass_member_size, size_t s1len,
-	const char *const __counted_by(s2len) s2 __xnu_pass_member_size, size_t s2len)
-__xnu_member_size_precondition(s1, s1len, "read overflow")
-__xnu_member_size_precondition(s2, s2len, "read overflow")
-{
-	extern int __xnu_strbufcmp(
-		const char * __counted_by(s1len) s1,
-		size_t s1len,
-		const char *__counted_by(s2len) s2,
-		size_t s2len) __asm("_strbufcmp");
-
-	__xnu_member_size_check(s1, s1len, read);
-	__xnu_member_size_check(s2, s2len, read);
-	return __xnu_strbufcmp(s1, s1len, s2, s2len);
-}
-
-#define strbufcmp_2(A, B) ({ \
-	__xnu_assert_is_array(A, "first argument is not an array"); \
-	__xnu_assert_is_array(B, "second argument is not an array"); \
-	(strbufcmp)((A), sizeof(A), (B), sizeof(B)); \
-})
-#define strbufcmp_4 (strbufcmp)
-#define strbufcmp(...) __xnu_argc_overload(strbufcmp, __VA_ARGS__)
-
-
-extern int strprefix(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
-
-
-extern int strcasecmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
-
-#if __has_builtin(__builtin_strcasecmp)
-__xnu_string_inline __stateful_pure
-int
-strcasecmp(
-	const char *const /* __null_terminated */ s1 __xnu_force_overload,
-	const char *const __null_terminated s2)
-{
-	return __builtin_strcasecmp(s1, s2);
-}
-#endif
-
-
-__ptrcheck_unavailable_r("strlcasecmp or strbufcasecmp")
-extern int strncasecmp(const char *__unsafe_indexable s1, const char *__unsafe_indexable s2, size_t n) __stateful_pure;
-
-#if __has_builtin(__builtin_strncasecmp)
-__ptrcheck_unavailable_r("strlcasecmp or strbufcasecmp")
-__xnu_string_inline __stateful_pure
-int
-strncasecmp(
-	const char *const __unsafe_indexable s1 __xnu_force_overload,
-	const char *const __unsafe_indexable s2, size_t n)
-{
-	return __builtin_strncasecmp(s1, s2, n);
-}
-#endif
-
-/*
- * Use strlcasecmp if you want to compare one string with a known length (with
- * or without a NUL terminator) and one string with an unknown length (that
- * always has a NUL terminator).
- * See docs/primitives/string-handling.md for more information.
- */
-extern int strlcasecmp(const char *__counted_by(n)s1, const char *s2, size_t n) __stateful_pure;
-
-__xnu_string_inline __stateful_pure
-int
-strlcasecmp(
-	const char *const __counted_by(s1len) s1 __xnu_force_overload,
-	const char *__null_terminated const s2, size_t s1len)
-__xnu_member_size_precondition(s1, s1len, "read overflow")
-{
-	extern int __xnu_strlcasecmp(
-		const char * __counted_by(s1len) s1,
-		const char *__null_terminated s2,
-		size_t s1len) __asm("_strlcasecmp");
-
-	__xnu_member_size_check(s1, s1len, read);
-	return __xnu_strlcasecmp(s1, s2, s1len);
-}
-
-
-/*
- * Use strbufcmp if you want to compare two strings and you know both of their
- * lengths. See docs/primitives/string-handling.md for more information.
- */
-extern int strbufcasecmp(const char *__counted_by(s1len)s1, size_t s1len, const char *__counted_by(s2len)s2, size_t s2len) __stateful_pure;
-
-__xnu_string_inline __stateful_pure
-int
-strbufcasecmp(
-	const char *const __counted_by(s1len) s1 __xnu_pass_member_size, size_t s1len,
-	const char *const __counted_by(s2len) s2 __xnu_pass_member_size, size_t s2len)
-__xnu_member_size_precondition(s1, s1len, "read overflow")
-__xnu_member_size_precondition(s2, s2len, "read overflow")
-{
-	extern int __xnu_strbufcasecmp(
-		const char * __counted_by(s1len) s1,
-		size_t s1len,
-		const char *__counted_by(s2len) s2,
-		size_t s2len) __asm("_strbufcasecmp");
-
-	__xnu_member_size_check(s1, s1len, read);
-	__xnu_member_size_check(s2, s2len, read);
-	return __xnu_strbufcasecmp(s1, s1len, s2, s2len);
-}
-
-#define strbufcasecmp_2(A, B) ({ \
-	__xnu_assert_is_array(A, "first argument is not an array"); \
-	__xnu_assert_is_array(B, "second argument is not an array"); \
-	(strbufcasecmp)((A), sizeof(A), (B), sizeof(B)); \
-})
-#define strbufcasecmp_4 (strbufcasecmp)
-#define strbufcasecmp(...) __xnu_argc_overload(strbufcasecmp, __VA_ARGS__)
-
-
-#if __has_builtin(__builtin_strchr)
-__xnu_string_inline
-char *__null_terminated
-strchr(const char *const /* __null_terminated */ s __xnu_force_overload, int c)
-{
-	return __unsafe_forge_null_terminated(char *, __builtin_strchr(s, c));
-}
-#endif
-
-
-#if XNU_KERNEL_PRIVATE /* rdar://103276672 */
-extern char *__null_terminated strrchr(const char *__null_terminated s, int c) __stateful_pure;
-
-#if __has_builtin(__builtin_strrchr) && !__has_ptrcheck /* rdar://103265304 */
-__xnu_string_inline
-char *__null_terminated
-strrchr(const char *const __null_terminated s __xnu_force_overload, int c)
-{
-	return __builtin_strrchr(s, c);
-}
-#endif
-#endif
-
-
-extern char *__null_terminated strnstr(const char *__null_terminated s, const char *__null_terminated find, size_t slen) __stateful_pure;
-
-
-extern size_t strlcpy(char *__counted_by(n) dst, const char *__null_terminated src, size_t n);
-
-__xnu_string_inline
-size_t
-strlcpy(
-	char *const             dst __xnu_pass_member_size __counted_by(n),
-	const char *const       src __null_terminated,
-	size_t                  n)
-__xnu_member_size_precondition(dst, n, "write overflow")
-{
-	extern size_t __xnu_strlcpy(
-		char * __counted_by(n),
-		const char *__null_terminated,
-		size_t n) __asm("_strlcpy");
-
-	__xnu_member_size_check(dst, n, write);
-#if __has_builtin(__builtin_strlcpy)
-	return __builtin_strlcpy(dst, src, n);
-#else
-	return __xnu_strlcpy(dst, src, n);
-#endif
-}
-
-/*
- * Use strlcpy_ret if all you want is the __null_terminated pointer
- * to the resulting string.
- * See docs/primitives/string-handling.md for more information.
- */
-__xnu_string_inline
-char * __null_terminated
-strlcpy_ret(
-	char *const             dst __xnu_pass_member_size __counted_by(n),
-	const char *const       src __null_terminated,
-	size_t                  n)
-__xnu_member_size_precondition(dst, n, "write overflow")
-{
-	size_t cnt = strlcpy(dst, src, n);
-	/*
-	 * Like snprintf(3), the strlcpy() returns the total length of the string they tried to create, i.e. length of `src'.
-	 */
-	if (cnt >= n) {
-		/*
-		 * The output string has been truncated. The terminating NUL is at `dst + (n - 1)'.
-		 */
-		return __unsafe_null_terminated_from_indexable(dst, dst + (n - 1));
-	} else {
-		/*
-		 * The output string hasn't been truncated. The terminating NUL is at `dst + cnt';
-		 */
-		return __unsafe_null_terminated_from_indexable(dst, dst + cnt);
-	}
-}
-
-
-/*
- * strbufcpy returns its destination as a NUL-terminated string, which makes a
- * difference when -fbounds-safety is enabled.
- * See docs/primitives/string-handling.md for more information.
- */
-extern const char *__null_terminated
-    strbufcpy(
-	char *__counted_by(dstsz) dst,
-	size_t dstsz,
-	const char *__counted_by(srcsz) src,
-	size_t srcsz);
-
-__xnu_string_inline
-const char *
-strbufcpy(
-	char *const             dst __xnu_pass_member_size __counted_by(dstsz),
-	size_t                  dstsz,
-	const char *const       src __xnu_pass_member_size __counted_by(srcsz),
-	size_t                  srcsz)
-__xnu_member_size_precondition(dst, dstsz, "write overflow")
-__xnu_member_size_precondition(src, srcsz, "read overflow")
-{
-	extern const char *__xnu_strbufcpy(
-		char *__counted_by(dstsz) dst,
-		size_t dstsz,
-		const char *__counted_by(srcsz) src,
-		size_t srcsz) __asm("_strbufcpy");
-
-	__xnu_member_size_check(dst, dstsz, write);
-	__xnu_member_size_check(src, srcsz, read);
-	return __xnu_strbufcpy(dst, dstsz, src, srcsz);
-}
-
-#define strbufcpy_2(DST, SRC) ({ \
-	__xnu_assert_is_array(DST, "dst is not an array"); \
-	__xnu_assert_is_array(SRC, "src is not an array"); \
-	(strbufcpy)((DST), sizeof(DST), (SRC), sizeof(SRC)); \
-})
-#define strbufcpy_4     (strbufcpy)
-#define strbufcpy(...)  __xnu_argc_overload(strbufcpy, __VA_ARGS__)
-
-extern size_t strlcat(char *__counted_by(n) dst, const char *__null_terminated src, size_t n);
-
-__xnu_string_inline
-size_t
-strlcat(
-	char *const             dst __xnu_pass_member_size __counted_by(n),
-	const char *const       src __null_terminated,
-	size_t                  n)
-__xnu_member_size_precondition(dst, n, "write overflow")
-{
-	extern size_t __xnu_strlcat(
-		char * __sized_by(n),
-		const char *__null_terminated,
-		size_t n) __asm("_strlcat");
-
-	__xnu_member_size_check(dst, n, write);
-#if __has_builtin(__builtin_strlcat)
-	return __builtin_strlcat(dst, src, n);
-#else
-	return __xnu_strlcat(dst, src, n);
-#endif
-}
-
-
-/*
- * strbufcat returns its destination as a NUL-terminated string, which makes a
- * difference when -fbounds-safety is enabled.
- * See docs/primitives/string-handling.md for more information.
- */
-extern const char *__null_terminated
-    strbufcat(
-	char *__counted_by(dstsz) dst,
-	size_t dstsz,
-	const char *__counted_by(srcsz) src,
-	size_t srcsz);
-
-__xnu_string_inline
-const char *
-strbufcat(
-	char *const             dst __xnu_pass_member_size __counted_by(dstsz),
-	size_t                  dstsz,
-	const char *const       src __xnu_pass_member_size __counted_by(srcsz),
-	size_t                  srcsz)
-__xnu_member_size_precondition(dst, dstsz, "write overflow")
-__xnu_member_size_precondition(src, srcsz, "read overflow")
-{
-	extern const char *__xnu_strbufcat(
-		char *__counted_by(dstsz) dst,
-		size_t dstsz,
-		const char *__counted_by(srcsz) src,
-		size_t srcsz) __asm("_strbufcat");
-
-	__xnu_member_size_check(dst, dstsz, write);
-	__xnu_member_size_check(src, srcsz, read);
-	return __xnu_strbufcat(dst, dstsz, src, srcsz);
-}
-
-#define strbufcat_2(DST, SRC) ({ \
-	__xnu_assert_is_array(DST, "dst is not an array"); \
-	__xnu_assert_is_array(SRC, "src is not an array"); \
-	(strbufcat)((DST), sizeof(DST), (SRC), sizeof(SRC)); \
-})
-#define strbufcat_4     (strbufcat)
-#define strbufcat(...) __xnu_argc_overload(strbufcat, __VA_ARGS__)
-
-#pragma mark deprecated functions
-#if !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>)
-
-/*
- * char *strncat(char *dst, const char *src, size_t n);
- * char *strncpy(char *dst, const char *src, size_t n);
- *
- * char *strcat(char *dst, const char *src);
- * char *strcpy(char *, const char *);
- *
- * char *STRDUP(const char *, int);
- */
-
-__deprecated_msg("use strlcat")
-__kpi_deprecated_arm64_macos_unavailable
-extern char *strncat(char *dst, const char *src, size_t n);
-#if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strncat_chk)
-#define strncat(dst, src, n)            __builtin___strncat_chk(dst, src, n, __xnu_member_size(dst))
-#endif
-
-
-__deprecated_msg("use strlcpy")
-__kpi_deprecated_arm64_macos_unavailable
-extern char *strncpy(char *dst, const char *src, size_t n);
-#if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strncpy_chk)
-#define strncpy(dst, src, n)            __builtin___strncpy_chk(dst, src, n, __xnu_member_size(dst))
-#endif
-
-__deprecated_msg("use strlcpy")
-__kpi_deprecated_arm64_macos_unavailable
-extern char *strcpy(char *, const char *);
-#if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strcpy_chk)
-/* rdar://103287225 */
-#define strcpy(dst, src, len)           __builtin___strcpy_chk(dst, src, __xnu_member_size(dst))
-#endif
-
-__deprecated_msg("use strlcat")
-__kpi_deprecated_arm64_macos_unavailable
-extern char *strcat(char *dst, const char *src);
-#if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strcat_chk)
-#define strcat(dst, src)                __builtin___strcat_chk(dst, src, __xnu_member_size(dst))
-#endif
-
-#if XNU_PLATFORM_MacOSX
-#ifndef KERNEL_PRIVATE
-extern char *STRDUP(const char *, int);
-#endif
-#endif /* XNU_PLATFORM_MacOSX */
-
-#endif /* !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>) */
-
-#if __has_include(<san/memintrinsics.h>)
-#include <san/memintrinsics.h>
-#endif
-
-__END_DECLS
-
-#endif  /* _STRING_H_ */
-
-#endif
+#endif	/* _STRING_H_ */