glibc/string/bits/string2.h
Ulrich Drepper 6973fc0127 Update.
1997-11-18 02:31  Ulrich Drepper  <drepper@cygnus.com>

	* iconv/Makefile: New file.
	* iconv/gconv.c: New file.
	* iconv/gconv.h: New file.
	* iconv/gconv_builtin.c: New file.
	* iconv/gconv_builtin.h: New file.
	* iconv/gconv_close.c: New file.
	* iconv/gconv_conf.c: New file.
	* iconv/gconv_db.c: New file.
	* iconv/gconv_dl.c: New file.
	* iconv/gconv_open.c: New file.
	* iconv/gconv_simple.c: New file.
	* iconv/iconv.c: New file.
	* iconv/iconv.h: New file.
	* iconv/iconv_close.c: New file.
	* iconv/iconv_open.c: New file.
	* include/gconv.h: New file.

	* Makeconfig: Define gconvdir.
	* Makefile (subdirs): Add iconv.

	* string/bits/string2.h: Add optimization for strtok_r.

	* sysdeps/generic/_G_config.h: Define __need_NULL to get definition
	for NULL.
	Reported by H.J. Lu <hjl@gnu.ai.mit.edu>.
	* configure.in: Correct test for bash2.
	* locale/Makefile (CFLAGS-charmap.c): Add -Wno-char-subscripts.
	(CFLAGS-locfile.c): Likewise.
	Suggested by Zack Weinberg <zack@rabi.phys.columbia.edu>.
	* misc/hsearch_r.c (hsearch_r): Avoid undefinitely search for
	non-existing entry if the table is full.
	* posix/regex.h: Pretty print.
	* stdio-common/printf_fp.c: Don't define NDEBUG if already defined.
	* sysdeps/posix/ctermid.c: Simplify a bit.
	* sysdeps/unix/sysv/linux/net/if.h: Pretty print.
1997-11-17  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/unix/sysv/linux/sys/quota.h: Add include for
	<sys/types.h> instead of <asm/types.h>.
1997-11-16  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* math/libm-test.c (asin_test): Add epsilon for asin (0.5).
1997-11-16 17:09  H.J. Lu  <hjl@gnu.ai.mit.edu>
	* libc.map (_IO_stdin_, _IO_stdout_, _IO_stderr_, _IO_fopen,
	fopen, freopen, _IO_fclose, fclose): Added to GLIBC_2.0.
	(_IO_stdin_, _IO_stdout_, _IO_stderr_): Removed from GLIBC_2.1.
	(_IO_2_1_stdin_, _IO_2_1_stdout_, _IO_2_1_stderr_, _IO_fclose,
	fclose): Added to GLIBC_2.1.
	* libio/Makefile (routines, shared-only-routines): Add
	oldiofclose.  Remove oldfreopen.
	* libio/freopen.c (freopen): When PIC is defined, call
	_IO_old_freopen () for old stdio.
	* libio/iofclose.c (_IO_new_fclose): Renamed from _IO_fclose.
	(_IO_fclose, fclose): Use _IO_new_fclose as default version
	for GLIBC_2.1.
	* libio/iolibio.h (_IO_old_freopen): Use _IO_old_file_close_it
	instead of _IO_file_close_it.
	* libio/libio.h (_IO_stdin_, _IO_stdout_, _IO_stderr_): Changed
	to _IO_2_1_stdxxx_.
	(_IO_stdin, _IO_stdout, _IO_stderr): Declare as extern if _LIBC
	* libio/libioP.h (_IO_old_do_flush): New.
	* libio/oldfileops.c (_IO_old_file_close_it,
	_IO_old_file_finish, _IO_old_file_overflow, _IO_old_file_sync):
	Call _IO_old_do_flush () instead of _IO_do_flush ().
	(_IO_old_file_xsputn): Call _IO_old_do_write () instead of
	_IO_do_write ().
	* libio/oldiofopen.c (_IO_old_fopen): Call _IO_old_file_init ()
	instead of _IO_file_init ().
	Bind old symbols to version GLIBC_2.0.
	* libio/oldstdfiles.c (DEF_STDFILE): Don't use symbol_version.
	(_IO_old_stdin_, _IO_old_stdout_, _IO_old_stderr_): Changed to
	_IO_stdxxx_.
	(_IO_check_libio): New function in .init.
	* libio/oldiofclose.c: New file.
	* libio/stdfiles.c (_IO_new_stdin_, _IO_new_stdout_,
	_IO_new_stderr_): Changed to _IO_2_1_stdxxx_.
	(DEF_STDFILE): Don't use default_symbol_version.
	* libio/stdio.c (stdin, stdout, stderr): Set to
	_IO_2_1_stdxxx_._
	(_IO_stdin, _IO_stdout, _IO_stderr): New, strong alias of
	stdxxx.
	* csu/Makefile (distribute): Add init.c.
	(extra-objs): Add init.o for ELF.
	(start-installed-name): Add $(objpfx)init.o.
	* csu/init.c: New file.
