File Coverage

/usr/include/x86_64-linux-gnu/bits/string2.h
Criterion Covered Total %
statement 0 3 0.0
branch n/a
condition n/a
subroutine n/a
total 0 3 0.0


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