mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	These machine-dependent inline string functions have never been on by default, and even if they were a good idea at the time they were introduced, they haven't really been touched in ten to fifteen years and probably aren't a good idea on current-gen processors. Current thinking is that this class of optimization is best left to the compiler. * bits/string.h, string/bits/string.h * sysdeps/aarch64/bits/string.h * sysdeps/m68k/m680x0/m68020/bits/string.h * sysdeps/s390/bits/string.h, sysdeps/sparc/bits/string.h * sysdeps/x86/bits/string.h: Delete file. * string/string.h: Don't include bits/string.h. * string/bits/string3.h: Rename to bits/string_fortified.h. No need to undef various symbols that the removed headers might have defined as macros. * string/Makefile (headers): Remove bits/string.h, change bits/string3.h to bits/string_fortified.h. * string/string-inlines.c: Update commentary. Remove definitions of various macros that nothing looks at anymore. Don't directly include bits/string.h. Set _STRING_INLINE_unaligned here, based on compiler-predefined macros. * string/strncat.c: If STRNCAT is not defined, or STRNCAT_PRIMARY _is_ defined, provide internal hidden alias __strncat. * include/string.h: Declare internal hidden alias __strncat. Only forward __stpcpy to __builtin_stpcpy if __NO_STRING_INLINES is not defined. * include/bits/string3.h: Rename to bits/string_fortified.h, update to match above. * sysdeps/i386/string-inlines.c: Define compat symbols for everything formerly defined by sysdeps/x86/bits/string.h. Make existing definitions into compat symbols as well. Remove some no-longer-necessary messing around with macros. * sysdeps/powerpc/powerpc32/power4/multiarch/mempcpy.c * sysdeps/powerpc/powerpc64/multiarch/mempcpy.c * sysdeps/powerpc/powerpc64/multiarch/stpcpy.c * sysdeps/s390/multiarch/mempcpy.c No need to define _HAVE_STRING_ARCH_mempcpy. Do define __NO_STRING_INLINES and NO_MEMPCPY_STPCPY_REDIRECT. * sysdeps/i386/i686/multiarch/strncat-c.c * sysdeps/s390/multiarch/strncat-c.c * sysdeps/x86_64/multiarch/strncat-c.c Define STRNCAT_PRIMARY. Don't change definition of libc_hidden_def.
		
			
				
	
	
		
			561 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			561 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (C) 1999-2017 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 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
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, see
 | 
						|
   <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
/* This file contains compatibility definitions of functions that were
 | 
						|
   formerly defined as "extern inline" in string.h; it's conceivable
 | 
						|
   that old binaries contain references to them.  */
 | 
						|
 | 
						|
#define __NO_STRING_INLINES
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
#include "shlib-compat.h"
 | 
						|
 | 
						|
#if SHLIB_COMPAT (libc, GLIBC_2_1_1, GLIBC_2_25)
 | 
						|
/* These functions were removed from string.h in glibc 2.25.  */
 | 
						|
 | 
						|
char *
 | 
						|
__old_strtok_r_1c (char *__s, char __sep, char **__nextp)
 | 
						|
{
 | 
						|
  char *__result;
 | 
						|
  if (__s == NULL)
 | 
						|
    __s = *__nextp;
 | 
						|
  while (*__s == __sep)
 | 
						|
    ++__s;
 | 
						|
  __result = NULL;
 | 
						|
  if (*__s != '\0')
 | 
						|
    {
 | 
						|
      __result = __s++;
 | 
						|
      while (*__s != '\0')
 | 
						|
	if (*__s++ == __sep)
 | 
						|
	  {
 | 
						|
	    __s[-1] = '\0';
 | 
						|
	    break;
 | 
						|
	  }
 | 
						|
    }
 | 
						|
  *__nextp = __s;
 | 
						|
  return __result;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strtok_r_1c, __strtok_r_1c, GLIBC_2_1_1);
 | 
						|
 | 
						|
char *
 | 
						|
__old_strsep_1c (char **__s, char __reject)
 | 
						|
{
 | 
						|
  char *__retval = *__s;
 | 
						|
  if (__retval != NULL && (*__s = strchr (__retval, __reject)) != NULL)
 | 
						|
    *(*__s)++ = '\0';
 | 
						|
  return __retval;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strsep_1c, __strsep_1c, GLIBC_2_1_1);
 | 
						|
 | 
						|
char *
 | 
						|