1997-11-12 08:02  H.J. Lu  <hjl@gnu.ai.mit.edu>
	* elf/dl-lookup.c (do_lookup): Don't use the hidden base
	definition as the default.
1997-08-27  Klaus Espenlaub  <kespenla@hydra.informatik.uni-ulm.de>
	* erand48_r.c (__erand48_r): Implement for 32 bit short int.
1997-11-15  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* elf/genrtldtbl.awk: Replace gensub for compatibility with gawk2
	(PR 351).
1997-11-16 21:01  Philip Blundell  <Philip.Blundell@pobox.com>
	* sysdeps/arm/sysdep.h: Use __APCS_32__ to decide whether or not
	to preserve condition codes on function call.
1997-11-13  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/generic/s_exp2l.c: Change exp2l to __ieee754_exp2l.
1997-11-14  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* math/libm-test.c (asin_test): Add epsilon for float.
	(tan_test): Add epsilon for float.
	(log1p_test): Add epsilon for float.
	(inverse_functions): Add epsilons.
	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers) [socket]: Add
	net/if_packet.h.
	* sysdeps/unix/sysv/linux/Dist: Add net/if_packet.h.
1997-11-10  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* md5-crypt/Makefile (extra-objs): Make recursively expanded
	variable, since $(object-suffixes) is not defined yet.
1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* db2/Makefile (distribute): db185/db185_int.src ->
	db185/db185_int.h.
1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* misc/tst-fdset.c: Don't require the value of FD_ISSET to be
	exactly one.
1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* sysdeps/generic/e_acoshl.c: Fix stub_warning: use the user level
	* sysdeps/generic/e_acosl.c: Likewise.
	* sysdeps/generic/e_asinl.c: Likewise.
	* sysdeps/generic/e_atan2l.c: Likewise.
	* sysdeps/generic/e_expl.c: Likewise.
	* sysdeps/generic/e_fmodl.c: Likewise.
	* sysdeps/generic/e_j0l.c: Likewise.
	* sysdeps/generic/e_j1l.c: Likewise.
	* sysdeps/generic/e_jnl.c: Likewise.
	* sysdeps/generic/e_lgammal_r.c: Likewise.
	* sysdeps/generic/e_log10l.c: Likewise.
	* sysdeps/generic/e_logl.c: Likewise.
	* sysdeps/generic/e_powl.c: Likewise.
	* sysdeps/generic/e_sqrtl.c: Likewise.
	* sysdeps/generic/e_exp2l.c: Likewise.

