1*53ee8cc1Swenshuai.xi /* Machine-independant string function optimizations.
2*53ee8cc1Swenshuai.xi Copyright (C) 1997-2003, 2004, 2007, 2008 Free Software Foundation, Inc.
3*53ee8cc1Swenshuai.xi This file is part of the GNU C Library.
4*53ee8cc1Swenshuai.xi Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
5*53ee8cc1Swenshuai.xi
6*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or
7*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public
8*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either
9*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version.
10*53ee8cc1Swenshuai.xi
11*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful,
12*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of
13*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14*53ee8cc1Swenshuai.xi Lesser General Public License for more details.
15*53ee8cc1Swenshuai.xi
16*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public
17*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free
18*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19*53ee8cc1Swenshuai.xi 02111-1307 USA. */
20*53ee8cc1Swenshuai.xi
21*53ee8cc1Swenshuai.xi #ifndef _STRING_H
22*53ee8cc1Swenshuai.xi # error "Never use <bits/string2.h> directly; include <string.h> instead."
23*53ee8cc1Swenshuai.xi #endif
24*53ee8cc1Swenshuai.xi
25*53ee8cc1Swenshuai.xi #if !defined __NO_STRING_INLINES && !defined __BOUNDED_POINTERS__
26*53ee8cc1Swenshuai.xi
27*53ee8cc1Swenshuai.xi /* Unlike the definitions in the header <bits/string.h> the
28*53ee8cc1Swenshuai.xi definitions contained here are not optimized down to assembler
29*53ee8cc1Swenshuai.xi level. Those optimizations are not always a good idea since this
30*53ee8cc1Swenshuai.xi means the code size increases a lot. Instead the definitions here
31*53ee8cc1Swenshuai.xi optimize some functions in a way which do not dramatically
32*53ee8cc1Swenshuai.xi increase the code size and which do not use assembler. The main
33*53ee8cc1Swenshuai.xi trick is to use GCC's `__builtin_constant_p' function.
34*53ee8cc1Swenshuai.xi
35*53ee8cc1Swenshuai.xi Every function XXX which has a defined version in
36*53ee8cc1Swenshuai.xi <bits/string.h> must be accompanied by a symbol _HAVE_STRING_ARCH_XXX
37*53ee8cc1Swenshuai.xi to make sure we don't get redefinitions.
38*53ee8cc1Swenshuai.xi
39*53ee8cc1Swenshuai.xi We must use here macros instead of inline functions since the
40*53ee8cc1Swenshuai.xi trick won't work with the latter. */
41*53ee8cc1Swenshuai.xi
42*53ee8cc1Swenshuai.xi #ifndef __STRING_INLINE
43*53ee8cc1Swenshuai.xi # ifdef __cplusplus
44*53ee8cc1Swenshuai.xi # define __STRING_INLINE inline
45*53ee8cc1Swenshuai.xi # else
46*53ee8cc1Swenshuai.xi # define __STRING_INLINE __extern_inline
47*53ee8cc1Swenshuai.xi # endif
48*53ee8cc1Swenshuai.xi #endif
49*53ee8cc1Swenshuai.xi
50*53ee8cc1Swenshuai.xi #if _STRING_ARCH_unaligned
51*53ee8cc1Swenshuai.xi /* If we can do unaligned memory accesses we must know the endianess. */
52*53ee8cc1Swenshuai.xi # include <endian.h>
53*53ee8cc1Swenshuai.xi # include <bits/types.h>
54*53ee8cc1Swenshuai.xi
55*53ee8cc1Swenshuai.xi # if __BYTE_ORDER == __LITTLE_ENDIAN
56*53ee8cc1Swenshuai.xi # define __STRING2_SMALL_GET16(src, idx) \
57*53ee8cc1Swenshuai.xi (((__const unsigned char *) (__const char *) (src))[idx + 1] << 8 \
58*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx])
59*53ee8cc1Swenshuai.xi # define __STRING2_SMALL_GET32(src, idx) \
60*53ee8cc1Swenshuai.xi (((((__const unsigned char *) (__const char *) (src))[idx + 3] << 8 \
61*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx + 2]) << 8 \
62*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx + 1]) << 8 \
63*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx])
64*53ee8cc1Swenshuai.xi # else
65*53ee8cc1Swenshuai.xi # define __STRING2_SMALL_GET16(src, idx) \
66*53ee8cc1Swenshuai.xi (((__const unsigned char *) (__const char *) (src))[idx] << 8 \
67*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx + 1])
68*53ee8cc1Swenshuai.xi # define __STRING2_SMALL_GET32(src, idx) \
69*53ee8cc1Swenshuai.xi (((((__const unsigned char *) (__const char *) (src))[idx] << 8 \
70*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx + 1]) << 8 \
71*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx + 2]) << 8 \
72*53ee8cc1Swenshuai.xi | ((__const unsigned char *) (__const char *) (src))[idx + 3])
73*53ee8cc1Swenshuai.xi # endif
74*53ee8cc1Swenshuai.xi #else
75*53ee8cc1Swenshuai.xi /* These are a few types we need for the optimizations if we cannot
76*53ee8cc1Swenshuai.xi use unaligned memory accesses. */
77*53ee8cc1Swenshuai.xi # define __STRING2_COPY_TYPE(N) \
78*53ee8cc1Swenshuai.xi typedef struct { unsigned char __arr[N]; } \
79*53ee8cc1Swenshuai.xi __attribute__ ((__packed__)) __STRING2_COPY_ARR##N
80*53ee8cc1Swenshuai.xi __STRING2_COPY_TYPE (2);
81*53ee8cc1Swenshuai.xi __STRING2_COPY_TYPE (3);
82*53ee8cc1Swenshuai.xi __STRING2_COPY_TYPE (4);
83*53ee8cc1Swenshuai.xi __STRING2_COPY_TYPE (5);
84*53ee8cc1Swenshuai.xi __STRING2_COPY_TYPE (6);
85*53ee8cc1Swenshuai.xi __STRING2_COPY_TYPE (7);
86*53ee8cc1Swenshuai.xi __STRING2_COPY_TYPE (8);
87*53ee8cc1Swenshuai.xi # undef __STRING2_COPY_TYPE
88*53ee8cc1Swenshuai.xi #endif
89*53ee8cc1Swenshuai.xi
90*53ee8cc1Swenshuai.xi /* Dereferencing a pointer arg to run sizeof on it fails for the void
91*53ee8cc1Swenshuai.xi pointer case, so we use this instead.
92*53ee8cc1Swenshuai.xi Note that __x is evaluated twice. */
93*53ee8cc1Swenshuai.xi #define __string2_1bptr_p(__x) \
94*53ee8cc1Swenshuai.xi ((size_t)(const void *)((__x) + 1) - (size_t)(const void *)(__x) == 1)
95*53ee8cc1Swenshuai.xi
96*53ee8cc1Swenshuai.xi /* Set N bytes of S to C. */
97*53ee8cc1Swenshuai.xi #if !defined _HAVE_STRING_ARCH_memset
98*53ee8cc1Swenshuai.xi # if !__GNUC_PREREQ (3, 0)
99*53ee8cc1Swenshuai.xi # if _STRING_ARCH_unaligned
100*53ee8cc1Swenshuai.xi # define memset(s, c, n) \
101*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (n) && (n) <= 16 \
102*53ee8cc1Swenshuai.xi ? ((n) == 1 \
103*53ee8cc1Swenshuai.xi ? __memset_1 (s, c) \
104*53ee8cc1Swenshuai.xi : __memset_gc (s, c, n)) \
105*53ee8cc1Swenshuai.xi : (__builtin_constant_p (c) && (c) == '\0' \
106*53ee8cc1Swenshuai.xi ? ({ void *__s = (s); __bzero (__s, n); __s; }) \
107*53ee8cc1Swenshuai.xi : memset (s, c, n))))
108*53ee8cc1Swenshuai.xi
109*53ee8cc1Swenshuai.xi # define __memset_1(s, c) ({ void *__s = (s); \
110*53ee8cc1Swenshuai.xi *((__uint8_t *) __s) = (__uint8_t) c; __s; })
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi # define __memset_gc(s, c, n) \
113*53ee8cc1Swenshuai.xi ({ void *__s = (s); \
114*53ee8cc1Swenshuai.xi union { \
115*53ee8cc1Swenshuai.xi unsigned int __ui; \
116*53ee8cc1Swenshuai.xi unsigned short int __usi; \
117*53ee8cc1Swenshuai.xi unsigned char __uc; \
118*53ee8cc1Swenshuai.xi } *__u = __s; \
119*53ee8cc1Swenshuai.xi __uint8_t __c = (__uint8_t) (c); \
120*53ee8cc1Swenshuai.xi \
121*53ee8cc1Swenshuai.xi /* This `switch' statement will be removed at compile-time. */ \
122*53ee8cc1Swenshuai.xi switch ((unsigned int) (n)) \
123*53ee8cc1Swenshuai.xi { \
124*53ee8cc1Swenshuai.xi case 15: \
125*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
126*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
127*53ee8cc1Swenshuai.xi case 11: \
128*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
129*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
130*53ee8cc1Swenshuai.xi case 7: \
131*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
132*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
133*53ee8cc1Swenshuai.xi case 3: \
134*53ee8cc1Swenshuai.xi __u->__usi = (unsigned short int) __c * 0x0101; \
135*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2); \
136*53ee8cc1Swenshuai.xi __u->__uc = (unsigned char) __c; \
137*53ee8cc1Swenshuai.xi break; \
138*53ee8cc1Swenshuai.xi \
139*53ee8cc1Swenshuai.xi case 14: \
140*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
141*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
142*53ee8cc1Swenshuai.xi case 10: \
143*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
144*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
145*53ee8cc1Swenshuai.xi case 6: \
146*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
147*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
148*53ee8cc1Swenshuai.xi case 2: \
149*53ee8cc1Swenshuai.xi __u->__usi = (unsigned short int) __c * 0x0101; \
150*53ee8cc1Swenshuai.xi break; \
151*53ee8cc1Swenshuai.xi \
152*53ee8cc1Swenshuai.xi case 13: \
153*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
154*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
155*53ee8cc1Swenshuai.xi case 9: \
156*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
157*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
158*53ee8cc1Swenshuai.xi case 5: \
159*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
160*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
161*53ee8cc1Swenshuai.xi case 1: \
162*53ee8cc1Swenshuai.xi __u->__uc = (unsigned char) __c; \
163*53ee8cc1Swenshuai.xi break; \
164*53ee8cc1Swenshuai.xi \
165*53ee8cc1Swenshuai.xi case 16: \
166*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
167*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
168*53ee8cc1Swenshuai.xi case 12: \
169*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
170*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
171*53ee8cc1Swenshuai.xi case 8: \
172*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
173*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4); \
174*53ee8cc1Swenshuai.xi case 4: \
175*53ee8cc1Swenshuai.xi __u->__ui = __c * 0x01010101; \
176*53ee8cc1Swenshuai.xi case 0: \
177*53ee8cc1Swenshuai.xi break; \
178*53ee8cc1Swenshuai.xi } \
179*53ee8cc1Swenshuai.xi \
180*53ee8cc1Swenshuai.xi __s; })
181*53ee8cc1Swenshuai.xi # else
182*53ee8cc1Swenshuai.xi # define memset(s, c, n) \
183*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (c) && (c) == '\0' \
184*53ee8cc1Swenshuai.xi ? ({ void *__s = (s); __bzero (__s, n); __s; }) \
185*53ee8cc1Swenshuai.xi : memset (s, c, n)))
186*53ee8cc1Swenshuai.xi # endif
187*53ee8cc1Swenshuai.xi # endif
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi /* GCC < 3.0 optimizes memset(s, 0, n) but not bzero(s, n).
190*53ee8cc1Swenshuai.xi The optimization is broken before EGCS 1.1.
191*53ee8cc1Swenshuai.xi GCC 3.0+ has __builtin_bzero as well, but at least till GCC 3.4
192*53ee8cc1Swenshuai.xi if it decides to call the library function, it calls memset
193*53ee8cc1Swenshuai.xi and not bzero. */
194*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (2, 91)
195*53ee8cc1Swenshuai.xi # define __bzero(s, n) __builtin_memset (s, '\0', n)
196*53ee8cc1Swenshuai.xi # endif
197*53ee8cc1Swenshuai.xi
198*53ee8cc1Swenshuai.xi #endif
199*53ee8cc1Swenshuai.xi
200*53ee8cc1Swenshuai.xi
201*53ee8cc1Swenshuai.xi /* Copy N bytes from SRC to DEST, returning pointer to byte following the
202*53ee8cc1Swenshuai.xi last copied. */
203*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
204*53ee8cc1Swenshuai.xi # if !defined _HAVE_STRING_ARCH_mempcpy || defined _FORCE_INLINES
205*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_mempcpy
206*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 4)
207*53ee8cc1Swenshuai.xi # define __mempcpy(dest, src, n) __builtin_mempcpy (dest, src, n)
208*53ee8cc1Swenshuai.xi # elif __GNUC_PREREQ (3, 0)
209*53ee8cc1Swenshuai.xi # define __mempcpy(dest, src, n) \
210*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
211*53ee8cc1Swenshuai.xi && __string2_1bptr_p (src) && n <= 8 \
212*53ee8cc1Swenshuai.xi ? __builtin_memcpy (dest, src, n) + (n) \
213*53ee8cc1Swenshuai.xi : __mempcpy (dest, src, n)))
214*53ee8cc1Swenshuai.xi # else
215*53ee8cc1Swenshuai.xi # define __mempcpy(dest, src, n) \
216*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
217*53ee8cc1Swenshuai.xi && __string2_1bptr_p (src) && n <= 8 \
218*53ee8cc1Swenshuai.xi ? __mempcpy_small (dest, __mempcpy_args (src), n) \
219*53ee8cc1Swenshuai.xi : __mempcpy (dest, src, n)))
220*53ee8cc1Swenshuai.xi # endif
221*53ee8cc1Swenshuai.xi /* In glibc we use this function frequently but for namespace reasons
222*53ee8cc1Swenshuai.xi we have to use the name `__mempcpy'. */
223*53ee8cc1Swenshuai.xi # define mempcpy(dest, src, n) __mempcpy (dest, src, n)
224*53ee8cc1Swenshuai.xi # endif
225*53ee8cc1Swenshuai.xi
226*53ee8cc1Swenshuai.xi # if !__GNUC_PREREQ (3, 0) || defined _FORCE_INLINES
227*53ee8cc1Swenshuai.xi # if _STRING_ARCH_unaligned
228*53ee8cc1Swenshuai.xi # ifndef _FORCE_INLINES
229*53ee8cc1Swenshuai.xi # define __mempcpy_args(src) \
230*53ee8cc1Swenshuai.xi ((__const char *) (src))[0], ((__const char *) (src))[2], \
231*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[6], \
232*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET16 (src, 0), \
233*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET16 (src, 4), \
234*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET32 (src, 0), \
235*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET32 (src, 4)
236*53ee8cc1Swenshuai.xi # endif
237*53ee8cc1Swenshuai.xi __STRING_INLINE void *__mempcpy_small (void *, char, char, char, char,
238*53ee8cc1Swenshuai.xi __uint16_t, __uint16_t, __uint32_t,
239*53ee8cc1Swenshuai.xi __uint32_t, size_t);
240*53ee8cc1Swenshuai.xi __STRING_INLINE void *
__mempcpy_small(void * __dest1,char __src0_1,char __src2_1,char __src4_1,char __src6_1,__uint16_t __src0_2,__uint16_t __src4_2,__uint32_t __src0_4,__uint32_t __src4_4,size_t __srclen)241*53ee8cc1Swenshuai.xi __mempcpy_small (void *__dest1,
242*53ee8cc1Swenshuai.xi char __src0_1, char __src2_1, char __src4_1, char __src6_1,
243*53ee8cc1Swenshuai.xi __uint16_t __src0_2, __uint16_t __src4_2,
244*53ee8cc1Swenshuai.xi __uint32_t __src0_4, __uint32_t __src4_4,
245*53ee8cc1Swenshuai.xi size_t __srclen)
246*53ee8cc1Swenshuai.xi {
247*53ee8cc1Swenshuai.xi union {
248*53ee8cc1Swenshuai.xi __uint32_t __ui;
249*53ee8cc1Swenshuai.xi __uint16_t __usi;
250*53ee8cc1Swenshuai.xi unsigned char __uc;
251*53ee8cc1Swenshuai.xi unsigned char __c;
252*53ee8cc1Swenshuai.xi } *__u = __dest1;
253*53ee8cc1Swenshuai.xi switch ((unsigned int) __srclen)
254*53ee8cc1Swenshuai.xi {
255*53ee8cc1Swenshuai.xi case 1:
256*53ee8cc1Swenshuai.xi __u->__c = __src0_1;
257*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 1);
258*53ee8cc1Swenshuai.xi break;
259*53ee8cc1Swenshuai.xi case 2:
260*53ee8cc1Swenshuai.xi __u->__usi = __src0_2;
261*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
262*53ee8cc1Swenshuai.xi break;
263*53ee8cc1Swenshuai.xi case 3:
264*53ee8cc1Swenshuai.xi __u->__usi = __src0_2;
265*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
266*53ee8cc1Swenshuai.xi __u->__c = __src2_1;
267*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 1);
268*53ee8cc1Swenshuai.xi break;
269*53ee8cc1Swenshuai.xi case 4:
270*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
271*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
272*53ee8cc1Swenshuai.xi break;
273*53ee8cc1Swenshuai.xi case 5:
274*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
275*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
276*53ee8cc1Swenshuai.xi __u->__c = __src4_1;
277*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 1);
278*53ee8cc1Swenshuai.xi break;
279*53ee8cc1Swenshuai.xi case 6:
280*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
281*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
282*53ee8cc1Swenshuai.xi __u->__usi = __src4_2;
283*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
284*53ee8cc1Swenshuai.xi break;
285*53ee8cc1Swenshuai.xi case 7:
286*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
287*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
288*53ee8cc1Swenshuai.xi __u->__usi = __src4_2;
289*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
290*53ee8cc1Swenshuai.xi __u->__c = __src6_1;
291*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 1);
292*53ee8cc1Swenshuai.xi break;
293*53ee8cc1Swenshuai.xi case 8:
294*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
295*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
296*53ee8cc1Swenshuai.xi __u->__ui = __src4_4;
297*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
298*53ee8cc1Swenshuai.xi break;
299*53ee8cc1Swenshuai.xi }
300*53ee8cc1Swenshuai.xi return (void *) __u;
301*53ee8cc1Swenshuai.xi }
302*53ee8cc1Swenshuai.xi # else
303*53ee8cc1Swenshuai.xi # ifndef _FORCE_INLINES
304*53ee8cc1Swenshuai.xi # define __mempcpy_args(src) \
305*53ee8cc1Swenshuai.xi ((__const char *) (src))[0], \
306*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR2) \
307*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1] } }), \
308*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR3) \
309*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
310*53ee8cc1Swenshuai.xi ((__const char *) (src))[2] } }), \
311*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR4) \
312*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
313*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3] } }), \
314*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR5) \
315*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
316*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
317*53ee8cc1Swenshuai.xi ((__const char *) (src))[4] } }), \
318*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR6) \
319*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
320*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
321*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[5] } }), \
322*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR7) \
323*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
324*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
325*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[5], \
326*53ee8cc1Swenshuai.xi ((__const char *) (src))[6] } }), \
327*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR8) \
328*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
329*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
330*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[5], \
331*53ee8cc1Swenshuai.xi ((__const char *) (src))[6], ((__const char *) (src))[7] } })
332*53ee8cc1Swenshuai.xi # endif
333*53ee8cc1Swenshuai.xi __STRING_INLINE void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2,
334*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR3,
335*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4,
336*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR5,
337*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6,
338*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR7,
339*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8, size_t);
340*53ee8cc1Swenshuai.xi __STRING_INLINE void *
__mempcpy_small(void * __dest,char __src1,__STRING2_COPY_ARR2 __src2,__STRING2_COPY_ARR3 __src3,__STRING2_COPY_ARR4 __src4,__STRING2_COPY_ARR5 __src5,__STRING2_COPY_ARR6 __src6,__STRING2_COPY_ARR7 __src7,__STRING2_COPY_ARR8 __src8,size_t __srclen)341*53ee8cc1Swenshuai.xi __mempcpy_small (void *__dest, char __src1,
342*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
343*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
344*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
345*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8 __src8, size_t __srclen)
346*53ee8cc1Swenshuai.xi {
347*53ee8cc1Swenshuai.xi union {
348*53ee8cc1Swenshuai.xi char __c;
349*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR2 __sca2;
350*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR3 __sca3;
351*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4 __sca4;
352*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR5 __sca5;
353*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6 __sca6;
354*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR7 __sca7;
355*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8 __sca8;
356*53ee8cc1Swenshuai.xi } *__u = __dest;
357*53ee8cc1Swenshuai.xi switch ((unsigned int) __srclen)
358*53ee8cc1Swenshuai.xi {
359*53ee8cc1Swenshuai.xi case 1:
360*53ee8cc1Swenshuai.xi __u->__c = __src1;
361*53ee8cc1Swenshuai.xi break;
362*53ee8cc1Swenshuai.xi case 2:
363*53ee8cc1Swenshuai.xi __extension__ __u->__sca2 = __src2;
364*53ee8cc1Swenshuai.xi break;
365*53ee8cc1Swenshuai.xi case 3:
366*53ee8cc1Swenshuai.xi __extension__ __u->__sca3 = __src3;
367*53ee8cc1Swenshuai.xi break;
368*53ee8cc1Swenshuai.xi case 4:
369*53ee8cc1Swenshuai.xi __extension__ __u->__sca4 = __src4;
370*53ee8cc1Swenshuai.xi break;
371*53ee8cc1Swenshuai.xi case 5:
372*53ee8cc1Swenshuai.xi __extension__ __u->__sca5 = __src5;
373*53ee8cc1Swenshuai.xi break;
374*53ee8cc1Swenshuai.xi case 6:
375*53ee8cc1Swenshuai.xi __extension__ __u->__sca6 = __src6;
376*53ee8cc1Swenshuai.xi break;
377*53ee8cc1Swenshuai.xi case 7:
378*53ee8cc1Swenshuai.xi __extension__ __u->__sca7 = __src7;
379*53ee8cc1Swenshuai.xi break;
380*53ee8cc1Swenshuai.xi case 8:
381*53ee8cc1Swenshuai.xi __extension__ __u->__sca8 = __src8;
382*53ee8cc1Swenshuai.xi break;
383*53ee8cc1Swenshuai.xi }
384*53ee8cc1Swenshuai.xi return __extension__ ((void *) __u + __srclen);
385*53ee8cc1Swenshuai.xi }
386*53ee8cc1Swenshuai.xi # endif
387*53ee8cc1Swenshuai.xi # endif
388*53ee8cc1Swenshuai.xi # endif
389*53ee8cc1Swenshuai.xi #endif
390*53ee8cc1Swenshuai.xi
391*53ee8cc1Swenshuai.xi
392*53ee8cc1Swenshuai.xi /* Return pointer to C in S. */
393*53ee8cc1Swenshuai.xi #ifndef _HAVE_STRING_ARCH_strchr
394*53ee8cc1Swenshuai.xi extern void *__rawmemchr (const void *__s, int __c);
395*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 2)
396*53ee8cc1Swenshuai.xi # define strchr(s, c) \
397*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (c) && !__builtin_constant_p (s) \
398*53ee8cc1Swenshuai.xi && (c) == '\0' \
399*53ee8cc1Swenshuai.xi ? (char *) __rawmemchr (s, c) \
400*53ee8cc1Swenshuai.xi : __builtin_strchr (s, c)))
401*53ee8cc1Swenshuai.xi # else
402*53ee8cc1Swenshuai.xi # define strchr(s, c) \
403*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (c) && (c) == '\0' \
404*53ee8cc1Swenshuai.xi ? (char *) __rawmemchr (s, c) \
405*53ee8cc1Swenshuai.xi : strchr (s, c)))
406*53ee8cc1Swenshuai.xi # endif
407*53ee8cc1Swenshuai.xi #endif
408*53ee8cc1Swenshuai.xi
409*53ee8cc1Swenshuai.xi
410*53ee8cc1Swenshuai.xi /* Copy SRC to DEST. */
411*53ee8cc1Swenshuai.xi #if (!defined _HAVE_STRING_ARCH_strcpy && !__GNUC_PREREQ (3, 0)) \
412*53ee8cc1Swenshuai.xi || defined _FORCE_INLINES
413*53ee8cc1Swenshuai.xi # if !defined _HAVE_STRING_ARCH_strcpy && !__GNUC_PREREQ (3, 0)
414*53ee8cc1Swenshuai.xi # define strcpy(dest, src) \
415*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (src) \
416*53ee8cc1Swenshuai.xi ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
417*53ee8cc1Swenshuai.xi ? __strcpy_small (dest, __strcpy_args (src), \
418*53ee8cc1Swenshuai.xi strlen (src) + 1) \
419*53ee8cc1Swenshuai.xi : (char *) memcpy (dest, src, strlen (src) + 1)) \
420*53ee8cc1Swenshuai.xi : strcpy (dest, src)))
421*53ee8cc1Swenshuai.xi # endif
422*53ee8cc1Swenshuai.xi
423*53ee8cc1Swenshuai.xi # if _STRING_ARCH_unaligned
424*53ee8cc1Swenshuai.xi # ifndef _FORCE_INLINES
425*53ee8cc1Swenshuai.xi # define __strcpy_args(src) \
426*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET16 (src, 0), \
427*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET16 (src, 4), \
428*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET32 (src, 0), \
429*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET32 (src, 4)
430*53ee8cc1Swenshuai.xi # endif
431*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strcpy_small (char *, __uint16_t, __uint16_t,
432*53ee8cc1Swenshuai.xi __uint32_t, __uint32_t, size_t);
433*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strcpy_small(char * __dest,__uint16_t __src0_2,__uint16_t __src4_2,__uint32_t __src0_4,__uint32_t __src4_4,size_t __srclen)434*53ee8cc1Swenshuai.xi __strcpy_small (char *__dest,
435*53ee8cc1Swenshuai.xi __uint16_t __src0_2, __uint16_t __src4_2,
436*53ee8cc1Swenshuai.xi __uint32_t __src0_4, __uint32_t __src4_4,
437*53ee8cc1Swenshuai.xi size_t __srclen)
438*53ee8cc1Swenshuai.xi {
439*53ee8cc1Swenshuai.xi union {
440*53ee8cc1Swenshuai.xi __uint32_t __ui;
441*53ee8cc1Swenshuai.xi __uint16_t __usi;
442*53ee8cc1Swenshuai.xi unsigned char __uc;
443*53ee8cc1Swenshuai.xi } *__u = (void *) __dest;
444*53ee8cc1Swenshuai.xi switch ((unsigned int) __srclen)
445*53ee8cc1Swenshuai.xi {
446*53ee8cc1Swenshuai.xi case 1:
447*53ee8cc1Swenshuai.xi __u->__uc = '\0';
448*53ee8cc1Swenshuai.xi break;
449*53ee8cc1Swenshuai.xi case 2:
450*53ee8cc1Swenshuai.xi __u->__usi = __src0_2;
451*53ee8cc1Swenshuai.xi break;
452*53ee8cc1Swenshuai.xi case 3:
453*53ee8cc1Swenshuai.xi __u->__usi = __src0_2;
454*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
455*53ee8cc1Swenshuai.xi __u->__uc = '\0';
456*53ee8cc1Swenshuai.xi break;
457*53ee8cc1Swenshuai.xi case 4:
458*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
459*53ee8cc1Swenshuai.xi break;
460*53ee8cc1Swenshuai.xi case 5:
461*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
462*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
463*53ee8cc1Swenshuai.xi __u->__uc = '\0';
464*53ee8cc1Swenshuai.xi break;
465*53ee8cc1Swenshuai.xi case 6:
466*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
467*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
468*53ee8cc1Swenshuai.xi __u->__usi = __src4_2;
469*53ee8cc1Swenshuai.xi break;
470*53ee8cc1Swenshuai.xi case 7:
471*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
472*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
473*53ee8cc1Swenshuai.xi __u->__usi = __src4_2;
474*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
475*53ee8cc1Swenshuai.xi __u->__uc = '\0';
476*53ee8cc1Swenshuai.xi break;
477*53ee8cc1Swenshuai.xi case 8:
478*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
479*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
480*53ee8cc1Swenshuai.xi __u->__ui = __src4_4;
481*53ee8cc1Swenshuai.xi break;
482*53ee8cc1Swenshuai.xi }
483*53ee8cc1Swenshuai.xi return __dest;
484*53ee8cc1Swenshuai.xi }
485*53ee8cc1Swenshuai.xi # else
486*53ee8cc1Swenshuai.xi # ifndef _FORCE_INLINES
487*53ee8cc1Swenshuai.xi # define __strcpy_args(src) \
488*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR2) \
489*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], '\0' } }), \
490*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR3) \
491*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
492*53ee8cc1Swenshuai.xi '\0' } }), \
493*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR4) \
494*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
495*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], '\0' } }), \
496*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR5) \
497*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
498*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
499*53ee8cc1Swenshuai.xi '\0' } }), \
500*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR6) \
501*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
502*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
503*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], '\0' } }), \
504*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR7) \
505*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
506*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
507*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[5], \
508*53ee8cc1Swenshuai.xi '\0' } }), \
509*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR8) \
510*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
511*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
512*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[5], \
513*53ee8cc1Swenshuai.xi ((__const char *) (src))[6], '\0' } })
514*53ee8cc1Swenshuai.xi # endif
515*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strcpy_small (char *, __STRING2_COPY_ARR2,
516*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR3,
517*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4,
518*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR5,
519*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6,
520*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR7,
521*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8, size_t);
522*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strcpy_small(char * __dest,__STRING2_COPY_ARR2 __src2,__STRING2_COPY_ARR3 __src3,__STRING2_COPY_ARR4 __src4,__STRING2_COPY_ARR5 __src5,__STRING2_COPY_ARR6 __src6,__STRING2_COPY_ARR7 __src7,__STRING2_COPY_ARR8 __src8,size_t __srclen)523*53ee8cc1Swenshuai.xi __strcpy_small (char *__dest,
524*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
525*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
526*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
527*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8 __src8, size_t __srclen)
528*53ee8cc1Swenshuai.xi {
529*53ee8cc1Swenshuai.xi union {
530*53ee8cc1Swenshuai.xi char __c;
531*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR2 __sca2;
532*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR3 __sca3;
533*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4 __sca4;
534*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR5 __sca5;
535*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6 __sca6;
536*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR7 __sca7;
537*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8 __sca8;
538*53ee8cc1Swenshuai.xi } *__u = (void *) __dest;
539*53ee8cc1Swenshuai.xi switch ((unsigned int) __srclen)
540*53ee8cc1Swenshuai.xi {
541*53ee8cc1Swenshuai.xi case 1:
542*53ee8cc1Swenshuai.xi __u->__c = '\0';
543*53ee8cc1Swenshuai.xi break;
544*53ee8cc1Swenshuai.xi case 2:
545*53ee8cc1Swenshuai.xi __extension__ __u->__sca2 = __src2;
546*53ee8cc1Swenshuai.xi break;
547*53ee8cc1Swenshuai.xi case 3:
548*53ee8cc1Swenshuai.xi __extension__ __u->__sca3 = __src3;
549*53ee8cc1Swenshuai.xi break;
550*53ee8cc1Swenshuai.xi case 4:
551*53ee8cc1Swenshuai.xi __extension__ __u->__sca4 = __src4;
552*53ee8cc1Swenshuai.xi break;
553*53ee8cc1Swenshuai.xi case 5:
554*53ee8cc1Swenshuai.xi __extension__ __u->__sca5 = __src5;
555*53ee8cc1Swenshuai.xi break;
556*53ee8cc1Swenshuai.xi case 6:
557*53ee8cc1Swenshuai.xi __extension__ __u->__sca6 = __src6;
558*53ee8cc1Swenshuai.xi break;
559*53ee8cc1Swenshuai.xi case 7:
560*53ee8cc1Swenshuai.xi __extension__ __u->__sca7 = __src7;
561*53ee8cc1Swenshuai.xi break;
562*53ee8cc1Swenshuai.xi case 8:
563*53ee8cc1Swenshuai.xi __extension__ __u->__sca8 = __src8;
564*53ee8cc1Swenshuai.xi break;
565*53ee8cc1Swenshuai.xi }
566*53ee8cc1Swenshuai.xi return __dest;
567*53ee8cc1Swenshuai.xi }
568*53ee8cc1Swenshuai.xi # endif
569*53ee8cc1Swenshuai.xi #endif
570*53ee8cc1Swenshuai.xi
571*53ee8cc1Swenshuai.xi
572*53ee8cc1Swenshuai.xi /* Copy SRC to DEST, returning pointer to final NUL byte. */
573*53ee8cc1Swenshuai.xi #ifdef __USE_GNU
574*53ee8cc1Swenshuai.xi # if !defined _HAVE_STRING_ARCH_stpcpy || defined _FORCE_INLINES
575*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_stpcpy
576*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 4)
577*53ee8cc1Swenshuai.xi # define __stpcpy(dest, src) __builtin_stpcpy (dest, src)
578*53ee8cc1Swenshuai.xi # elif __GNUC_PREREQ (3, 0)
579*53ee8cc1Swenshuai.xi # define __stpcpy(dest, src) \
580*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (src) \
581*53ee8cc1Swenshuai.xi ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
582*53ee8cc1Swenshuai.xi ? __builtin_strcpy (dest, src) + strlen (src) \
583*53ee8cc1Swenshuai.xi : ((char *) (__mempcpy) (dest, src, strlen (src) + 1) \
584*53ee8cc1Swenshuai.xi - 1)) \
585*53ee8cc1Swenshuai.xi : __stpcpy (dest, src)))
586*53ee8cc1Swenshuai.xi # else
587*53ee8cc1Swenshuai.xi # define __stpcpy(dest, src) \
588*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (src) \
589*53ee8cc1Swenshuai.xi ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
590*53ee8cc1Swenshuai.xi ? __stpcpy_small (dest, __stpcpy_args (src), \
591*53ee8cc1Swenshuai.xi strlen (src) + 1) \
592*53ee8cc1Swenshuai.xi : ((char *) (__mempcpy) (dest, src, strlen (src) + 1) \
593*53ee8cc1Swenshuai.xi - 1)) \
594*53ee8cc1Swenshuai.xi : __stpcpy (dest, src)))
595*53ee8cc1Swenshuai.xi # endif
596*53ee8cc1Swenshuai.xi /* In glibc we use this function frequently but for namespace reasons
597*53ee8cc1Swenshuai.xi we have to use the name `__stpcpy'. */
598*53ee8cc1Swenshuai.xi # define stpcpy(dest, src) __stpcpy (dest, src)
599*53ee8cc1Swenshuai.xi # endif
600*53ee8cc1Swenshuai.xi
601*53ee8cc1Swenshuai.xi # if !__GNUC_PREREQ (3, 0) || defined _FORCE_INLINES
602*53ee8cc1Swenshuai.xi # if _STRING_ARCH_unaligned
603*53ee8cc1Swenshuai.xi # ifndef _FORCE_INLINES
604*53ee8cc1Swenshuai.xi # define __stpcpy_args(src) \
605*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET16 (src, 0), \
606*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET16 (src, 4), \
607*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET32 (src, 0), \
608*53ee8cc1Swenshuai.xi __extension__ __STRING2_SMALL_GET32 (src, 4)
609*53ee8cc1Swenshuai.xi # endif
610*53ee8cc1Swenshuai.xi __STRING_INLINE char *__stpcpy_small (char *, __uint16_t, __uint16_t,
611*53ee8cc1Swenshuai.xi __uint32_t, __uint32_t, size_t);
612*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__stpcpy_small(char * __dest,__uint16_t __src0_2,__uint16_t __src4_2,__uint32_t __src0_4,__uint32_t __src4_4,size_t __srclen)613*53ee8cc1Swenshuai.xi __stpcpy_small (char *__dest,
614*53ee8cc1Swenshuai.xi __uint16_t __src0_2, __uint16_t __src4_2,
615*53ee8cc1Swenshuai.xi __uint32_t __src0_4, __uint32_t __src4_4,
616*53ee8cc1Swenshuai.xi size_t __srclen)
617*53ee8cc1Swenshuai.xi {
618*53ee8cc1Swenshuai.xi union {
619*53ee8cc1Swenshuai.xi unsigned int __ui;
620*53ee8cc1Swenshuai.xi unsigned short int __usi;
621*53ee8cc1Swenshuai.xi unsigned char __uc;
622*53ee8cc1Swenshuai.xi char __c;
623*53ee8cc1Swenshuai.xi } *__u = (void *) __dest;
624*53ee8cc1Swenshuai.xi switch ((unsigned int) __srclen)
625*53ee8cc1Swenshuai.xi {
626*53ee8cc1Swenshuai.xi case 1:
627*53ee8cc1Swenshuai.xi __u->__uc = '\0';
628*53ee8cc1Swenshuai.xi break;
629*53ee8cc1Swenshuai.xi case 2:
630*53ee8cc1Swenshuai.xi __u->__usi = __src0_2;
631*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 1);
632*53ee8cc1Swenshuai.xi break;
633*53ee8cc1Swenshuai.xi case 3:
634*53ee8cc1Swenshuai.xi __u->__usi = __src0_2;
635*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
636*53ee8cc1Swenshuai.xi __u->__uc = '\0';
637*53ee8cc1Swenshuai.xi break;
638*53ee8cc1Swenshuai.xi case 4:
639*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
640*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 3);
641*53ee8cc1Swenshuai.xi break;
642*53ee8cc1Swenshuai.xi case 5:
643*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
644*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
645*53ee8cc1Swenshuai.xi __u->__uc = '\0';
646*53ee8cc1Swenshuai.xi break;
647*53ee8cc1Swenshuai.xi case 6:
648*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
649*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
650*53ee8cc1Swenshuai.xi __u->__usi = __src4_2;
651*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 1);
652*53ee8cc1Swenshuai.xi break;
653*53ee8cc1Swenshuai.xi case 7:
654*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
655*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
656*53ee8cc1Swenshuai.xi __u->__usi = __src4_2;
657*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 2);
658*53ee8cc1Swenshuai.xi __u->__uc = '\0';
659*53ee8cc1Swenshuai.xi break;
660*53ee8cc1Swenshuai.xi case 8:
661*53ee8cc1Swenshuai.xi __u->__ui = __src0_4;
662*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 4);
663*53ee8cc1Swenshuai.xi __u->__ui = __src4_4;
664*53ee8cc1Swenshuai.xi __u = __extension__ ((void *) __u + 3);
665*53ee8cc1Swenshuai.xi break;
666*53ee8cc1Swenshuai.xi }
667*53ee8cc1Swenshuai.xi return &__u->__c;
668*53ee8cc1Swenshuai.xi }
669*53ee8cc1Swenshuai.xi # else
670*53ee8cc1Swenshuai.xi # ifndef _FORCE_INLINES
671*53ee8cc1Swenshuai.xi # define __stpcpy_args(src) \
672*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR2) \
673*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], '\0' } }), \
674*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR3) \
675*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
676*53ee8cc1Swenshuai.xi '\0' } }), \
677*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR4) \
678*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
679*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], '\0' } }), \
680*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR5) \
681*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
682*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
683*53ee8cc1Swenshuai.xi '\0' } }), \
684*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR6) \
685*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
686*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
687*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], '\0' } }), \
688*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR7) \
689*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
690*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
691*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[5], \
692*53ee8cc1Swenshuai.xi '\0' } }), \
693*53ee8cc1Swenshuai.xi __extension__ ((__STRING2_COPY_ARR8) \
694*53ee8cc1Swenshuai.xi { { ((__const char *) (src))[0], ((__const char *) (src))[1], \
695*53ee8cc1Swenshuai.xi ((__const char *) (src))[2], ((__const char *) (src))[3], \
696*53ee8cc1Swenshuai.xi ((__const char *) (src))[4], ((__const char *) (src))[5], \
697*53ee8cc1Swenshuai.xi ((__const char *) (src))[6], '\0' } })
698*53ee8cc1Swenshuai.xi # endif
699*53ee8cc1Swenshuai.xi __STRING_INLINE char *__stpcpy_small (char *, __STRING2_COPY_ARR2,
700*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR3,
701*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4,
702*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR5,
703*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6,
704*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR7,
705*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8, size_t);
706*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__stpcpy_small(char * __dest,__STRING2_COPY_ARR2 __src2,__STRING2_COPY_ARR3 __src3,__STRING2_COPY_ARR4 __src4,__STRING2_COPY_ARR5 __src5,__STRING2_COPY_ARR6 __src6,__STRING2_COPY_ARR7 __src7,__STRING2_COPY_ARR8 __src8,size_t __srclen)707*53ee8cc1Swenshuai.xi __stpcpy_small (char *__dest,
708*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
709*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
710*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
711*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8 __src8, size_t __srclen)
712*53ee8cc1Swenshuai.xi {
713*53ee8cc1Swenshuai.xi union {
714*53ee8cc1Swenshuai.xi char __c;
715*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR2 __sca2;
716*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR3 __sca3;
717*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR4 __sca4;
718*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR5 __sca5;
719*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR6 __sca6;
720*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR7 __sca7;
721*53ee8cc1Swenshuai.xi __STRING2_COPY_ARR8 __sca8;
722*53ee8cc1Swenshuai.xi } *__u = (void *) __dest;
723*53ee8cc1Swenshuai.xi switch ((unsigned int) __srclen)
724*53ee8cc1Swenshuai.xi {
725*53ee8cc1Swenshuai.xi case 1:
726*53ee8cc1Swenshuai.xi __u->__c = '\0';
727*53ee8cc1Swenshuai.xi break;
728*53ee8cc1Swenshuai.xi case 2:
729*53ee8cc1Swenshuai.xi __extension__ __u->__sca2 = __src2;
730*53ee8cc1Swenshuai.xi break;
731*53ee8cc1Swenshuai.xi case 3:
732*53ee8cc1Swenshuai.xi __extension__ __u->__sca3 = __src3;
733*53ee8cc1Swenshuai.xi break;
734*53ee8cc1Swenshuai.xi case 4:
735*53ee8cc1Swenshuai.xi __extension__ __u->__sca4 = __src4;
736*53ee8cc1Swenshuai.xi break;
737*53ee8cc1Swenshuai.xi case 5:
738*53ee8cc1Swenshuai.xi __extension__ __u->__sca5 = __src5;
739*53ee8cc1Swenshuai.xi break;
740*53ee8cc1Swenshuai.xi case 6:
741*53ee8cc1Swenshuai.xi __extension__ __u->__sca6 = __src6;
742*53ee8cc1Swenshuai.xi break;
743*53ee8cc1Swenshuai.xi case 7:
744*53ee8cc1Swenshuai.xi __extension__ __u->__sca7 = __src7;
745*53ee8cc1Swenshuai.xi break;
746*53ee8cc1Swenshuai.xi case 8:
747*53ee8cc1Swenshuai.xi __extension__ __u->__sca8 = __src8;
748*53ee8cc1Swenshuai.xi break;
749*53ee8cc1Swenshuai.xi }
750*53ee8cc1Swenshuai.xi return __dest + __srclen - 1;
751*53ee8cc1Swenshuai.xi }
752*53ee8cc1Swenshuai.xi # endif
753*53ee8cc1Swenshuai.xi # endif
754*53ee8cc1Swenshuai.xi # endif
755*53ee8cc1Swenshuai.xi #endif
756*53ee8cc1Swenshuai.xi
757*53ee8cc1Swenshuai.xi
758*53ee8cc1Swenshuai.xi /* Copy no more than N characters of SRC to DEST. */
759*53ee8cc1Swenshuai.xi #ifndef _HAVE_STRING_ARCH_strncpy
760*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 2)
761*53ee8cc1Swenshuai.xi # define strncpy(dest, src, n) __builtin_strncpy (dest, src, n)
762*53ee8cc1Swenshuai.xi # else
763*53ee8cc1Swenshuai.xi # define strncpy(dest, src, n) \
764*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
765*53ee8cc1Swenshuai.xi ? (strlen (src) + 1 >= ((size_t) (n)) \
766*53ee8cc1Swenshuai.xi ? (char *) memcpy (dest, src, n) \
767*53ee8cc1Swenshuai.xi : strncpy (dest, src, n)) \
768*53ee8cc1Swenshuai.xi : strncpy (dest, src, n)))
769*53ee8cc1Swenshuai.xi # endif
770*53ee8cc1Swenshuai.xi #endif
771*53ee8cc1Swenshuai.xi
772*53ee8cc1Swenshuai.xi
773*53ee8cc1Swenshuai.xi /* Append no more than N characters from SRC onto DEST. */
774*53ee8cc1Swenshuai.xi #ifndef _HAVE_STRING_ARCH_strncat
775*53ee8cc1Swenshuai.xi # ifdef _USE_STRING_ARCH_strchr
776*53ee8cc1Swenshuai.xi # define strncat(dest, src, n) \
777*53ee8cc1Swenshuai.xi (__extension__ ({ char *__dest = (dest); \
778*53ee8cc1Swenshuai.xi __builtin_constant_p (src) && __builtin_constant_p (n) \
779*53ee8cc1Swenshuai.xi ? (strlen (src) < ((size_t) (n)) \
780*53ee8cc1Swenshuai.xi ? strcat (__dest, src) \
781*53ee8cc1Swenshuai.xi : (*((char *) __mempcpy (strchr (__dest, '\0'), \
782*53ee8cc1Swenshuai.xi src, n)) = '\0', __dest)) \
783*53ee8cc1Swenshuai.xi : strncat (dest, src, n); }))
784*53ee8cc1Swenshuai.xi # elif __GNUC_PREREQ (3, 2)
785*53ee8cc1Swenshuai.xi # define strncat(dest, src, n) __builtin_strncat (dest, src, n)
786*53ee8cc1Swenshuai.xi # else
787*53ee8cc1Swenshuai.xi # define strncat(dest, src, n) \
788*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
789*53ee8cc1Swenshuai.xi ? (strlen (src) < ((size_t) (n)) \
790*53ee8cc1Swenshuai.xi ? strcat (dest, src) \
791*53ee8cc1Swenshuai.xi : strncat (dest, src, n)) \
792*53ee8cc1Swenshuai.xi : strncat (dest, src, n)))
793*53ee8cc1Swenshuai.xi # endif
794*53ee8cc1Swenshuai.xi #endif
795*53ee8cc1Swenshuai.xi
796*53ee8cc1Swenshuai.xi
797*53ee8cc1Swenshuai.xi /* Compare characters of S1 and S2. */
798*53ee8cc1Swenshuai.xi #ifndef _HAVE_STRING_ARCH_strcmp
799*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 2)
800*53ee8cc1Swenshuai.xi # define strcmp(s1, s2) \
801*53ee8cc1Swenshuai.xi __extension__ \
802*53ee8cc1Swenshuai.xi ({ size_t __s1_len, __s2_len; \
803*53ee8cc1Swenshuai.xi (__builtin_constant_p (s1) && __builtin_constant_p (s2) \
804*53ee8cc1Swenshuai.xi && (__s1_len = strlen (s1), __s2_len = strlen (s2), \
805*53ee8cc1Swenshuai.xi (!__string2_1bptr_p (s1) || __s1_len >= 4) \
806*53ee8cc1Swenshuai.xi && (!__string2_1bptr_p (s2) || __s2_len >= 4)) \
807*53ee8cc1Swenshuai.xi ? __builtin_strcmp (s1, s2) \
808*53ee8cc1Swenshuai.xi : (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
809*53ee8cc1Swenshuai.xi && (__s1_len = strlen (s1), __s1_len < 4) \
810*53ee8cc1Swenshuai.xi ? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
811*53ee8cc1Swenshuai.xi ? __builtin_strcmp (s1, s2) \
812*53ee8cc1Swenshuai.xi : __strcmp_cg (s1, s2, __s1_len)) \
813*53ee8cc1Swenshuai.xi : (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
814*53ee8cc1Swenshuai.xi && (__s2_len = strlen (s2), __s2_len < 4) \
815*53ee8cc1Swenshuai.xi ? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
816*53ee8cc1Swenshuai.xi ? __builtin_strcmp (s1, s2) \
817*53ee8cc1Swenshuai.xi : __strcmp_gc (s1, s2, __s2_len)) \
818*53ee8cc1Swenshuai.xi : __builtin_strcmp (s1, s2)))); })
819*53ee8cc1Swenshuai.xi # else
820*53ee8cc1Swenshuai.xi # define strcmp(s1, s2) \
821*53ee8cc1Swenshuai.xi __extension__ \
822*53ee8cc1Swenshuai.xi ({ size_t __s1_len, __s2_len; \
823*53ee8cc1Swenshuai.xi (__builtin_constant_p (s1) && __builtin_constant_p (s2) \
824*53ee8cc1Swenshuai.xi && (__s1_len = strlen (s1), __s2_len = strlen (s2), \
825*53ee8cc1Swenshuai.xi (!__string2_1bptr_p (s1) || __s1_len >= 4) \
826*53ee8cc1Swenshuai.xi && (!__string2_1bptr_p (s2) || __s2_len >= 4)) \
827*53ee8cc1Swenshuai.xi ? memcmp ((__const char *) (s1), (__const char *) (s2), \
828*53ee8cc1Swenshuai.xi (__s1_len < __s2_len ? __s1_len : __s2_len) + 1) \
829*53ee8cc1Swenshuai.xi : (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
830*53ee8cc1Swenshuai.xi && (__s1_len = strlen (s1), __s1_len < 4) \
831*53ee8cc1Swenshuai.xi ? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
832*53ee8cc1Swenshuai.xi ? __strcmp_cc (s1, s2, __s1_len) \
833*53ee8cc1Swenshuai.xi : __strcmp_cg (s1, s2, __s1_len)) \
834*53ee8cc1Swenshuai.xi : (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
835*53ee8cc1Swenshuai.xi && (__s2_len = strlen (s2), __s2_len < 4) \
836*53ee8cc1Swenshuai.xi ? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
837*53ee8cc1Swenshuai.xi ? __strcmp_cc (s1, s2, __s2_len) \
838*53ee8cc1Swenshuai.xi : __strcmp_gc (s1, s2, __s2_len)) \
839*53ee8cc1Swenshuai.xi : strcmp (s1, s2)))); })
840*53ee8cc1Swenshuai.xi # endif
841*53ee8cc1Swenshuai.xi
842*53ee8cc1Swenshuai.xi # define __strcmp_cc(s1, s2, l) \
843*53ee8cc1Swenshuai.xi (__extension__ ({ register int __result = \
844*53ee8cc1Swenshuai.xi (((__const unsigned char *) (__const char *) (s1))[0] \
845*53ee8cc1Swenshuai.xi - ((__const unsigned char *) (__const char *)(s2))[0]);\
846*53ee8cc1Swenshuai.xi if (l > 0 && __result == 0) \
847*53ee8cc1Swenshuai.xi { \
848*53ee8cc1Swenshuai.xi __result = (((__const unsigned char *) \
849*53ee8cc1Swenshuai.xi (__const char *) (s1))[1] \
850*53ee8cc1Swenshuai.xi - ((__const unsigned char *) \
851*53ee8cc1Swenshuai.xi (__const char *) (s2))[1]); \
852*53ee8cc1Swenshuai.xi if (l > 1 && __result == 0) \
853*53ee8cc1Swenshuai.xi { \
854*53ee8cc1Swenshuai.xi __result = \
855*53ee8cc1Swenshuai.xi (((__const unsigned char *) \
856*53ee8cc1Swenshuai.xi (__const char *) (s1))[2] \
857*53ee8cc1Swenshuai.xi - ((__const unsigned char *) \
858*53ee8cc1Swenshuai.xi (__const char *) (s2))[2]); \
859*53ee8cc1Swenshuai.xi if (l > 2 && __result == 0) \
860*53ee8cc1Swenshuai.xi __result = \
861*53ee8cc1Swenshuai.xi (((__const unsigned char *) \
862*53ee8cc1Swenshuai.xi (__const char *) (s1))[3] \
863*53ee8cc1Swenshuai.xi - ((__const unsigned char *) \
864*53ee8cc1Swenshuai.xi (__const char *) (s2))[3]); \
865*53ee8cc1Swenshuai.xi } \
866*53ee8cc1Swenshuai.xi } \
867*53ee8cc1Swenshuai.xi __result; }))
868*53ee8cc1Swenshuai.xi
869*53ee8cc1Swenshuai.xi # define __strcmp_cg(s1, s2, l1) \
870*53ee8cc1Swenshuai.xi (__extension__ ({ __const unsigned char *__s2 = \
871*53ee8cc1Swenshuai.xi (__const unsigned char *) (__const char *) (s2); \
872*53ee8cc1Swenshuai.xi register int __result = \
873*53ee8cc1Swenshuai.xi (((__const unsigned char *) (__const char *) (s1))[0] \
874*53ee8cc1Swenshuai.xi - __s2[0]); \
875*53ee8cc1Swenshuai.xi if (l1 > 0 && __result == 0) \
876*53ee8cc1Swenshuai.xi { \
877*53ee8cc1Swenshuai.xi __result = (((__const unsigned char *) \
878*53ee8cc1Swenshuai.xi (__const char *) (s1))[1] - __s2[1]); \
879*53ee8cc1Swenshuai.xi if (l1 > 1 && __result == 0) \
880*53ee8cc1Swenshuai.xi { \
881*53ee8cc1Swenshuai.xi __result = (((__const unsigned char *) \
882*53ee8cc1Swenshuai.xi (__const char *) (s1))[2] - __s2[2]);\
883*53ee8cc1Swenshuai.xi if (l1 > 2 && __result == 0) \
884*53ee8cc1Swenshuai.xi __result = (((__const unsigned char *) \
885*53ee8cc1Swenshuai.xi (__const char *) (s1))[3] \
886*53ee8cc1Swenshuai.xi - __s2[3]); \
887*53ee8cc1Swenshuai.xi } \
888*53ee8cc1Swenshuai.xi } \
889*53ee8cc1Swenshuai.xi __result; }))
890*53ee8cc1Swenshuai.xi
891*53ee8cc1Swenshuai.xi # define __strcmp_gc(s1, s2, l2) \
892*53ee8cc1Swenshuai.xi (__extension__ ({ __const unsigned char *__s1 = \
893*53ee8cc1Swenshuai.xi (__const unsigned char *) (__const char *) (s1); \
894*53ee8cc1Swenshuai.xi register int __result = \
895*53ee8cc1Swenshuai.xi __s1[0] - ((__const unsigned char *) \
896*53ee8cc1Swenshuai.xi (__const char *) (s2))[0]; \
897*53ee8cc1Swenshuai.xi if (l2 > 0 && __result == 0) \
898*53ee8cc1Swenshuai.xi { \
899*53ee8cc1Swenshuai.xi __result = (__s1[1] \
900*53ee8cc1Swenshuai.xi - ((__const unsigned char *) \
901*53ee8cc1Swenshuai.xi (__const char *) (s2))[1]); \
902*53ee8cc1Swenshuai.xi if (l2 > 1 && __result == 0) \
903*53ee8cc1Swenshuai.xi { \
904*53ee8cc1Swenshuai.xi __result = \
905*53ee8cc1Swenshuai.xi (__s1[2] - ((__const unsigned char *) \
906*53ee8cc1Swenshuai.xi (__const char *) (s2))[2]); \
907*53ee8cc1Swenshuai.xi if (l2 > 2 && __result == 0) \
908*53ee8cc1Swenshuai.xi __result = \
909*53ee8cc1Swenshuai.xi (__s1[3] \
910*53ee8cc1Swenshuai.xi - ((__const unsigned char *) \
911*53ee8cc1Swenshuai.xi (__const char *) (s2))[3]); \
912*53ee8cc1Swenshuai.xi } \
913*53ee8cc1Swenshuai.xi } \
914*53ee8cc1Swenshuai.xi __result; }))
915*53ee8cc1Swenshuai.xi #endif
916*53ee8cc1Swenshuai.xi
917*53ee8cc1Swenshuai.xi
918*53ee8cc1Swenshuai.xi /* Compare N characters of S1 and S2. */
919*53ee8cc1Swenshuai.xi #ifndef _HAVE_STRING_ARCH_strncmp
920*53ee8cc1Swenshuai.xi # define strncmp(s1, s2, n) \
921*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (n) \
922*53ee8cc1Swenshuai.xi && ((__builtin_constant_p (s1) \
923*53ee8cc1Swenshuai.xi && strlen (s1) < ((size_t) (n))) \
924*53ee8cc1Swenshuai.xi || (__builtin_constant_p (s2) \
925*53ee8cc1Swenshuai.xi && strlen (s2) < ((size_t) (n)))) \
926*53ee8cc1Swenshuai.xi ? strcmp (s1, s2) : strncmp (s1, s2, n)))
927*53ee8cc1Swenshuai.xi #endif
928*53ee8cc1Swenshuai.xi
929*53ee8cc1Swenshuai.xi
930*53ee8cc1Swenshuai.xi /* Return the length of the initial segment of S which
931*53ee8cc1Swenshuai.xi consists entirely of characters not in REJECT. */
932*53ee8cc1Swenshuai.xi #if !defined _HAVE_STRING_ARCH_strcspn || defined _FORCE_INLINES
933*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_strcspn
934*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 2)
935*53ee8cc1Swenshuai.xi # define strcspn(s, reject) \
936*53ee8cc1Swenshuai.xi __extension__ \
937*53ee8cc1Swenshuai.xi ({ char __r0, __r1, __r2; \
938*53ee8cc1Swenshuai.xi (__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
939*53ee8cc1Swenshuai.xi ? ((__builtin_constant_p (s) && __string2_1bptr_p (s)) \
940*53ee8cc1Swenshuai.xi ? __builtin_strcspn (s, reject) \
941*53ee8cc1Swenshuai.xi : ((__r0 = ((__const char *) (reject))[0], __r0 == '\0') \
942*53ee8cc1Swenshuai.xi ? strlen (s) \
943*53ee8cc1Swenshuai.xi : ((__r1 = ((__const char *) (reject))[1], __r1 == '\0') \
944*53ee8cc1Swenshuai.xi ? __strcspn_c1 (s, __r0) \
945*53ee8cc1Swenshuai.xi : ((__r2 = ((__const char *) (reject))[2], __r2 == '\0') \
946*53ee8cc1Swenshuai.xi ? __strcspn_c2 (s, __r0, __r1) \
947*53ee8cc1Swenshuai.xi : (((__const char *) (reject))[3] == '\0' \
948*53ee8cc1Swenshuai.xi ? __strcspn_c3 (s, __r0, __r1, __r2) \
949*53ee8cc1Swenshuai.xi : __builtin_strcspn (s, reject)))))) \
950*53ee8cc1Swenshuai.xi : __builtin_strcspn (s, reject)); })
951*53ee8cc1Swenshuai.xi # else
952*53ee8cc1Swenshuai.xi # define strcspn(s, reject) \
953*53ee8cc1Swenshuai.xi __extension__ \
954*53ee8cc1Swenshuai.xi ({ char __r0, __r1, __r2; \
955*53ee8cc1Swenshuai.xi (__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
956*53ee8cc1Swenshuai.xi ? ((__r0 = ((__const char *) (reject))[0], __r0 == '\0') \
957*53ee8cc1Swenshuai.xi ? strlen (s) \
958*53ee8cc1Swenshuai.xi : ((__r1 = ((__const char *) (reject))[1], __r1 == '\0') \
959*53ee8cc1Swenshuai.xi ? __strcspn_c1 (s, __r0) \
960*53ee8cc1Swenshuai.xi : ((__r2 = ((__const char *) (reject))[2], __r2 == '\0') \
961*53ee8cc1Swenshuai.xi ? __strcspn_c2 (s, __r0, __r1) \
962*53ee8cc1Swenshuai.xi : (((__const char *) (reject))[3] == '\0' \
963*53ee8cc1Swenshuai.xi ? __strcspn_c3 (s, __r0, __r1, __r2) \
964*53ee8cc1Swenshuai.xi : strcspn (s, reject))))) \
965*53ee8cc1Swenshuai.xi : strcspn (s, reject)); })
966*53ee8cc1Swenshuai.xi # endif
967*53ee8cc1Swenshuai.xi # endif
968*53ee8cc1Swenshuai.xi
969*53ee8cc1Swenshuai.xi __STRING_INLINE size_t __strcspn_c1 (__const char *__s, int __reject);
970*53ee8cc1Swenshuai.xi __STRING_INLINE size_t
__strcspn_c1(__const char * __s,int __reject)971*53ee8cc1Swenshuai.xi __strcspn_c1 (__const char *__s, int __reject)
972*53ee8cc1Swenshuai.xi {
973*53ee8cc1Swenshuai.xi register size_t __result = 0;
974*53ee8cc1Swenshuai.xi while (__s[__result] != '\0' && __s[__result] != __reject)
975*53ee8cc1Swenshuai.xi ++__result;
976*53ee8cc1Swenshuai.xi return __result;
977*53ee8cc1Swenshuai.xi }
978*53ee8cc1Swenshuai.xi
979*53ee8cc1Swenshuai.xi __STRING_INLINE size_t __strcspn_c2 (__const char *__s, int __reject1,
980*53ee8cc1Swenshuai.xi int __reject2);
981*53ee8cc1Swenshuai.xi __STRING_INLINE size_t
__strcspn_c2(__const char * __s,int __reject1,int __reject2)982*53ee8cc1Swenshuai.xi __strcspn_c2 (__const char *__s, int __reject1, int __reject2)
983*53ee8cc1Swenshuai.xi {
984*53ee8cc1Swenshuai.xi register size_t __result = 0;
985*53ee8cc1Swenshuai.xi while (__s[__result] != '\0' && __s[__result] != __reject1
986*53ee8cc1Swenshuai.xi && __s[__result] != __reject2)
987*53ee8cc1Swenshuai.xi ++__result;
988*53ee8cc1Swenshuai.xi return __result;
989*53ee8cc1Swenshuai.xi }
990*53ee8cc1Swenshuai.xi
991*53ee8cc1Swenshuai.xi __STRING_INLINE size_t __strcspn_c3 (__const char *__s, int __reject1,
992*53ee8cc1Swenshuai.xi int __reject2, int __reject3);
993*53ee8cc1Swenshuai.xi __STRING_INLINE size_t
__strcspn_c3(__const char * __s,int __reject1,int __reject2,int __reject3)994*53ee8cc1Swenshuai.xi __strcspn_c3 (__const char *__s, int __reject1, int __reject2,
995*53ee8cc1Swenshuai.xi int __reject3)
996*53ee8cc1Swenshuai.xi {
997*53ee8cc1Swenshuai.xi register size_t __result = 0;
998*53ee8cc1Swenshuai.xi while (__s[__result] != '\0' && __s[__result] != __reject1
999*53ee8cc1Swenshuai.xi && __s[__result] != __reject2 && __s[__result] != __reject3)
1000*53ee8cc1Swenshuai.xi ++__result;
1001*53ee8cc1Swenshuai.xi return __result;
1002*53ee8cc1Swenshuai.xi }
1003*53ee8cc1Swenshuai.xi #endif
1004*53ee8cc1Swenshuai.xi
1005*53ee8cc1Swenshuai.xi
1006*53ee8cc1Swenshuai.xi /* Return the length of the initial segment of S which
1007*53ee8cc1Swenshuai.xi consists entirely of characters in ACCEPT. */
1008*53ee8cc1Swenshuai.xi #if !defined _HAVE_STRING_ARCH_strspn || defined _FORCE_INLINES
1009*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_strspn
1010*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 2)
1011*53ee8cc1Swenshuai.xi # define strspn(s, accept) \
1012*53ee8cc1Swenshuai.xi __extension__ \
1013*53ee8cc1Swenshuai.xi ({ char __a0, __a1, __a2; \
1014*53ee8cc1Swenshuai.xi (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
1015*53ee8cc1Swenshuai.xi ? ((__builtin_constant_p (s) && __string2_1bptr_p (s)) \
1016*53ee8cc1Swenshuai.xi ? __builtin_strspn (s, accept) \
1017*53ee8cc1Swenshuai.xi : ((__a0 = ((__const char *) (accept))[0], __a0 == '\0') \
1018*53ee8cc1Swenshuai.xi ? ((void) (s), 0) \
1019*53ee8cc1Swenshuai.xi : ((__a1 = ((__const char *) (accept))[1], __a1 == '\0') \
1020*53ee8cc1Swenshuai.xi ? __strspn_c1 (s, __a0) \
1021*53ee8cc1Swenshuai.xi : ((__a2 = ((__const char *) (accept))[2], __a2 == '\0') \
1022*53ee8cc1Swenshuai.xi ? __strspn_c2 (s, __a0, __a1) \
1023*53ee8cc1Swenshuai.xi : (((__const char *) (accept))[3] == '\0' \
1024*53ee8cc1Swenshuai.xi ? __strspn_c3 (s, __a0, __a1, __a2) \
1025*53ee8cc1Swenshuai.xi : __builtin_strspn (s, accept)))))) \
1026*53ee8cc1Swenshuai.xi : __builtin_strspn (s, accept)); })
1027*53ee8cc1Swenshuai.xi # else
1028*53ee8cc1Swenshuai.xi # define strspn(s, accept) \
1029*53ee8cc1Swenshuai.xi __extension__ \
1030*53ee8cc1Swenshuai.xi ({ char __a0, __a1, __a2; \
1031*53ee8cc1Swenshuai.xi (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
1032*53ee8cc1Swenshuai.xi ? ((__a0 = ((__const char *) (accept))[0], __a0 == '\0') \
1033*53ee8cc1Swenshuai.xi ? ((void) (s), 0) \
1034*53ee8cc1Swenshuai.xi : ((__a1 = ((__const char *) (accept))[1], __a1 == '\0') \
1035*53ee8cc1Swenshuai.xi ? __strspn_c1 (s, __a0) \
1036*53ee8cc1Swenshuai.xi : ((__a2 = ((__const char *) (accept))[2], __a2 == '\0') \
1037*53ee8cc1Swenshuai.xi ? __strspn_c2 (s, __a0, __a1) \
1038*53ee8cc1Swenshuai.xi : (((__const char *) (accept))[3] == '\0' \
1039*53ee8cc1Swenshuai.xi ? __strspn_c3 (s, __a0, __a1, __a2) \
1040*53ee8cc1Swenshuai.xi : strspn (s, accept))))) \
1041*53ee8cc1Swenshuai.xi : strspn (s, accept)); })
1042*53ee8cc1Swenshuai.xi # endif
1043*53ee8cc1Swenshuai.xi # endif
1044*53ee8cc1Swenshuai.xi
1045*53ee8cc1Swenshuai.xi __STRING_INLINE size_t __strspn_c1 (__const char *__s, int __accept);
1046*53ee8cc1Swenshuai.xi __STRING_INLINE size_t
__strspn_c1(__const char * __s,int __accept)1047*53ee8cc1Swenshuai.xi __strspn_c1 (__const char *__s, int __accept)
1048*53ee8cc1Swenshuai.xi {
1049*53ee8cc1Swenshuai.xi register size_t __result = 0;
1050*53ee8cc1Swenshuai.xi /* Please note that __accept never can be '\0'. */
1051*53ee8cc1Swenshuai.xi while (__s[__result] == __accept)
1052*53ee8cc1Swenshuai.xi ++__result;
1053*53ee8cc1Swenshuai.xi return __result;
1054*53ee8cc1Swenshuai.xi }
1055*53ee8cc1Swenshuai.xi
1056*53ee8cc1Swenshuai.xi __STRING_INLINE size_t __strspn_c2 (__const char *__s, int __accept1,
1057*53ee8cc1Swenshuai.xi int __accept2);
1058*53ee8cc1Swenshuai.xi __STRING_INLINE size_t
__strspn_c2(__const char * __s,int __accept1,int __accept2)1059*53ee8cc1Swenshuai.xi __strspn_c2 (__const char *__s, int __accept1, int __accept2)
1060*53ee8cc1Swenshuai.xi {
1061*53ee8cc1Swenshuai.xi register size_t __result = 0;
1062*53ee8cc1Swenshuai.xi /* Please note that __accept1 and __accept2 never can be '\0'. */
1063*53ee8cc1Swenshuai.xi while (__s[__result] == __accept1 || __s[__result] == __accept2)
1064*53ee8cc1Swenshuai.xi ++__result;
1065*53ee8cc1Swenshuai.xi return __result;
1066*53ee8cc1Swenshuai.xi }
1067*53ee8cc1Swenshuai.xi
1068*53ee8cc1Swenshuai.xi __STRING_INLINE size_t __strspn_c3 (__const char *__s, int __accept1,
1069*53ee8cc1Swenshuai.xi int __accept2, int __accept3);
1070*53ee8cc1Swenshuai.xi __STRING_INLINE size_t
__strspn_c3(__const char * __s,int __accept1,int __accept2,int __accept3)1071*53ee8cc1Swenshuai.xi __strspn_c3 (__const char *__s, int __accept1, int __accept2, int __accept3)
1072*53ee8cc1Swenshuai.xi {
1073*53ee8cc1Swenshuai.xi register size_t __result = 0;
1074*53ee8cc1Swenshuai.xi /* Please note that __accept1 to __accept3 never can be '\0'. */
1075*53ee8cc1Swenshuai.xi while (__s[__result] == __accept1 || __s[__result] == __accept2
1076*53ee8cc1Swenshuai.xi || __s[__result] == __accept3)
1077*53ee8cc1Swenshuai.xi ++__result;
1078*53ee8cc1Swenshuai.xi return __result;
1079*53ee8cc1Swenshuai.xi }
1080*53ee8cc1Swenshuai.xi #endif
1081*53ee8cc1Swenshuai.xi
1082*53ee8cc1Swenshuai.xi
1083*53ee8cc1Swenshuai.xi /* Find the first occurrence in S of any character in ACCEPT. */
1084*53ee8cc1Swenshuai.xi #if !defined _HAVE_STRING_ARCH_strpbrk || defined _FORCE_INLINES
1085*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_strpbrk
1086*53ee8cc1Swenshuai.xi # if __GNUC_PREREQ (3, 2)
1087*53ee8cc1Swenshuai.xi # define strpbrk(s, accept) \
1088*53ee8cc1Swenshuai.xi __extension__ \
1089*53ee8cc1Swenshuai.xi ({ char __a0, __a1, __a2; \
1090*53ee8cc1Swenshuai.xi (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
1091*53ee8cc1Swenshuai.xi ? ((__builtin_constant_p (s) && __string2_1bptr_p (s)) \
1092*53ee8cc1Swenshuai.xi ? __builtin_strpbrk (s, accept) \
1093*53ee8cc1Swenshuai.xi : ((__a0 = ((__const char *) (accept))[0], __a0 == '\0') \
1094*53ee8cc1Swenshuai.xi ? ((void) (s), (char *) NULL) \
1095*53ee8cc1Swenshuai.xi : ((__a1 = ((__const char *) (accept))[1], __a1 == '\0') \
1096*53ee8cc1Swenshuai.xi ? __builtin_strchr (s, __a0) \
1097*53ee8cc1Swenshuai.xi : ((__a2 = ((__const char *) (accept))[2], __a2 == '\0') \
1098*53ee8cc1Swenshuai.xi ? __strpbrk_c2 (s, __a0, __a1) \
1099*53ee8cc1Swenshuai.xi : (((__const char *) (accept))[3] == '\0' \
1100*53ee8cc1Swenshuai.xi ? __strpbrk_c3 (s, __a0, __a1, __a2) \
1101*53ee8cc1Swenshuai.xi : __builtin_strpbrk (s, accept)))))) \
1102*53ee8cc1Swenshuai.xi : __builtin_strpbrk (s, accept)); })
1103*53ee8cc1Swenshuai.xi # else
1104*53ee8cc1Swenshuai.xi # define strpbrk(s, accept) \
1105*53ee8cc1Swenshuai.xi __extension__ \
1106*53ee8cc1Swenshuai.xi ({ char __a0, __a1, __a2; \
1107*53ee8cc1Swenshuai.xi (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
1108*53ee8cc1Swenshuai.xi ? ((__a0 = ((__const char *) (accept))[0], __a0 == '\0') \
1109*53ee8cc1Swenshuai.xi ? ((void) (s), (char *) NULL) \
1110*53ee8cc1Swenshuai.xi : ((__a1 = ((__const char *) (accept))[1], __a1 == '\0') \
1111*53ee8cc1Swenshuai.xi ? strchr (s, __a0) \
1112*53ee8cc1Swenshuai.xi : ((__a2 = ((__const char *) (accept))[2], __a2 == '\0') \
1113*53ee8cc1Swenshuai.xi ? __strpbrk_c2 (s, __a0, __a1) \
1114*53ee8cc1Swenshuai.xi : (((__const char *) (accept))[3] == '\0' \
1115*53ee8cc1Swenshuai.xi ? __strpbrk_c3 (s, __a0, __a1, __a2) \
1116*53ee8cc1Swenshuai.xi : strpbrk (s, accept))))) \
1117*53ee8cc1Swenshuai.xi : strpbrk (s, accept)); })
1118*53ee8cc1Swenshuai.xi # endif
1119*53ee8cc1Swenshuai.xi # endif
1120*53ee8cc1Swenshuai.xi
1121*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strpbrk_c2 (__const char *__s, int __accept1,
1122*53ee8cc1Swenshuai.xi int __accept2);
1123*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strpbrk_c2(__const char * __s,int __accept1,int __accept2)1124*53ee8cc1Swenshuai.xi __strpbrk_c2 (__const char *__s, int __accept1, int __accept2)
1125*53ee8cc1Swenshuai.xi {
1126*53ee8cc1Swenshuai.xi /* Please note that __accept1 and __accept2 never can be '\0'. */
1127*53ee8cc1Swenshuai.xi while (*__s != '\0' && *__s != __accept1 && *__s != __accept2)
1128*53ee8cc1Swenshuai.xi ++__s;
1129*53ee8cc1Swenshuai.xi return *__s == '\0' ? NULL : (char *) (size_t) __s;
1130*53ee8cc1Swenshuai.xi }
1131*53ee8cc1Swenshuai.xi
1132*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strpbrk_c3 (__const char *__s, int __accept1,
1133*53ee8cc1Swenshuai.xi int __accept2, int __accept3);
1134*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strpbrk_c3(__const char * __s,int __accept1,int __accept2,int __accept3)1135*53ee8cc1Swenshuai.xi __strpbrk_c3 (__const char *__s, int __accept1, int __accept2,
1136*53ee8cc1Swenshuai.xi int __accept3)
1137*53ee8cc1Swenshuai.xi {
1138*53ee8cc1Swenshuai.xi /* Please note that __accept1 to __accept3 never can be '\0'. */
1139*53ee8cc1Swenshuai.xi while (*__s != '\0' && *__s != __accept1 && *__s != __accept2
1140*53ee8cc1Swenshuai.xi && *__s != __accept3)
1141*53ee8cc1Swenshuai.xi ++__s;
1142*53ee8cc1Swenshuai.xi return *__s == '\0' ? NULL : (char *) (size_t) __s;
1143*53ee8cc1Swenshuai.xi }
1144*53ee8cc1Swenshuai.xi #endif
1145*53ee8cc1Swenshuai.xi
1146*53ee8cc1Swenshuai.xi
1147*53ee8cc1Swenshuai.xi /* Find the first occurrence of NEEDLE in HAYSTACK. Newer gcc versions
1148*53ee8cc1Swenshuai.xi do this itself. */
1149*53ee8cc1Swenshuai.xi #if !defined _HAVE_STRING_ARCH_strstr && !__GNUC_PREREQ (2, 97)
1150*53ee8cc1Swenshuai.xi # define strstr(haystack, needle) \
1151*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (needle) && __string2_1bptr_p (needle) \
1152*53ee8cc1Swenshuai.xi ? (((__const char *) (needle))[0] == '\0' \
1153*53ee8cc1Swenshuai.xi ? (char *) (size_t) (haystack) \
1154*53ee8cc1Swenshuai.xi : (((__const char *) (needle))[1] == '\0' \
1155*53ee8cc1Swenshuai.xi ? strchr (haystack, \
1156*53ee8cc1Swenshuai.xi ((__const char *) (needle))[0]) \
1157*53ee8cc1Swenshuai.xi : strstr (haystack, needle))) \
1158*53ee8cc1Swenshuai.xi : strstr (haystack, needle)))
1159*53ee8cc1Swenshuai.xi #endif
1160*53ee8cc1Swenshuai.xi
1161*53ee8cc1Swenshuai.xi
1162*53ee8cc1Swenshuai.xi #if !defined _HAVE_STRING_ARCH_strtok_r || defined _FORCE_INLINES
1163*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_strtok_r
1164*53ee8cc1Swenshuai.xi # define __strtok_r(s, sep, nextp) \
1165*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (sep) && __string2_1bptr_p (sep) \
1166*53ee8cc1Swenshuai.xi && ((__const char *) (sep))[0] != '\0' \
1167*53ee8cc1Swenshuai.xi && ((__const char *) (sep))[1] == '\0' \
1168*53ee8cc1Swenshuai.xi ? __strtok_r_1c (s, ((__const char *) (sep))[0], nextp) \
1169*53ee8cc1Swenshuai.xi : __strtok_r (s, sep, nextp)))
1170*53ee8cc1Swenshuai.xi # endif
1171*53ee8cc1Swenshuai.xi
1172*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strtok_r_1c (char *__s, char __sep, char **__nextp);
1173*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strtok_r_1c(char * __s,char __sep,char ** __nextp)1174*53ee8cc1Swenshuai.xi __strtok_r_1c (char *__s, char __sep, char **__nextp)
1175*53ee8cc1Swenshuai.xi {
1176*53ee8cc1Swenshuai.xi char *__result;
1177*53ee8cc1Swenshuai.xi if (__s == NULL)
1178*53ee8cc1Swenshuai.xi __s = *__nextp;
1179*53ee8cc1Swenshuai.xi while (*__s == __sep)
1180*53ee8cc1Swenshuai.xi ++__s;
1181*53ee8cc1Swenshuai.xi __result = NULL;
1182*53ee8cc1Swenshuai.xi if (*__s != '\0')
1183*53ee8cc1Swenshuai.xi {
1184*53ee8cc1Swenshuai.xi __result = __s++;
1185*53ee8cc1Swenshuai.xi while (*__s != '\0')
1186*53ee8cc1Swenshuai.xi if (*__s++ == __sep)
1187*53ee8cc1Swenshuai.xi {
1188*53ee8cc1Swenshuai.xi __s[-1] = '\0';
1189*53ee8cc1Swenshuai.xi break;
1190*53ee8cc1Swenshuai.xi }
1191*53ee8cc1Swenshuai.xi }
1192*53ee8cc1Swenshuai.xi *__nextp = __s;
1193*53ee8cc1Swenshuai.xi return __result;
1194*53ee8cc1Swenshuai.xi }
1195*53ee8cc1Swenshuai.xi # if defined __USE_POSIX || defined __USE_MISC
1196*53ee8cc1Swenshuai.xi # define strtok_r(s, sep, nextp) __strtok_r (s, sep, nextp)
1197*53ee8cc1Swenshuai.xi # endif
1198*53ee8cc1Swenshuai.xi #endif
1199*53ee8cc1Swenshuai.xi
1200*53ee8cc1Swenshuai.xi
1201*53ee8cc1Swenshuai.xi #if !defined _HAVE_STRING_ARCH_strsep || defined _FORCE_INLINES
1202*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_strsep
1203*53ee8cc1Swenshuai.xi
1204*53ee8cc1Swenshuai.xi extern char *__strsep_g (char **__stringp, __const char *__delim);
1205*53ee8cc1Swenshuai.xi # define __strsep(s, reject) \
1206*53ee8cc1Swenshuai.xi __extension__ \
1207*53ee8cc1Swenshuai.xi ({ char __r0, __r1, __r2; \
1208*53ee8cc1Swenshuai.xi (__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
1209*53ee8cc1Swenshuai.xi && (__r0 = ((__const char *) (reject))[0], \
1210*53ee8cc1Swenshuai.xi ((__const char *) (reject))[0] != '\0') \
1211*53ee8cc1Swenshuai.xi ? ((__r1 = ((__const char *) (reject))[1], \
1212*53ee8cc1Swenshuai.xi ((__const char *) (reject))[1] == '\0') \
1213*53ee8cc1Swenshuai.xi ? __strsep_1c (s, __r0) \
1214*53ee8cc1Swenshuai.xi : ((__r2 = ((__const char *) (reject))[2], __r2 == '\0') \
1215*53ee8cc1Swenshuai.xi ? __strsep_2c (s, __r0, __r1) \
1216*53ee8cc1Swenshuai.xi : (((__const char *) (reject))[3] == '\0' \
1217*53ee8cc1Swenshuai.xi ? __strsep_3c (s, __r0, __r1, __r2) \
1218*53ee8cc1Swenshuai.xi : __strsep_g (s, reject)))) \
1219*53ee8cc1Swenshuai.xi : __strsep_g (s, reject)); })
1220*53ee8cc1Swenshuai.xi # endif
1221*53ee8cc1Swenshuai.xi
1222*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strsep_1c (char **__s, char __reject);
1223*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strsep_1c(char ** __s,char __reject)1224*53ee8cc1Swenshuai.xi __strsep_1c (char **__s, char __reject)
1225*53ee8cc1Swenshuai.xi {
1226*53ee8cc1Swenshuai.xi register char *__retval = *__s;
1227*53ee8cc1Swenshuai.xi if (__retval != NULL && (*__s = strchr (__retval, __reject)) != NULL)
1228*53ee8cc1Swenshuai.xi *(*__s)++ = '\0';
1229*53ee8cc1Swenshuai.xi return __retval;
1230*53ee8cc1Swenshuai.xi }
1231*53ee8cc1Swenshuai.xi
1232*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strsep_2c (char **__s, char __reject1, char __reject2);
1233*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strsep_2c(char ** __s,char __reject1,char __reject2)1234*53ee8cc1Swenshuai.xi __strsep_2c (char **__s, char __reject1, char __reject2)
1235*53ee8cc1Swenshuai.xi {
1236*53ee8cc1Swenshuai.xi register char *__retval = *__s;
1237*53ee8cc1Swenshuai.xi if (__retval != NULL)
1238*53ee8cc1Swenshuai.xi {
1239*53ee8cc1Swenshuai.xi register char *__cp = __retval;
1240*53ee8cc1Swenshuai.xi while (1)
1241*53ee8cc1Swenshuai.xi {
1242*53ee8cc1Swenshuai.xi if (*__cp == '\0')
1243*53ee8cc1Swenshuai.xi {
1244*53ee8cc1Swenshuai.xi __cp = NULL;
1245*53ee8cc1Swenshuai.xi break;
1246*53ee8cc1Swenshuai.xi }
1247*53ee8cc1Swenshuai.xi if (*__cp == __reject1 || *__cp == __reject2)
1248*53ee8cc1Swenshuai.xi {
1249*53ee8cc1Swenshuai.xi *__cp++ = '\0';
1250*53ee8cc1Swenshuai.xi break;
1251*53ee8cc1Swenshuai.xi }
1252*53ee8cc1Swenshuai.xi ++__cp;
1253*53ee8cc1Swenshuai.xi }
1254*53ee8cc1Swenshuai.xi *__s = __cp;
1255*53ee8cc1Swenshuai.xi }
1256*53ee8cc1Swenshuai.xi return __retval;
1257*53ee8cc1Swenshuai.xi }
1258*53ee8cc1Swenshuai.xi
1259*53ee8cc1Swenshuai.xi __STRING_INLINE char *__strsep_3c (char **__s, char __reject1, char __reject2,
1260*53ee8cc1Swenshuai.xi char __reject3);
1261*53ee8cc1Swenshuai.xi __STRING_INLINE char *
__strsep_3c(char ** __s,char __reject1,char __reject2,char __reject3)1262*53ee8cc1Swenshuai.xi __strsep_3c (char **__s, char __reject1, char __reject2, char __reject3)
1263*53ee8cc1Swenshuai.xi {
1264*53ee8cc1Swenshuai.xi register char *__retval = *__s;
1265*53ee8cc1Swenshuai.xi if (__retval != NULL)
1266*53ee8cc1Swenshuai.xi {
1267*53ee8cc1Swenshuai.xi register char *__cp = __retval;
1268*53ee8cc1Swenshuai.xi while (1)
1269*53ee8cc1Swenshuai.xi {
1270*53ee8cc1Swenshuai.xi if (*__cp == '\0')
1271*53ee8cc1Swenshuai.xi {
1272*53ee8cc1Swenshuai.xi __cp = NULL;
1273*53ee8cc1Swenshuai.xi break;
1274*53ee8cc1Swenshuai.xi }
1275*53ee8cc1Swenshuai.xi if (*__cp == __reject1 || *__cp == __reject2 || *__cp == __reject3)
1276*53ee8cc1Swenshuai.xi {
1277*53ee8cc1Swenshuai.xi *__cp++ = '\0';
1278*53ee8cc1Swenshuai.xi break;
1279*53ee8cc1Swenshuai.xi }
1280*53ee8cc1Swenshuai.xi ++__cp;
1281*53ee8cc1Swenshuai.xi }
1282*53ee8cc1Swenshuai.xi *__s = __cp;
1283*53ee8cc1Swenshuai.xi }
1284*53ee8cc1Swenshuai.xi return __retval;
1285*53ee8cc1Swenshuai.xi }
1286*53ee8cc1Swenshuai.xi # ifdef __USE_BSD
1287*53ee8cc1Swenshuai.xi # define strsep(s, reject) __strsep (s, reject)
1288*53ee8cc1Swenshuai.xi # endif
1289*53ee8cc1Swenshuai.xi #endif
1290*53ee8cc1Swenshuai.xi
1291*53ee8cc1Swenshuai.xi /* We need the memory allocation functions for inline strdup().
1292*53ee8cc1Swenshuai.xi Referring to stdlib.h (even minimally) is not allowed
1293*53ee8cc1Swenshuai.xi in any of the tight standards compliant modes. */
1294*53ee8cc1Swenshuai.xi #ifdef __USE_MISC
1295*53ee8cc1Swenshuai.xi
1296*53ee8cc1Swenshuai.xi # if !defined _HAVE_STRING_ARCH_strdup || !defined _HAVE_STRING_ARCH_strndup
1297*53ee8cc1Swenshuai.xi # define __need_malloc_and_calloc
1298*53ee8cc1Swenshuai.xi # include <stdlib.h>
1299*53ee8cc1Swenshuai.xi # endif
1300*53ee8cc1Swenshuai.xi
1301*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_strdup
1302*53ee8cc1Swenshuai.xi
1303*53ee8cc1Swenshuai.xi extern char *__strdup (__const char *__string) __THROW __attribute_malloc__;
1304*53ee8cc1Swenshuai.xi # define __strdup(s) \
1305*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s) \
1306*53ee8cc1Swenshuai.xi ? (((__const char *) (s))[0] == '\0' \
1307*53ee8cc1Swenshuai.xi ? (char *) calloc ((size_t) 1, (size_t) 1) \
1308*53ee8cc1Swenshuai.xi : ({ size_t __len = strlen (s) + 1; \
1309*53ee8cc1Swenshuai.xi char *__retval = (char *) malloc (__len); \
1310*53ee8cc1Swenshuai.xi if (__retval != NULL) \
1311*53ee8cc1Swenshuai.xi __retval = (char *) memcpy (__retval, s, __len); \
1312*53ee8cc1Swenshuai.xi __retval; })) \
1313*53ee8cc1Swenshuai.xi : __strdup (s)))
1314*53ee8cc1Swenshuai.xi
1315*53ee8cc1Swenshuai.xi # if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
1316*53ee8cc1Swenshuai.xi # define strdup(s) __strdup (s)
1317*53ee8cc1Swenshuai.xi # endif
1318*53ee8cc1Swenshuai.xi # endif
1319*53ee8cc1Swenshuai.xi
1320*53ee8cc1Swenshuai.xi # ifndef _HAVE_STRING_ARCH_strndup
1321*53ee8cc1Swenshuai.xi
1322*53ee8cc1Swenshuai.xi extern char *__strndup (__const char *__string, size_t __n)
1323*53ee8cc1Swenshuai.xi __THROW __attribute_malloc__;
1324*53ee8cc1Swenshuai.xi # define __strndup(s, n) \
1325*53ee8cc1Swenshuai.xi (__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s) \
1326*53ee8cc1Swenshuai.xi ? (((__const char *) (s))[0] == '\0' \
1327*53ee8cc1Swenshuai.xi ? (char *) calloc ((size_t) 1, (size_t) 1) \
1328*53ee8cc1Swenshuai.xi : ({ size_t __len = strlen (s) + 1; \
1329*53ee8cc1Swenshuai.xi size_t __n = (n); \
1330*53ee8cc1Swenshuai.xi char *__retval; \
1331*53ee8cc1Swenshuai.xi if (__n < __len) \
1332*53ee8cc1Swenshuai.xi __len = __n + 1; \
1333*53ee8cc1Swenshuai.xi __retval = (char *) malloc (__len); \
1334*53ee8cc1Swenshuai.xi if (__retval != NULL) \
1335*53ee8cc1Swenshuai.xi { \
1336*53ee8cc1Swenshuai.xi __retval[__len - 1] = '\0'; \
1337*53ee8cc1Swenshuai.xi __retval = (char *) memcpy (__retval, s, \
1338*53ee8cc1Swenshuai.xi __len - 1); \
1339*53ee8cc1Swenshuai.xi } \
1340*53ee8cc1Swenshuai.xi __retval; })) \
1341*53ee8cc1Swenshuai.xi : __strndup (s, n)))
1342*53ee8cc1Swenshuai.xi
1343*53ee8cc1Swenshuai.xi # ifdef __USE_GNU
1344*53ee8cc1Swenshuai.xi # define strndup(s, n) __strndup (s, n)
1345*53ee8cc1Swenshuai.xi # endif
1346*53ee8cc1Swenshuai.xi # endif
1347*53ee8cc1Swenshuai.xi
1348*53ee8cc1Swenshuai.xi #endif /* Use misc. or use GNU. */
1349*53ee8cc1Swenshuai.xi
1350*53ee8cc1Swenshuai.xi #ifndef _FORCE_INLINES
1351*53ee8cc1Swenshuai.xi # undef __STRING_INLINE
1352*53ee8cc1Swenshuai.xi #endif
1353*53ee8cc1Swenshuai.xi
1354*53ee8cc1Swenshuai.xi #endif /* No string inlines. */
1355