__old_strsep_2c (char **__s, char __reject1, char __reject2)
 | 
						|
{
 | 
						|
  char *__retval = *__s;
 | 
						|
  if (__retval != NULL)
 | 
						|
    {
 | 
						|
      char *__cp = __retval;
 | 
						|
      while (1)
 | 
						|
	{
 | 
						|
	  if (*__cp == '\0')
 | 
						|
	    {
 | 
						|
	      __cp = NULL;
 | 
						|
	      break;
 | 
						|
	    }
 | 
						|
	  if (*__cp == __reject1 || *__cp == __reject2)
 | 
						|
	    {
 | 
						|
	      *__cp++ = '\0';
 | 
						|
	      break;
 | 
						|
	    }
 | 
						|
	  ++__cp;
 | 
						|
	}
 | 
						|
      *__s = __cp;
 | 
						|
    }
 | 
						|
  return __retval;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strsep_2c, __strsep_2c, GLIBC_2_1_1);
 | 
						|
 | 
						|
char *
 | 
						|
__old_strsep_3c (char **__s, char __reject1, char __reject2, char __reject3)
 | 
						|
{
 | 
						|
  char *__retval = *__s;
 | 
						|
  if (__retval != NULL)
 | 
						|
    {
 | 
						|
      char *__cp = __retval;
 | 
						|
      while (1)
 | 
						|
	{
 | 
						|
	  if (*__cp == '\0')
 | 
						|
	    {
 | 
						|
	      __cp = NULL;
 | 
						|
	      break;
 | 
						|
	    }
 | 
						|
	  if (*__cp == __reject1 || *__cp == __reject2 || *__cp == __reject3)
 | 
						|
	    {
 | 
						|
	      *__cp++ = '\0';
 | 
						|
	      break;
 | 
						|
	    }
 | 
						|
	  ++__cp;
 | 
						|
	}
 | 
						|
      *__s = __cp;
 | 
						|
    }
 | 
						|
  return __retval;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strsep_3c, __strsep_3c, GLIBC_2_1_1);
 | 
						|
#endif
 | 
						|
 | 
						|
#if SHLIB_COMPAT (libc, GLIBC_2_1_1, GLIBC_2_24)
 | 
						|
/* These functions were removed from string.h in glibc 2.24.  */
 | 
						|
 | 
						|
size_t
 | 
						|
__old_strcspn_c1 (const char *__s, int __reject)
 | 
						|
{
 | 
						|
  size_t __result = 0;
 | 
						|
  while (__s[__result] != '\0' && __s[__result] != __reject)
 | 
						|
    ++__result;
 | 
						|
  return __result;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strcspn_c1, __strcspn_c1, GLIBC_2_1_1);
 | 
						|
 | 
						|
size_t
 | 
						|
__old_strcspn_c2 (const char *__s, int __reject1, int __reject2)
 | 
						|
{
 | 
						|
  size_t __result = 0;
 | 
						|
  while (__s[__result] != '\0' && __s[__result] != __reject1
 | 
						|
	 && __s[__result] != __reject2)
 | 
						|
    ++__result;
 | 
						|
  return __result;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strcspn_c2, __strcspn_c2, GLIBC_2_1_1);
 | 
						|
 | 
						|
size_t
 | 
						|
__old_strcspn_c3 (const char *__s, int __reject1, int __reject2,
 | 
						|
	      int __reject3)
 | 
						|
{
 | 
						|
  size_t __result = 0;
 | 
						|
  while (__s[__result] != '\0' && __s[__result] != __reject1
 | 
						|
	 && __s[__result] != __reject2 && __s[__result] != __reject3)
 | 
						|
    ++__result;
 | 
						|
  return __result;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strcspn_c3, __strcspn_c3, GLIBC_2_1_1);
 | 
						|
 | 
						|
size_t
 | 
						|
__old_strspn_c1 (const char *__s, int __accept)
 | 
						|
{
 | 
						|
  size_t __result = 0;
 | 
						|
  /* Please note that __accept never can be '\0'.  */
 | 
						|
  while (__s[__result] == __accept)
 | 
						|
    ++__result;
 | 
						|
  return __result;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strspn_c1, __strspn_c1, GLIBC_2_1_1);
 | 
						|
 | 
						|
size_t
 | 
						|
__old_strspn_c2 (const char *__s, int __accept1, int __accept2)
 | 
						|
{
 | 
						|
  size_t __result = 0;
 | 
						|
  /* Please note that __accept1 and __accept2 never can be '\0'.  */
 | 
						|
  while (__s[__result] == __accept1 || __s[__result] == __accept2)
 | 
						|
    ++__result;
 | 
						|
  return __result;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strspn_c2, __strspn_c2, GLIBC_2_1_1);
 | 
						|
 | 
						|