1997-11-11  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Make-dist (+sysdep-names): Remove extra paren.
	* Makefile (distribute): Add stub-tag.h.
	* elf/Makefile (distribute): Add atomicity.h.
	* stdlib/Makefile (headers): Add ucontext.h and sys/ucontext.h.
	* sysdeps/unix/sysv/linux/Makefile (sysdep_headers)
	[$(subdir)=socket]: Add net/if_packet.h.
	* sysdeps/alpha/Dist: Remove setjmp_aux.c.
	* sysdeps/unix/sysv/linux/Dist: Add s_pread64.c, s_pwrite64.c,
	net/if_packet.h, scsi/sg.h.
1997-11-13  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* Makefile (install): Quote $(CC) expansion.
1997-11-14  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/unix/sysv/linux/getcwd.c (__getcwd): Added caching of
	working /proc cwd and no restrictions on path length.  Following
	some ideas from Andi Kleen <ak@muc.de> (PR 350).
1997-11-14 19:14  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
	* nis/nss_compat/compat-grp.c: Remove buggy assert call.
1997-11-14 22:23  Ulrich Drepper  <drepper@cygnus.com>
	* sysdeps/libm-i387/s_fdim.S: New file.
	* sysdeps/libm-i387/s_fdimf.S: New file.
	* sysdeps/libm-i387/s_fdiml.S: New file.
	* sysdeps/libm-i387/i686/s_fdim.S: New file.
	* sysdeps/libm-i387/i686/s_fdimf.S: New file.
	* sysdeps/libm-i387/i686/s_fdiml.S: New file.
1997-11-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
	* string/bits/string2.h (strstr): Avoid warning if HAYSTACK is a
	pointer to unsigned char.
1997-11-13  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/libm-ieee754/s_llrintf.c (__llrintf): Fix function.
	* sysdeps/libm-ieee754/s_lrintf.c (__lrintf): Fix function.
	* sysdeps/libm-ieee754/s_lrint.c (__lrint): Fix function.
1997-11-12  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
	* sysdeps/libm-ieee754/s_ilogbf.c: Correct return values for
	ilogb(0/NaN).
	* sysdeps/libm-ieee754/s_ilogbl.c: Likewise.
	* sysdeps/libm-ieee754/s_ilogb.c: Likewise.

1997-11-14 05:44  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/libm-i387/s_fmin.S: New file.
	* sysdeps/libm-i387/s_fminf.S: New file.
	* sysdeps/libm-i387/s_fminl.S: New file.
	* sysdeps/libm-i387/s_fmax.S: New file.
	* sysdeps/libm-i387/s_fmaxf.S: New file.
	* sysdeps/libm-i387/s_fmaxl.S: New file.
	* sysdeps/libm-i387/i686/s_fmin.S: New file.
	* sysdeps/libm-i387/i686/s_fminf.S: New file.
	* sysdeps/libm-i387/i686/s_fminl.S: New file.
	* sysdeps/libm-i387/i686/s_fmax.S: New file.
	* sysdeps/libm-i387/i686/s_fmaxf.S: New file.
	* sysdeps/libm-i387/i686/s_fmaxl.S: New file.

1997-11-14 03:06  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/accept.S: Add __libc_accept as alias.
	* sysdeps/unix/sysv/linux/send.S: Likewise.
	* sysdeps/unix/sysv/linux/recv.S: Likewise.
	* sysdeps/unix/sysv/linux/connect.S: Likewise.
	Reported by Christopher Wiles <wileyc@ai.cs.fujitsu.co.jp>.
See ChangeLog.7 for earlier changes.
1997-11-18 02:50:07 +00:00

693 lines
25 KiB
C

