1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker *
5*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker * are met:
8*8d67ca89SAndroid Build Coastguard Worker * * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker * * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker * the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker * distribution.
14*8d67ca89SAndroid Build Coastguard Worker *
15*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker */
28*8d67ca89SAndroid Build Coastguard Worker
29*8d67ca89SAndroid Build Coastguard Worker #ifndef _STRING_H
30*8d67ca89SAndroid Build Coastguard Worker #define _STRING_H
31*8d67ca89SAndroid Build Coastguard Worker
32*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
33*8d67ca89SAndroid Build Coastguard Worker #include <stddef.h>
34*8d67ca89SAndroid Build Coastguard Worker #include <xlocale.h>
35*8d67ca89SAndroid Build Coastguard Worker
36*8d67ca89SAndroid Build Coastguard Worker #include <bits/strcasecmp.h>
37*8d67ca89SAndroid Build Coastguard Worker
38*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS
39*8d67ca89SAndroid Build Coastguard Worker
40*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_BSD) || defined(__USE_GNU)
41*8d67ca89SAndroid Build Coastguard Worker #include <strings.h>
42*8d67ca89SAndroid Build Coastguard Worker #endif
43*8d67ca89SAndroid Build Coastguard Worker
44*8d67ca89SAndroid Build Coastguard Worker void* _Nullable memccpy(void* _Nonnull __dst, const void* _Nonnull __src, int __stop_char, size_t __n);
45*8d67ca89SAndroid Build Coastguard Worker void* _Nullable memchr(const void* _Nonnull __s, int __ch, size_t __n) __attribute_pure__;
46*8d67ca89SAndroid Build Coastguard Worker #if defined(__cplusplus)
47*8d67ca89SAndroid Build Coastguard Worker extern "C++" void* _Nullable memrchr(void* _Nonnull __s, int __ch, size_t __n) __RENAME(memrchr) __attribute_pure__;
48*8d67ca89SAndroid Build Coastguard Worker extern "C++" const void* _Nullable memrchr(const void* _Nonnull __s, int __ch, size_t __n) __RENAME(memrchr) __attribute_pure__;
49*8d67ca89SAndroid Build Coastguard Worker #else
50*8d67ca89SAndroid Build Coastguard Worker void* _Nullable memrchr(const void* _Nonnull __s, int __ch, size_t __n) __attribute_pure__;
51*8d67ca89SAndroid Build Coastguard Worker #endif
52*8d67ca89SAndroid Build Coastguard Worker int memcmp(const void* _Nonnull __lhs, const void* _Nonnull __rhs, size_t __n) __attribute_pure__;
53*8d67ca89SAndroid Build Coastguard Worker void* _Nonnull memcpy(void* _Nonnull, const void* _Nonnull, size_t);
54*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU)
55*8d67ca89SAndroid Build Coastguard Worker
56*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23)
57*8d67ca89SAndroid Build Coastguard Worker void* _Nonnull mempcpy(void* _Nonnull __dst, const void* _Nonnull __src, size_t __n) __INTRODUCED_IN(23);
58*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
59*8d67ca89SAndroid Build Coastguard Worker
60*8d67ca89SAndroid Build Coastguard Worker #endif
61*8d67ca89SAndroid Build Coastguard Worker void* _Nonnull memmove(void* _Nonnull __dst, const void* _Nonnull __src, size_t __n);
62*8d67ca89SAndroid Build Coastguard Worker
63*8d67ca89SAndroid Build Coastguard Worker /**
64*8d67ca89SAndroid Build Coastguard Worker * [memset(3)](https://man7.org/linux/man-pages/man3/memset.3.html) writes the
65*8d67ca89SAndroid Build Coastguard Worker * bottom 8 bits of the given int to the next `n` bytes of `dst`.
66*8d67ca89SAndroid Build Coastguard Worker *
67*8d67ca89SAndroid Build Coastguard Worker * Returns `dst`.
68*8d67ca89SAndroid Build Coastguard Worker */
69*8d67ca89SAndroid Build Coastguard Worker void* _Nonnull memset(void* _Nonnull __dst, int __ch, size_t __n);
70*8d67ca89SAndroid Build Coastguard Worker
71*8d67ca89SAndroid Build Coastguard Worker /**
72*8d67ca89SAndroid Build Coastguard Worker * [memset_explicit(3)](https://man7.org/linux/man-pages/man3/memset_explicit.3.html)
73*8d67ca89SAndroid Build Coastguard Worker * writes the bottom 8 bits of the given int to the next `n` bytes of `dst`,
74*8d67ca89SAndroid Build Coastguard Worker * but won't be optimized out by the compiler.
75*8d67ca89SAndroid Build Coastguard Worker *
76*8d67ca89SAndroid Build Coastguard Worker * Returns `dst`.
77*8d67ca89SAndroid Build Coastguard Worker */
78*8d67ca89SAndroid Build Coastguard Worker
79*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(34)
80*8d67ca89SAndroid Build Coastguard Worker void* _Nonnull memset_explicit(void* _Nonnull __dst, int __ch, size_t __n) __INTRODUCED_IN(34);
81*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(34) */
82*8d67ca89SAndroid Build Coastguard Worker
83*8d67ca89SAndroid Build Coastguard Worker
84*8d67ca89SAndroid Build Coastguard Worker void* _Nullable memmem(const void* _Nonnull __haystack, size_t __haystack_size, const void* _Nonnull __needle, size_t __needle_size) __attribute_pure__;
85*8d67ca89SAndroid Build Coastguard Worker
86*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strchr(const char* _Nonnull __s, int __ch) __attribute_pure__;
87*8d67ca89SAndroid Build Coastguard Worker char* _Nullable __strchr_chk(const char* _Nonnull __s, int __ch, size_t __n);
88*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU)
89*8d67ca89SAndroid Build Coastguard Worker #if defined(__cplusplus)
90*8d67ca89SAndroid Build Coastguard Worker
91*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(24)
92*8d67ca89SAndroid Build Coastguard Worker extern "C++" char* _Nonnull strchrnul(char* _Nonnull __s, int __ch) __RENAME(strchrnul) __attribute_pure__ __INTRODUCED_IN(24);
93*8d67ca89SAndroid Build Coastguard Worker extern "C++" const char* _Nonnull strchrnul(const char* _Nonnull __s, int __ch) __RENAME(strchrnul) __attribute_pure__ __INTRODUCED_IN(24);
94*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(24) */
95*8d67ca89SAndroid Build Coastguard Worker
96*8d67ca89SAndroid Build Coastguard Worker #else
97*8d67ca89SAndroid Build Coastguard Worker
98*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(24)
99*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strchrnul(const char* _Nonnull __s, int __ch) __attribute_pure__ __INTRODUCED_IN(24);
100*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(24) */
101*8d67ca89SAndroid Build Coastguard Worker
102*8d67ca89SAndroid Build Coastguard Worker #endif
103*8d67ca89SAndroid Build Coastguard Worker #endif
104*8d67ca89SAndroid Build Coastguard Worker
105*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strrchr(const char* _Nonnull __s, int __ch) __attribute_pure__;
106*8d67ca89SAndroid Build Coastguard Worker char* _Nullable __strrchr_chk(const char* _Nonnull __s, int __ch, size_t __n);
107*8d67ca89SAndroid Build Coastguard Worker
108*8d67ca89SAndroid Build Coastguard Worker size_t strlen(const char* _Nonnull __s) __attribute_pure__;
109*8d67ca89SAndroid Build Coastguard Worker size_t __strlen_chk(const char* _Nonnull __s, size_t __n);
110*8d67ca89SAndroid Build Coastguard Worker
111*8d67ca89SAndroid Build Coastguard Worker int strcmp(const char* _Nonnull __lhs, const char* _Nonnull __rhs) __attribute_pure__;
112*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull stpcpy(char* _Nonnull __dst, const char* _Nonnull __src);
113*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strcpy(char* _Nonnull __dst, const char* _Nonnull __src);
114*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strcat(char* _Nonnull __dst, const char* _Nonnull __src);
115*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strdup(const char* _Nonnull __s);
116*8d67ca89SAndroid Build Coastguard Worker
117*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strstr(const char* _Nonnull __haystack, const char* _Nonnull __needle) __attribute_pure__;
118*8d67ca89SAndroid Build Coastguard Worker #if defined(__cplusplus)
119*8d67ca89SAndroid Build Coastguard Worker extern "C++" char* _Nullable strcasestr(char* _Nonnull, const char* _Nonnull) __RENAME(strcasestr) __attribute_pure__;
120*8d67ca89SAndroid Build Coastguard Worker extern "C++" const char* _Nullable strcasestr(const char* _Nonnull, const char* _Nonnull) __RENAME(strcasestr) __attribute_pure__;
121*8d67ca89SAndroid Build Coastguard Worker #else
122*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strcasestr(const char* _Nonnull __haystack, const char* _Nonnull __needle) __attribute_pure__;
123*8d67ca89SAndroid Build Coastguard Worker #endif
124*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strtok(char* _Nullable __s, const char* _Nonnull __delimiter);
125*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strtok_r(char* _Nullable __s, const char* _Nonnull __delimiter, char* _Nonnull * _Nonnull __pos_ptr);
126*8d67ca89SAndroid Build Coastguard Worker
127*8d67ca89SAndroid Build Coastguard Worker /**
128*8d67ca89SAndroid Build Coastguard Worker * [strerror(3)](https://man7.org/linux/man-pages/man3/strerror.3.html)
129*8d67ca89SAndroid Build Coastguard Worker * returns a string describing the given errno value.
130*8d67ca89SAndroid Build Coastguard Worker * `strerror(EINVAL)` would return "Invalid argument", for example.
131*8d67ca89SAndroid Build Coastguard Worker *
132*8d67ca89SAndroid Build Coastguard Worker * On Android, unknown errno values return a string such as "Unknown error 666".
133*8d67ca89SAndroid Build Coastguard Worker * These unknown errno value strings live in thread-local storage, and are valid
134*8d67ca89SAndroid Build Coastguard Worker * until the next call of strerror() on the same thread.
135*8d67ca89SAndroid Build Coastguard Worker *
136*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a string.
137*8d67ca89SAndroid Build Coastguard Worker */
138*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strerror(int __errno_value);
139*8d67ca89SAndroid Build Coastguard Worker
140*8d67ca89SAndroid Build Coastguard Worker /**
141*8d67ca89SAndroid Build Coastguard Worker * Equivalent to strerror() on Android where only C/POSIX locales are available.
142*8d67ca89SAndroid Build Coastguard Worker */
143*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strerror_l(int __errno_value, locale_t _Nonnull __l) __RENAME(strerror);
144*8d67ca89SAndroid Build Coastguard Worker
145*8d67ca89SAndroid Build Coastguard Worker /**
146*8d67ca89SAndroid Build Coastguard Worker * [strerror_r(3)](https://man7.org/linux/man-pages/man3/strerror_r.3.html)
147*8d67ca89SAndroid Build Coastguard Worker * writes a string describing the given errno value into the given buffer.
148*8d67ca89SAndroid Build Coastguard Worker *
149*8d67ca89SAndroid Build Coastguard Worker * There are two variants of this function, POSIX and GNU.
150*8d67ca89SAndroid Build Coastguard Worker * The GNU variant returns a pointer to the buffer.
151*8d67ca89SAndroid Build Coastguard Worker * The POSIX variant returns 0 on success or an errno value on failure.
152*8d67ca89SAndroid Build Coastguard Worker *
153*8d67ca89SAndroid Build Coastguard Worker * The GNU variant is available since API level 23 if `_GNU_SOURCE` is defined.
154*8d67ca89SAndroid Build Coastguard Worker * The POSIX variant is available otherwise.
155*8d67ca89SAndroid Build Coastguard Worker */
156*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU) && __ANDROID_API__ >= 23
157*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strerror_r(int __errno_value, char* _Nullable __buf, size_t __n) __RENAME(__gnu_strerror_r) __INTRODUCED_IN(23);
158*8d67ca89SAndroid Build Coastguard Worker #else /* POSIX */
159*8d67ca89SAndroid Build Coastguard Worker int strerror_r(int __errno_value, char* _Nonnull __buf, size_t __n);
160*8d67ca89SAndroid Build Coastguard Worker #endif
161*8d67ca89SAndroid Build Coastguard Worker
162*8d67ca89SAndroid Build Coastguard Worker /**
163*8d67ca89SAndroid Build Coastguard Worker * [strerrorname_np(3)](https://man7.org/linux/man-pages/man3/strerrordesc_np.3.html)
164*8d67ca89SAndroid Build Coastguard Worker * returns the name of the errno constant corresponding to its argument.
165*8d67ca89SAndroid Build Coastguard Worker * `strerrorname_np(38)` would return "ENOSYS", because `ENOSYS` is errno 38. This
166*8d67ca89SAndroid Build Coastguard Worker * is mostly useful for error reporting in cases where a string like "ENOSYS" is
167*8d67ca89SAndroid Build Coastguard Worker * more readable than a string like "Function not implemented", which would be
168*8d67ca89SAndroid Build Coastguard Worker * returned by strerror().
169*8d67ca89SAndroid Build Coastguard Worker *
170*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a string, or null for unknown errno values.
171*8d67ca89SAndroid Build Coastguard Worker *
172*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35.
173*8d67ca89SAndroid Build Coastguard Worker */
174*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU)
175*8d67ca89SAndroid Build Coastguard Worker
176*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35)
177*8d67ca89SAndroid Build Coastguard Worker const char* _Nullable strerrorname_np(int __errno_value) __INTRODUCED_IN(35);
178*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */
179*8d67ca89SAndroid Build Coastguard Worker
180*8d67ca89SAndroid Build Coastguard Worker #endif
181*8d67ca89SAndroid Build Coastguard Worker
182*8d67ca89SAndroid Build Coastguard Worker /**
183*8d67ca89SAndroid Build Coastguard Worker * [strerrordesc_np(3)](https://man7.org/linux/man-pages/man3/strerrordesc_np.3.html)
184*8d67ca89SAndroid Build Coastguard Worker * is like strerror() but without localization. Since Android's strerror()
185*8d67ca89SAndroid Build Coastguard Worker * does not localize, this is the same as strerror() on Android.
186*8d67ca89SAndroid Build Coastguard Worker *
187*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a string.
188*8d67ca89SAndroid Build Coastguard Worker */
189*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU)
190*8d67ca89SAndroid Build Coastguard Worker const char* _Nonnull strerrordesc_np(int __errno_value) __RENAME(strerror);
191*8d67ca89SAndroid Build Coastguard Worker #endif
192*8d67ca89SAndroid Build Coastguard Worker
193*8d67ca89SAndroid Build Coastguard Worker size_t strnlen(const char* _Nonnull __s, size_t __n) __attribute_pure__;
194*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strncat(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
195*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strndup(const char* _Nonnull __s, size_t __n);
196*8d67ca89SAndroid Build Coastguard Worker int strncmp(const char* _Nonnull __lhs, const char* _Nonnull __rhs, size_t __n) __attribute_pure__;
197*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull stpncpy(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
198*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strncpy(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
199*8d67ca89SAndroid Build Coastguard Worker
200*8d67ca89SAndroid Build Coastguard Worker size_t strlcat(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
201*8d67ca89SAndroid Build Coastguard Worker size_t strlcpy(char* _Nonnull __dst, const char* _Nonnull __src, size_t __n);
202*8d67ca89SAndroid Build Coastguard Worker
203*8d67ca89SAndroid Build Coastguard Worker size_t strcspn(const char* _Nonnull __s, const char* _Nonnull __reject) __attribute_pure__;
204*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strpbrk(const char* _Nonnull __s, const char* _Nonnull __accept) __attribute_pure__;
205*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strsep(char* _Nullable * _Nonnull __s_ptr, const char* _Nonnull __delimiter);
206*8d67ca89SAndroid Build Coastguard Worker size_t strspn(const char* _Nonnull __s, const char* _Nonnull __accept);
207*8d67ca89SAndroid Build Coastguard Worker
208*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull strsignal(int __signal);
209*8d67ca89SAndroid Build Coastguard Worker
210*8d67ca89SAndroid Build Coastguard Worker int strcoll(const char* _Nonnull __lhs, const char* _Nonnull __rhs) __attribute_pure__;
211*8d67ca89SAndroid Build Coastguard Worker size_t strxfrm(char* __BIONIC_COMPLICATED_NULLNESS __dst, const char* _Nonnull __src, size_t __n);
212*8d67ca89SAndroid Build Coastguard Worker
213*8d67ca89SAndroid Build Coastguard Worker int strcoll_l(const char* _Nonnull __lhs, const char* _Nonnull __rhs, locale_t _Nonnull __l) __attribute_pure__;
214*8d67ca89SAndroid Build Coastguard Worker size_t strxfrm_l(char* __BIONIC_COMPLICATED_NULLNESS __dst, const char* _Nonnull __src, size_t __n, locale_t _Nonnull __l);
215*8d67ca89SAndroid Build Coastguard Worker
216*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_GNU) && !defined(basename)
217*8d67ca89SAndroid Build Coastguard Worker /*
218*8d67ca89SAndroid Build Coastguard Worker * glibc has a basename in <string.h> that's different to the POSIX one in <libgen.h>.
219*8d67ca89SAndroid Build Coastguard Worker * It doesn't modify its argument, and in C++ it's const-correct.
220*8d67ca89SAndroid Build Coastguard Worker */
221*8d67ca89SAndroid Build Coastguard Worker #if defined(__cplusplus)
222*8d67ca89SAndroid Build Coastguard Worker
223*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23)
224*8d67ca89SAndroid Build Coastguard Worker extern "C++" char* _Nonnull basename(char* _Nullable __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
225*8d67ca89SAndroid Build Coastguard Worker extern "C++" const char* _Nonnull basename(const char* _Nonnull __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
226*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
227*8d67ca89SAndroid Build Coastguard Worker
228*8d67ca89SAndroid Build Coastguard Worker #else
229*8d67ca89SAndroid Build Coastguard Worker
230*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23)
231*8d67ca89SAndroid Build Coastguard Worker char* _Nonnull basename(const char* _Nonnull __path) __RENAME(__gnu_basename) __INTRODUCED_IN(23);
232*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
233*8d67ca89SAndroid Build Coastguard Worker
234*8d67ca89SAndroid Build Coastguard Worker #endif
235*8d67ca89SAndroid Build Coastguard Worker #endif
236*8d67ca89SAndroid Build Coastguard Worker
237*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC_INCLUDE_FORTIFY_HEADERS)
238*8d67ca89SAndroid Build Coastguard Worker #include <bits/fortify/string.h>
239*8d67ca89SAndroid Build Coastguard Worker #endif
240*8d67ca89SAndroid Build Coastguard Worker
241*8d67ca89SAndroid Build Coastguard Worker /* Const-correct overloads. Placed after FORTIFY so we call those functions, if possible. */
242*8d67ca89SAndroid Build Coastguard Worker #if defined(__cplusplus)
243*8d67ca89SAndroid Build Coastguard Worker /* libcxx tries to provide these. Suppress that, since libcxx's impl doesn't respect FORTIFY. */
244*8d67ca89SAndroid Build Coastguard Worker #define __CORRECT_ISO_CPP_STRING_H_PROTO
245*8d67ca89SAndroid Build Coastguard Worker /* Used to make these preferable over regular <string.h> signatures for overload resolution. */
246*8d67ca89SAndroid Build Coastguard Worker #define __prefer_this_overload __enable_if(true, "")
247*8d67ca89SAndroid Build Coastguard Worker extern "C++" {
248*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
__bionic_memchr(const void * _Nonnull const s __pass_object_size,int c,size_t n)249*8d67ca89SAndroid Build Coastguard Worker void* _Nullable __bionic_memchr(const void* _Nonnull const s __pass_object_size, int c, size_t n) {
250*8d67ca89SAndroid Build Coastguard Worker return memchr(s, c, n);
251*8d67ca89SAndroid Build Coastguard Worker }
252*8d67ca89SAndroid Build Coastguard Worker
253*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
memchr(const void * _Nonnull const s __pass_object_size,int c,size_t n)254*8d67ca89SAndroid Build Coastguard Worker const void* _Nullable memchr(const void* _Nonnull const s __pass_object_size, int c, size_t n)
255*8d67ca89SAndroid Build Coastguard Worker __prefer_this_overload {
256*8d67ca89SAndroid Build Coastguard Worker return __bionic_memchr(s, c, n);
257*8d67ca89SAndroid Build Coastguard Worker }
258*8d67ca89SAndroid Build Coastguard Worker
259*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
memchr(void * _Nonnull const s __pass_object_size,int c,size_t n)260*8d67ca89SAndroid Build Coastguard Worker void* _Nullable memchr(void* _Nonnull const s __pass_object_size, int c, size_t n) __prefer_this_overload {
261*8d67ca89SAndroid Build Coastguard Worker return __bionic_memchr(s, c, n);
262*8d67ca89SAndroid Build Coastguard Worker }
263*8d67ca89SAndroid Build Coastguard Worker
264*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
__bionic_strchr(const char * _Nonnull const s __pass_object_size,int c)265*8d67ca89SAndroid Build Coastguard Worker char* _Nullable __bionic_strchr(const char* _Nonnull const s __pass_object_size, int c) {
266*8d67ca89SAndroid Build Coastguard Worker return strchr(s, c);
267*8d67ca89SAndroid Build Coastguard Worker }
268*8d67ca89SAndroid Build Coastguard Worker
269*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strchr(const char * _Nonnull const s __pass_object_size,int c)270*8d67ca89SAndroid Build Coastguard Worker const char* _Nullable strchr(const char* _Nonnull const s __pass_object_size, int c)
271*8d67ca89SAndroid Build Coastguard Worker __prefer_this_overload {
272*8d67ca89SAndroid Build Coastguard Worker return __bionic_strchr(s, c);
273*8d67ca89SAndroid Build Coastguard Worker }
274*8d67ca89SAndroid Build Coastguard Worker
275*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strchr(char * _Nonnull const s __pass_object_size,int c)276*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strchr(char* _Nonnull const s __pass_object_size, int c)
277*8d67ca89SAndroid Build Coastguard Worker __prefer_this_overload {
278*8d67ca89SAndroid Build Coastguard Worker return __bionic_strchr(s, c);
279*8d67ca89SAndroid Build Coastguard Worker }
280*8d67ca89SAndroid Build Coastguard Worker
281*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
__bionic_strrchr(const char * _Nonnull const s __pass_object_size,int c)282*8d67ca89SAndroid Build Coastguard Worker char* _Nullable __bionic_strrchr(const char* _Nonnull const s __pass_object_size, int c) {
283*8d67ca89SAndroid Build Coastguard Worker return strrchr(s, c);
284*8d67ca89SAndroid Build Coastguard Worker }
285*8d67ca89SAndroid Build Coastguard Worker
286*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strrchr(const char * _Nonnull const s __pass_object_size,int c)287*8d67ca89SAndroid Build Coastguard Worker const char* _Nullable strrchr(const char* _Nonnull const s __pass_object_size, int c) __prefer_this_overload {
288*8d67ca89SAndroid Build Coastguard Worker return __bionic_strrchr(s, c);
289*8d67ca89SAndroid Build Coastguard Worker }
290*8d67ca89SAndroid Build Coastguard Worker
291*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strrchr(char * _Nonnull const s __pass_object_size,int c)292*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strrchr(char* _Nonnull const s __pass_object_size, int c) __prefer_this_overload {
293*8d67ca89SAndroid Build Coastguard Worker return __bionic_strrchr(s, c);
294*8d67ca89SAndroid Build Coastguard Worker }
295*8d67ca89SAndroid Build Coastguard Worker
296*8d67ca89SAndroid Build Coastguard Worker /* Functions with no FORTIFY counterpart. */
297*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
__bionic_strstr(const char * _Nonnull h,const char * _Nonnull n)298*8d67ca89SAndroid Build Coastguard Worker char* _Nullable __bionic_strstr(const char* _Nonnull h, const char* _Nonnull n) { return strstr(h, n); }
299*8d67ca89SAndroid Build Coastguard Worker
300*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strstr(const char * _Nonnull h,const char * _Nonnull n)301*8d67ca89SAndroid Build Coastguard Worker const char* _Nullable strstr(const char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
302*8d67ca89SAndroid Build Coastguard Worker return __bionic_strstr(h, n);
303*8d67ca89SAndroid Build Coastguard Worker }
304*8d67ca89SAndroid Build Coastguard Worker
305*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strstr(char * _Nonnull h,const char * _Nonnull n)306*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strstr(char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
307*8d67ca89SAndroid Build Coastguard Worker return __bionic_strstr(h, n);
308*8d67ca89SAndroid Build Coastguard Worker }
309*8d67ca89SAndroid Build Coastguard Worker
310*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
__bionic_strpbrk(const char * _Nonnull h,const char * _Nonnull n)311*8d67ca89SAndroid Build Coastguard Worker char* _Nullable __bionic_strpbrk(const char* _Nonnull h, const char* _Nonnull n) { return strpbrk(h, n); }
312*8d67ca89SAndroid Build Coastguard Worker
313*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strpbrk(char * _Nonnull h,const char * _Nonnull n)314*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strpbrk(char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
315*8d67ca89SAndroid Build Coastguard Worker return __bionic_strpbrk(h, n);
316*8d67ca89SAndroid Build Coastguard Worker }
317*8d67ca89SAndroid Build Coastguard Worker
318*8d67ca89SAndroid Build Coastguard Worker inline __always_inline
strpbrk(const char * _Nonnull h,const char * _Nonnull n)319*8d67ca89SAndroid Build Coastguard Worker const char* _Nullable strpbrk(const char* _Nonnull h, const char* _Nonnull n) __prefer_this_overload {
320*8d67ca89SAndroid Build Coastguard Worker return __bionic_strpbrk(h, n);
321*8d67ca89SAndroid Build Coastguard Worker }
322*8d67ca89SAndroid Build Coastguard Worker }
323*8d67ca89SAndroid Build Coastguard Worker #undef __prefer_this_overload
324*8d67ca89SAndroid Build Coastguard Worker #endif
325*8d67ca89SAndroid Build Coastguard Worker
326*8d67ca89SAndroid Build Coastguard Worker __END_DECLS
327*8d67ca89SAndroid Build Coastguard Worker
328*8d67ca89SAndroid Build Coastguard Worker #endif
329