size_t
 | 
						|
__old_strspn_c3 (const char *__s, int __accept1, int __accept2,
 | 
						|
		 int __accept3)
 | 
						|
{
 | 
						|
  size_t __result = 0;
 | 
						|
  /* Please note that __accept1 to __accept3 never can be '\0'.  */
 | 
						|
  while (__s[__result] == __accept1 || __s[__result] == __accept2
 | 
						|
	 || __s[__result] == __accept3)
 | 
						|
    ++__result;
 | 
						|
  return __result;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strspn_c3, __strspn_c3, GLIBC_2_1_1);
 | 
						|
 | 
						|
char *
 | 
						|
__old_strpbrk_c2 (const char *__s, int __accept1, int __accept2)
 | 
						|
{
 | 
						|
  /* Please note that __accept1 and __accept2 never can be '\0'.  */
 | 
						|
  while (*__s != '\0' && *__s != __accept1 && *__s != __accept2)
 | 
						|
    ++__s;
 | 
						|
  return *__s == '\0' ? NULL : (char *) (size_t) __s;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strpbrk_c2, __strpbrk_c2, GLIBC_2_1_1);
 | 
						|
 | 
						|
char *
 | 
						|
__old_strpbrk_c3 (const char *__s, int __accept1, int __accept2, int __accept3)
 | 
						|
{
 | 
						|
  /* Please note that __accept1 to __accept3 never can be '\0'.  */
 | 
						|
  while (*__s != '\0' && *__s != __accept1 && *__s != __accept2
 | 
						|
	 && *__s != __accept3)
 | 
						|
    ++__s;
 | 
						|
  return *__s == '\0' ? NULL : (char *) (size_t) __s;
 | 
						|
}
 | 
						|
compat_symbol (libc, __old_strpbrk_c3, __strpbrk_c3, GLIBC_2_1_1);
 | 
						|
 | 
						|
# if defined __mc68020__ || defined __s390__ || defined __i386__
 | 
						|
#  define _STRING_INLINE_unaligned 1
 | 
						|
# else
 | 
						|
#  define _STRING_INLINE_unaligned 0
 | 
						|
/* These are a few types we need for the optimizations if we cannot
 | 
						|
   use unaligned memory accesses.  */
 | 
						|
#  define __STRING2_COPY_TYPE(N) \
 | 
						|
  typedef struct { unsigned char __arr[N]; }				      \
 | 
						|
    __attribute__ ((__packed__)) __STRING2_COPY_ARR##N
 | 
						|
__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
 | 
						|
 | 
						|
# if _STRING_INLINE_unaligned
 | 
						|
void *
 | 
						|