/* Machine-independant string function optimizations.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _STRING_H
# error "Never use <bits/string2.h> directly; include <string.h> instead."
#endif
#ifndef __NO_STRING_INLINES
/* Unlike the definitions in the header <bits/string.h> the
definitions contained here are not optimizing down to assembler
level. These optimizations are not always a good idea since this
means the code size increases a lot. Instead the definitions here
optimize some functions in a way which does not dramatically
increase the code size and which does not use assembler. The main
trick is to use GNU CC's `__builtin_constant_p' function.
Every function XXX which has a defined version in
<bits/string.h> must be accompanied by a symbol _HAVE_STRING_ARCH_XXX
to make sure we don't get redefinitions.
We must use here macros instead of inline functions since the
trick won't work with the later. */
#ifdef __cplusplus
# define __STRING_INLINE inline
#else
# define __STRING_INLINE extern __inline
#endif
#if _STRING_ARCH_unaligned
/* If we can do unaligned memory accesses we must know the endianess. */
# include <endian.h>
# include <bits/types.h>
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define __STRING2_SMALL_GET16(src, idx) \
(((__const unsigned char *) (src))[idx + 1] << 8 \
| ((__const unsigned char *) (src))[idx])
# define __STRING2_SMALL_GET32(src, idx) \
(((((__const unsigned char *) (src))[idx + 3] << 8 \
| ((__const char *) (src))[idx + 2]) << 8 \
| ((__const unsigned char *) (src))[idx + 1]) << 8 \
| ((__const unsigned char *) (src))[idx])
# else
# define __STRING2_SMALL_GET16(src, idx) \
(((__const unsigned char *) (src))[idx] << 8 \
| ((__const unsigned char *) (src))[idx + 1])
# define __STRING2_SMALL_GET32(src, idx) \
(((((__const unsigned char *) (src))[idx] << 8 \
| ((__const unsigned char *) (src))[idx + 1]) << 8 \
| ((__const unsigned char *) (src))[idx + 2]) << 8 \
| ((__const unsigned char *) (src))[idx + 3])
# endif
#else
/* These are a few types we need for the optimizations if we cannot
use unaligned memory accesses. */
# define __STRING2_COPY_TYPE(N) \
typedef struct { char __arr[N]; } \
__STRING2_COPY_ARR##N __attribute__ ((packed))
__STRING2_COPY_TYPE (2);
__STRING2_COPY_TYPE (3);
__STRING2_COPY_TYPE (4);
__STRING2_COPY_TYPE (5);
__STRING2_COPY_TYPE (6);
__STRING2_COPY_TYPE (7);
__STRING2_COPY_TYPE (8);
# undef __STRING2_COPY_TYPE
#endif
/* Dereferencing a pointer arg to run sizeof on it fails for the
void pointer case, so we use this instead. */
#define __string2_1bptr_p(x) (((size_t) ((x) + 1) - (size_t) (x)) == 1)
/* Set N bytes of S to C. */
#ifndef _HAVE_STRING_ARCH_memset
# define memset(s, c, n) \
(__extension__ (__builtin_constant_p (c) && (c) == '\0' \
? ({ void *__s = (s); __bzero (__s, n); __s; }) \
: memset (s, c, n)))
#endif
/* Copy SRC to DEST. */
#ifndef _HAVE_STRING_ARCH_strcpy
# define strcpy(dest, src) \
(__extension__ (__builtin_constant_p (src) \
? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
? __strcpy_small (dest, src, strlen (src) + 1) \
: (char *) memcpy (dest, src, strlen (src) + 1)) \
: strcpy (dest, src)))
# if _STRING_ARCH_unaligned
# define __strcpy_small(dest, src, srclen) \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*__dest = '\0'; \
break; \
case 2: \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
break; \
case 3: \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
*(__dest + 2) = '\0'; \
break; \
case 4: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
break; \
case 5: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*(__dest + 4) = '\0'; \
break; \
case 6: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
break; \
case 7: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
*(__dest + 6) = '\0'; \
break; \
case 8: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint32_t *) (__dest + 4)) = \
__STRING2_SMALL_GET32 (src, 4); \
break; \
} \
(char *) __dest; }))
# else
# define __strcpy_small(dest, src, srclen) \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*__dest = '\0'; \
break; \
case 2: \
*((__STRING2_COPY_ARR2 *) __dest) = \
((__STRING2_COPY_ARR2) \
{ { ((__const unsigned char *) (src))[0], \
'\0' } }); \
break; \
case 3: \
*((__STRING2_COPY_ARR3 *) __dest) = \
((__STRING2_COPY_ARR3) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
'\0' } }); \
break; \
case 4: \
*((__STRING2_COPY_ARR4 *) __dest) = \
((__STRING2_COPY_ARR4) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
'\0' } }); \
break; \
case 5: \
*((__STRING2_COPY_ARR5 *) __dest) = \
((__STRING2_COPY_ARR5) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
'\0' } }); \
break; \
case 6: \
*((__STRING2_COPY_ARR6 *) __dest) = \
((__STRING2_COPY_ARR6) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
((__const unsigned char *) (src))[4], \
'\0' } }); \
break; \
case 7: \
*((__STRING2_COPY_ARR7 *) __dest) = \
((__STRING2_COPY_ARR7) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
((__const unsigned char *) (src))[4], \
((__const unsigned char *) (src))[5], \
'\0' } }); \
break; \
case 8: \
*((__STRING2_COPY_ARR8 *) __dest) = \
((__STRING2_COPY_ARR8) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
((__const unsigned char *) (src))[4], \
((__const unsigned char *) (src))[5], \
((__const unsigned char *) (src))[6], \
'\0' } }); \
break; \
} \
(char *) __dest; }))
# endif
#endif
/* Copy SRC to DEST, returning pointer to final NUL byte. */
#ifdef __USE_GNU
# ifndef _HAVE_STRING_ARCH_stpcpy
# define __stpcpy(dest, src) \
(__extension__ (__builtin_constant_p (src) \
? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
? __stpcpy_small (dest, src, strlen (src) + 1) \
: ((char *) __mempcpy (dest, src, strlen (src) + 1) - 1))\
: __stpcpy (dest, src)))
/* In glibc we use this function frequently but for namespace reasons
we have to use the name `__stpcpy'. */
# define stpcpy(dest, src) __stpcpy (dest, src)
# if _STRING_ARCH_unaligned
# define __stpcpy_small(dest, src, srclen) \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*__dest = '\0'; \
break; \
case 2: \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
++__dest; \
break; \
case 3: \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
__dest += sizeof (__uint16_t); \
*__dest = '\0'; \
break; \
case 4: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
__dest += 3; \
break; \
case 5: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
__dest += sizeof (__uint32_t); \
*__dest = '\0'; \
break; \
case 6: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
__dest += 5; \
break; \
case 7: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
__dest += 6; \
*__dest = '\0'; \
break; \
case 8: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint32_t *) (__dest + 4)) = \
__STRING2_SMALL_GET32 (src, 4); \
__dest += 7; \
break; \
} \
(char *) __dest; }))
# else
# define __stpcpy_small(dest, src, srclen) \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
switch (srclen) \
{ \
case 1: \
*__dest = '\0'; \
break; \
case 2: \
*((__STRING2_COPY_ARR2 *) __dest) = \
((__STRING2_COPY_ARR2) \
{ { ((__const unsigned char *) (src))[0], \
'\0' } }); \
break; \
case 3: \
*((__STRING2_COPY_ARR3 *) __dest) = \
((__STRING2_COPY_ARR3) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
'\0' } }); \
break; \
case 4: \
*((__STRING2_COPY_ARR4 *) __dest) = \
((__STRING2_COPY_ARR4) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
'\0' } }); \
break; \
case 5: \
*((__STRING2_COPY_ARR5 *) __dest) = \
((__STRING2_COPY_ARR5) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
'\0' } }); \
break; \
case 6: \
*((__STRING2_COPY_ARR6 *) __dest) = \
((__STRING2_COPY_ARR6) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
((__const unsigned char *) (src))[4], \
'\0' } }); \
break; \
case 7: \
*((__STRING2_COPY_ARR7 *) __dest) = \
((__STRING2_COPY_ARR7) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
((__const unsigned char *) (src))[4], \
((__const unsigned char *) (src))[5], \
'\0' } }); \
break; \
case 8: \
*((__STRING2_COPY_ARR8 *) __dest) = \
((__STRING2_COPY_ARR8) \
{ { ((__const unsigned char *) (src))[0], \
((__const unsigned char *) (src))[1], \
((__const unsigned char *) (src))[2], \
((__const unsigned char *) (src))[3], \
((__const unsigned char *) (src))[4], \
((__const unsigned char *) (src))[5], \
((__const unsigned char *) (src))[6], \
'\0' } }); \
break; \
} \
(char *) (__dest + ((srclen) - 1)); }))
# endif
# endif
#endif
/* Copy no more than N characters of SRC to DEST. */
#ifndef _HAVE_STRING_ARCH_strncpy
# if defined _HAVE_STRING_ARCH_memset && defined _HAVE_STRING_ARCH_mempcpy
# define strncpy(dest, src, n) \
(__extension__ ({ char *__dest = (dest); \
__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) + 1 >= ((size_t) (n)) \
? (char *) memcpy (__dest, src, n) \
: (memset (__mempcpy (__dest, src, strlen (src)), \
'\0', n - strlen (src)), \
__dest)) \
: strncpy (__dest, src, n); }))
# else
# define strncpy(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) + 1 >= ((size_t) (n)) \
? (char *) memcpy (dest, src, n) \
: strncpy (dest, src, n)) \
: strncpy (dest, src, n)))
# endif
#endif
/* Append no more than N characters from SRC onto DEST. */
#ifndef _HAVE_STRING_ARCH_strncat
# ifdef _HAVE_STRING_ARCH_strchr
# define strncat(dest, src, n) \
(__extension__ ({ char *__dest = (dest); \
__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) < ((size_t) (n)) \
? strcat (__dest, src) \
: (memcpy (strchr (__dest, '\0'), src, n), __dest)) \
: strncat (dest, src, n); }))
# else
# define strncat(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) < ((size_t) (n)) \
? strcat (dest, src) \
: strncat (dest, src, n)) \
: strncat (dest, src, n)))
# endif
#endif
/* Compare characters of S1 and S2. */
#ifndef _HAVE_STRING_ARCH_strcmp
# define strcmp(s1, s2) \
(__extension__ (__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (!__string2_1bptr_p (s1) || strlen (s1) >= 4) \
&& (!__string2_1bptr_p (s2) || strlen (s2) >= 4) \
? memcmp (s1, s2, (strlen (s1) < strlen (s2) \
? strlen (s1) : strlen (s2)) + 1) \
: (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
&& __string2_1bptr_p (s2) && strlen (s1) < 4 \
? (__builtin_constant_p (s2) \
? __strcmp_cc (s1, s2, strlen (s1)) \
: __strcmp_cg (s1, s2, strlen (s1))) \
: (__builtin_constant_p (s2) && __string2_1bptr_p (s1) \
&& __string2_1bptr_p (s2) && strlen (s2) < 4 \
? (__builtin_constant_p (s1) \
? __strcmp_cc (s1, s2, strlen (s2)) \
: __strcmp_gc (s1, s2, strlen (s2))) \
: strcmp (s1, s2)))))
# define __strcmp_cc(s1, s2, l) \
(__extension__ ({ register int __result = \
(((__const unsigned char *) (s1))[0] \
- ((__const unsigned char *) (s2))[0]); \
if (l > 0 && __result == 0) \
{ \
__result = (((__const unsigned char *) (s1))[1] \
- ((__const unsigned char *) (s2))[1]); \
if (l > 1 && __result == 0) \
{ \
__result = \
(((__const unsigned char *) (s1))[2] \
- ((__const unsigned char *) (s2))[2]); \
if (l > 2 && __result == 0) \
__result = \
(((__const unsigned char *) (s1))[3] \
- ((__const unsigned char *) (s2))[3]); \
} \
} \
__result; }))
# define __strcmp_cg(s1, s2, l1) \
(__extension__ ({ __const unsigned char *__s2 = \
(__const unsigned char *) (s2); \
register int __result = \
(((__const unsigned char *) (s1))[0] - __s2[0]); \
if (l1 > 0 && __result == 0) \
{ \
__result = (((__const unsigned char *) (s1))[1] \
- __s2[1]); \
if (l1 > 1 && __result == 0) \
{ \
__result = (((__const unsigned char *) (s1))[2] \
- __s2[2]); \
if (l1 > 2 && __result == 0) \
__result = (((__const unsigned char *) (s1))[3] \
- __s2[3]); \
} \
} \
__result; }))
# define __strcmp_gc(s1, s2, l2) \
(__extension__ ({ __const unsigned char *__s1 = \
(__const unsigned char *) (s1); \
register int __result = \
__s1[0] - ((__const unsigned char *) (s2))[0]; \
if (l2 > 0 && __result == 0) \
{ \
__result = (__s1[1] \
- ((__const unsigned char *) (s2))[1]); \
if (l2 > 1 && __result == 0) \
{ \
__result = \
(__s1[2] - ((__const unsigned char *) (s2))[2]);\
if (l2 > 2 && __result == 0) \
__result = \
(__s1[3] \
- ((__const unsigned char *)(s2))[3]); \
} \
} \
__result; }))
#endif
/* Compare N characters of S1 and S2. */
#ifndef _HAVE_STRING_ARCH_strncmp
# define strncmp(s1, s2, n) \
(__extension__ (__builtin_constant_p (s1) && strlen (s1) < ((size_t) (n)) \
? strcmp (s1, s2) \
: (__builtin_constant_p (s2) && strlen (s2) < ((size_t) (n))\
? strcmp (s1, s2) \
: strncmp (s1, s2, n))))
#endif
/* Return the length of the initial segment of S which
consists entirely of characters not in REJECT. */
#ifndef _HAVE_STRING_ARCH_strcspn
# define strcspn(s, reject) \
(__extension__ (__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
? (((__const unsigned char *) (reject))[0] == '\0' \
? strlen (s) \
: (((__const unsigned char *) (reject))[1] == '\0' \
? __strcspn_c1 (s, ((__const char *) (reject))[0]) \
: strcspn (s, reject))) \
: strcspn (s, reject)))
__STRING_INLINE size_t __strcspn_c1 (__const char *__s, char __reject);
__STRING_INLINE size_t
__strcspn_c1 (__const char *__s, char __reject)
{
register size_t __result = 0;
while (__s[__result] != '\0' && __s[__result] != __reject)
++__result;
return __result;
}
#endif
/* Return the length of the initial segment of S which
consists entirely of characters in ACCEPT. */
#ifndef _HAVE_STRING_ARCH_strspn
# define strspn(s, accept) \
(__extension__ (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
? (((__const unsigned char *) (accept))[0] == '\0' \
? 0 \
: (((__const unsigned char *) (accept))[1] == '\0' \
? __strspn_c1 (s, ((__const char *) (accept))[0]) \
: strspn (s, accept))) \
: strspn (s, accept)))
__STRING_INLINE size_t __strspn_c1 (__const char *__s, char __accept);
__STRING_INLINE size_t
__strspn_c1 (__const char *__s, char __accept)
{
register size_t __result = 0;
/* Please note that __accept never can be '\0'. */
while (__s[__result] == __accept)
++__result;
return __result;
}
#endif
/* Find the first occurrence in S of any character in ACCEPT. */
#ifndef _HAVE_STRING_ARCH_strpbrk
# define strpbrk(s, accept) \
(__extension__ (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
? (((__const unsigned char *) (accept))[0] == '\0' \
? NULL \
: (((__const unsigned char *) (accept))[1] == '\0' \
? strchr (s, ((__const unsigned char *) (accept))[0]) \
: strpbrk (s, accept))) \
: strpbrk (s, accept)))
#endif
/* Find the first occurrence of NEEDLE in HAYSTACK. */
#ifndef _HAVE_STRING_ARCH_strstr
# define strstr(haystack, needle) \
(__extension__ (__builtin_constant_p (needle) && __string2_1bptr_p (needle) \
? (((__const unsigned char *) (needle))[0] == '\0' \
? (char *) (haystack) \
: (((__const unsigned char *) (needle))[1] == '\0' \
? strchr (haystack, \
((__const unsigned char *) (needle))[0]) \
: strstr (haystack, needle))) \
: strstr (haystack, needle)))
#endif
#ifdef __USE_GNU
# ifndef _HAVE_STRING_ARCH_strnlen
__STRING_INLINE size_t strnlen (__const char *__string, size_t __maxlen);
__STRING_INLINE size_t
strnlen (__const char *__string, size_t __maxlen)
{
__const char *__end = (__const char *) memchr (__string, '\0', __maxlen);
return __end ? __end - __string : __maxlen;
}
# endif
#endif
#if defined __USE_POSIX || defined __USE_MISC
# ifndef _HAVE_STRING_ARCH_strtok_r
# define strtok_r(s, sep, nextp) \
(__extension__ (__builtin_constant_p (sep) && __string2_1bptr_p (sep) \
? (((__const unsigned char *) (sep))[0] != '\0' \
&& ((__const unsigned char *) (sep))[1] == '\0' \
? __strtok_r_1c (s, ((__const unsigned char *) (sep))[0],\
nextp) \
: strtok_r (s, sep, nextp)) \
: strtok_r (s, sep, nextp)))
__STRING_INLINE char *__strtok_r_1c (char *__s, char __sep, char **__nextp);
__STRING_INLINE char *
__strtok_r_1c (char *__s, char __sep, char **__nextp)
{
char *__result;
if (__s == NULL)
__s = *__nextp;
while (*__s == __sep)
++__s;
if (*__s == '\0')
__result = NULL;
else
{
__result = __s;
while (*__s != '\0' && *__s != __sep)
++__s;
if (*__s == '\0')
*__nextp = __s;
else
{
*__s = '\0';
*__nextp = __s + 1;
}
}
return __result;
}
# endif
#endif
#ifdef __USE_BSD
# ifndef _HAVE_STRING_ARCH_strsep
# define strsep(s, reject) \
(__extension__ (__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
? (((__const unsigned char *) (reject))[0] != '\0' \
&& ((__const unsigned char *) (reject))[1] == '\0' \
? __strsep_1c (s, \
((__const unsigned char *) (reject))[0]) \
: __strsep_g (s, reject)) \
: __strsep_g (s, reject)))
__STRING_INLINE char *__strsep_1c (char **__s, char __reject);
__STRING_INLINE char *
__strsep_1c (char **__s, char __reject)
{
register char *__retval = *__s;
if (__retval == NULL || *__retval == '\0')
return NULL;
while (*__retval == __reject)
++__retval;
if ((*__s = strchr (__retval, __reject)) != NULL)
*(*__s)++ = '\0';
return __retval;
}
__STRING_INLINE char *__strsep_g (char **__s, __const char *__reject);
__STRING_INLINE char *
__strsep_g (char **__s, __const char *__reject)
{
register char *__retval = *__s;
if (__retval == NULL || *__retval == '\0')
return NULL;
if ((*__s = strpbrk (__retval, __reject)) != NULL)
*(*__s)++ = '\0';
return __retval;
}
# endif
#endif
#undef __STRING_INLINE
#endif /* No string inlines. */