xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/bits/string2.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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