__old_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)
 | 
						|
{
 | 
						|
  union {
 | 
						|
    __uint32_t __ui;
 | 
						|
    __uint16_t __usi;
 | 
						|
    unsigned char __uc;
 | 
						|
    unsigned char __c;
 | 
						|
  } *__u = __dest1;
 | 
						|
  switch ((unsigned int) __srclen)
 | 
						|
    {
 | 
						|
    case 1:
 | 
						|
      __u->__c = __src0_1;
 | 
						|
      __u = __extension__ ((void *) __u + 1);
 | 
						|
      break;
 | 
						|
    case 2:
 | 
						|
      __u->__usi = __src0_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      break;
 | 
						|
    case 3:
 | 
						|
      __u->__usi = __src0_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      __u->__c = __src2_1;
 | 
						|
      __u = __extension__ ((void *) __u + 1);
 | 
						|
      break;
 | 
						|
    case 4:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      break;
 | 
						|
    case 5:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__c = __src4_1;
 | 
						|
      __u = __extension__ ((void *) __u + 1);
 | 
						|
      break;
 | 
						|
    case 6:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__usi = __src4_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      break;
 | 
						|
    case 7:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__usi = __src4_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      __u->__c = __src6_1;
 | 
						|
      __u = __extension__ ((void *) __u + 1);
 | 
						|
      break;
 | 
						|
    case 8:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__ui = __src4_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  return (void *) __u;
 | 
						|
}
 | 
						|
 | 
						|
# else
 | 
						|
 | 
						|
void *
 | 
						|
__old_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)
 | 
						|
{
 | 
						|
  union {
 | 
						|
    char __c;
 | 
						|
    __STRING2_COPY_ARR2 __sca2;
 | 
						|
    __STRING2_COPY_ARR3 __sca3;
 | 
						|
    __STRING2_COPY_ARR4 __sca4;
 | 
						|
    __STRING2_COPY_ARR5 __sca5;
 | 
						|
    __STRING2_COPY_ARR6 __sca6;
 | 
						|
    __STRING2_COPY_ARR7 __sca7;
 | 
						|
    __STRING2_COPY_ARR8 __sca8;
 | 
						|
  } *__u = __dest;
 | 
						|
  switch ((unsigned int) __srclen)
 | 
						|
    {
 | 
						|
    case 1:
 | 
						|
      __u->__c = __src1;
 | 
						|
      break;
 | 
						|
    case 2:
 | 
						|
      __extension__ __u->__sca2 = __src2;
 | 
						|
      break;
 | 
						|
    case 3:
 | 
						|
      __extension__ __u->__sca3 = __src3;
 | 
						|
      break;
 | 
						|
    case 4:
 | 
						|
      __extension__ __u->__sca4 = __src4;
 | 
						|
      break;
 | 
						|
    case 5:
 | 
						|
      __extension__ __u->__sca5 = __src5;
 | 
						|
      break;
 | 
						|
    case 6:
 | 
						|
      __extension__ __u->__sca6 = __src6;
 | 
						|
      break;
 | 
						|
    case 7:
 | 
						|
      __extension__ __u->__sca7 = __src7;
 | 
						|
      break;
 | 
						|
    case 8:
 | 
						|
      __extension__ __u->__sca8 = __src8;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  return __extension__ ((void *) __u + __srclen);
 | 
						|
}
 | 
						|
# endif
 | 
						|
compat_symbol (libc, __old_mempcpy_small, __mempcpy_small, GLIBC_2_1_1);
 | 
						|
 | 
						|
# if _STRING_INLINE_unaligned
 | 
						|
char *
 | 
						|
__old_strcpy_small (char *__dest,
 | 
						|
		    __uint16_t __src0_2, __uint16_t __src4_2,
 | 
						|
		    __uint32_t __src0_4, __uint32_t __src4_4,
 | 
						|
		    size_t __srclen)
 | 
						|
{
 | 
						|
  union {
 | 
						|
    __uint32_t __ui;
 | 
						|
    __uint16_t __usi;
 | 
						|
    unsigned char __uc;
 | 
						|
  } *__u = (void *) __dest;
 | 
						|
  switch ((unsigned int) __srclen)
 | 
						|
    {
 | 
						|
    case 1:
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 2:
 | 
						|
      __u->__usi = __src0_2;
 | 
						|
      break;
 | 
						|
    case 3:
 | 
						|
      __u->__usi = __src0_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 4:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      break;
 | 
						|
    case 5:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 6:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__usi = __src4_2;
 | 
						|
      break;
 | 
						|
    case 7:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__usi = __src4_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 8:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__ui = __src4_4;
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  return __dest;
 | 
						|
}
 | 
						|
 | 
						|
# else
 | 
						|
 | 
						|
char *
 | 
						|
__old_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)
 | 
						|
{
 | 
						|
  union {
 | 
						|
    char __c;
 | 
						|
    __STRING2_COPY_ARR2 __sca2;
 | 
						|
    __STRING2_COPY_ARR3 __sca3;
 | 
						|
    __STRING2_COPY_ARR4 __sca4;
 | 
						|
    __STRING2_COPY_ARR5 __sca5;
 | 
						|
    __STRING2_COPY_ARR6 __sca6;
 | 
						|
    __STRING2_COPY_ARR7 __sca7;
 | 
						|
    __STRING2_COPY_ARR8 __sca8;
 | 
						|
  } *__u = (void *) __dest;
 | 
						|
  switch ((unsigned int) __srclen)
 | 
						|
    {
 | 
						|
    case 1:
 | 
						|
      __u->__c = '\0';
 | 
						|
      break;
 | 
						|
    case 2:
 | 
						|
      __extension__ __u->__sca2 = __src2;
 | 
						|
      break;
 | 
						|
    case 3:
 | 
						|
      __extension__ __u->__sca3 = __src3;
 | 
						|
      break;
 | 
						|
    case 4:
 | 
						|
      __extension__ __u->__sca4 = __src4;
 | 
						|
      break;
 | 
						|
    case 5:
 | 
						|
      __extension__ __u->__sca5 = __src5;
 | 
						|
      break;
 | 
						|
    case 6:
 | 
						|
      __extension__ __u->__sca6 = __src6;
 | 
						|
      break;
 | 
						|
    case 7:
 | 
						|
      __extension__ __u->__sca7 = __src7;
 | 
						|
      break;
 | 
						|
    case 8:
 | 
						|
      __extension__ __u->__sca8 = __src8;
 | 
						|
      break;
 | 
						|
  }
 | 
						|
  return __dest;
 | 
						|
}
 | 
						|
# endif
 | 
						|
compat_symbol (libc, __old_strcpy_small, __strcpy_small, GLIBC_2_1_1);
 | 
						|
 | 
						|
# if _STRING_INLINE_unaligned
 | 
						|
char *
 | 
						|
__old_stpcpy_small (char *__dest,
 | 
						|
		    __uint16_t __src0_2, __uint16_t __src4_2,
 | 
						|
		    __uint32_t __src0_4, __uint32_t __src4_4,
 | 
						|
		    size_t __srclen)
 | 
						|
{
 | 
						|
  union {
 | 
						|
    unsigned int __ui;
 | 
						|
    unsigned short int __usi;
 | 
						|
    unsigned char __uc;
 | 
						|
    char __c;
 | 
						|
  } *__u = (void *) __dest;
 | 
						|
  switch ((unsigned int) __srclen)
 | 
						|
    {
 | 
						|
    case 1:
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 2:
 | 
						|
      __u->__usi = __src0_2;
 | 
						|
      __u = __extension__ ((void *) __u + 1);
 | 
						|
      break;
 | 
						|
    case 3:
 | 
						|
      __u->__usi = __src0_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 4:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 3);
 | 
						|
      break;
 | 
						|
    case 5:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 6:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__usi = __src4_2;
 | 
						|
      __u = __extension__ ((void *) __u + 1);
 | 
						|
      break;
 | 
						|
    case 7:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__usi = __src4_2;
 | 
						|
      __u = __extension__ ((void *) __u + 2);
 | 
						|
      __u->__uc = '\0';
 | 
						|
      break;
 | 
						|
    case 8:
 | 
						|
      __u->__ui = __src0_4;
 | 
						|
      __u = __extension__ ((void *) __u + 4);
 | 
						|
      __u->__ui = __src4_4;
 | 
						|
      __u = __extension__ ((void *) __u + 3);
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  return &__u->__c;
 | 
						|
}
 | 
						|
 | 
						|
# else
 | 
						|
 | 
						|
char *
 | 
						|
__old_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)
 | 
						|
{
 | 
						|
  union {
 | 
						|
    char __c;
 | 
						|
    __STRING2_COPY_ARR2 __sca2;
 | 
						|
    __STRING2_COPY_ARR3 __sca3;
 | 
						|
    __STRING2_COPY_ARR4 __sca4;
 | 
						|
    __STRING2_COPY_ARR5 __sca5;
 | 
						|
    __STRING2_COPY_ARR6 __sca6;
 | 
						|
    __STRING2_COPY_ARR7 __sca7;
 | 
						|
    __STRING2_COPY_ARR8 __sca8;
 | 
						|
  } *__u = (void *) __dest;
 | 
						|
  switch ((unsigned int) __srclen)
 | 
						|
    {
 | 
						|
    case 1:
 | 
						|
      __u->__c = '\0';
 | 
						|
      break;
 | 
						|
    case 2:
 | 
						|
      __extension__ __u->__sca2 = __src2;
 | 
						|
      break;
 | 
						|
    case 3:
 | 
						|
      __extension__ __u->__sca3 = __src3;
 | 
						|
      break;
 | 
						|
    case 4:
 | 
						|
      __extension__ __u->__sca4 = __src4;
 | 
						|
      break;
 | 
						|
    case 5:
 | 
						|
      __extension__ __u->__sca5 = __src5;
 | 
						|
      break;
 | 
						|
    case 6:
 | 
						|
      __extension__ __u->__sca6 = __src6;
 | 
						|
      break;
 | 
						|
    case 7:
 | 
						|
      __extension__ __u->__sca7 = __src7;
 | 
						|
      break;
 | 
						|
    case 8:
 | 
						|
      __extension__ __u->__sca8 = __src8;
 | 
						|
      break;
 | 
						|
  }
 | 
						|
  return __dest + __srclen - 1;
 | 
						|
}
 | 
						|
# endif
 | 
						|
compat_symbol (libc, __old_stpcpy_small, __stpcpy_small, GLIBC_2_1_1);
 | 
						|
 | 
						|
#endif
 |