For AARCH64, do not define a memcpy function in stdlib because it is already defined in CompilerIntrinsicsLib. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Scott Duplichan <scott@notabs.org> Reviewed-by: Daryl McDaniel <edk2-lists@mc2research.org> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18063 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			147 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|     Copying Functions for <string.h>.
 | |
| 
 | |
|     Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
 | |
|     This program and the accompanying materials are licensed and made available under
 | |
|     the terms and conditions of the BSD License that accompanies this distribution.
 | |
|     The full text of the license may be found at
 | |
|     http://opensource.org/licenses/bsd-license.php.
 | |
| 
 | |
|     THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
|     WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| **/
 | |
| #include  <Uefi.h>
 | |
| #include  <Library/BaseLib.h>
 | |
| #include  <Library/BaseMemoryLib.h>
 | |
| 
 | |
| #include  <LibConfig.h>
 | |
| 
 | |
| #include  <stdlib.h>
 | |
| #include  <string.h>
 | |
| 
 | |
| /** Do not define memcpy for IPF+GCC or ARM/AARCH64+GCC builds.
 | |
|     For IPF, using a GCC compiler, the memcpy function is converted to
 | |
|     CopyMem by objcpy during build.
 | |
|     For ARM/AARCH64, the memcpy function is provided by the CompilerIntrinsics library.
 | |
| **/
 | |
| #if !((defined(MDE_CPU_IPF) || defined(MDE_CPU_ARM) || defined(MDE_CPU_AARCH64)) && defined(__GNUC__))
 | |
| /** The memcpy function copies n characters from the object pointed to by s2
 | |
|     into the object pointed to by s1.
 | |
| 
 | |
|     The implementation is reentrant and handles the case where s2 overlaps s1.
 | |
| 
 | |
|     @return   The memcpy function returns the value of s1.
 | |
| **/
 | |
| void *
 | |
| memcpy(void * __restrict s1, const void * __restrict s2, size_t n)
 | |
| {
 | |
|   return CopyMem( s1, s2, n);
 | |
| }
 | |
| #endif  /* !(defined(MDE_CPU_IPF) && defined(__GCC)) */
 | |
| 
 | |
| /** The memmove function copies n characters from the object pointed to by s2
 | |
|     into the object pointed to by s1. Copying takes place as if the n
 | |
|     characters from the object pointed to by s2 are first copied into a
 | |
|     temporary array of n characters that does not overlap the objects pointed
 | |
|     to by s1 and s2, and then the n characters from the temporary array are
 | |
|     copied into the object pointed to by s1.
 | |
| 
 | |
|     This is a version of memcpy that is guaranteed to work when s1 and s2
 | |
|     overlap.  Since our implementation of memcpy already handles overlap,
 | |
|     memmove can be identical to memcpy.
 | |
| 
 | |
|     @return   The memmove function returns the value of s1.
 | |
| **/
 | |
| void *
 | |
| memmove(void *s1, const void *s2, size_t n)
 | |
| {
 | |
|   return CopyMem( s1, s2, n);
 | |
| }
 | |
| 
 | |
| /** The strcpy function copies the string pointed to by s2 (including the
 | |
|     terminating null character) into the array pointed to by s1. If copying
 | |
|     takes place between objects that overlap, the behavior is undefined.
 | |
| 
 | |
|     @return   The strcpy function returns the value of s1.
 | |
| **/
 | |
| char *
 | |
| strcpy(char * __restrict s1, const char * __restrict s2)
 | |
| {
 | |
|   //char *s1ret = s1;
 | |
| 
 | |
|   //while ( *s1++ = *s2++)  /* Empty Body */;
 | |
|   //return(s1ret);
 | |
|   return AsciiStrCpy( s1, s2);
 | |
| }
 | |
| 
 | |
| /** The strncpy function copies not more than n characters (characters that
 | |
|     follow a null character are not copied) from the array pointed to by s2 to
 | |
|     the array pointed to by s1. If copying takes place between objects that
 | |
|     overlap, the behavior is undefined.
 | |
| 
 | |
|     If the array pointed to by s2 is a string that is shorter than n
 | |
|     characters, null characters are appended to the copy in the array pointed
 | |
|     to by s1, until n characters in all have been written.
 | |
| 
 | |
|     @return   The strncpy function returns the value of s1.
 | |
| **/
 | |
| char     *strncpy(char * __restrict s1, const char * __restrict s2, size_t n)
 | |
| {
 | |
|   return AsciiStrnCpy( s1, s2, n);
 | |
|   //char *dest = s1;
 | |
| 
 | |
|   //while(n != 0) {
 | |
|   //  --n;
 | |
|   //  if((*dest++ = *s2++) == '\0')  break;
 | |
|   //}
 | |
|   //while(n != 0) {
 | |
|   //  *dest++ = '\0';
 | |
|   //  --n;
 | |
|   //}
 | |
|   //return (s1);
 | |
| }
 | |
| 
 | |
| /** The strncpyX function copies not more than n-1 characters (characters that
 | |
|     follow a null character are not copied) from the array pointed to by s2 to
 | |
|     the array pointed to by s1. Array s1 is guaranteed to be NULL terminated.
 | |
|     If copying takes place between objects that overlap,
 | |
|     the behavior is undefined.
 | |
| 
 | |
|     strncpyX exists because normal strncpy does not indicate if the copy was
 | |
|     terminated because of exhausting the buffer or reaching the end of s2.
 | |
| 
 | |
|     @return   The strncpyX function returns 0 if the copy operation was
 | |
|               terminated because it reached the end of s1.  Otherwise,
 | |
|               a non-zero value is returned indicating how many characters
 | |
|               remain in s1.
 | |
| **/
 | |
| int strncpyX(char * __restrict s1, const char * __restrict s2, size_t n)
 | |
| {
 | |
|   int NumLeft;
 | |
| 
 | |
|   for( ; n != 0; --n) {
 | |
|     if((*s1++ = *s2++) == '\0')  break;
 | |
|   }
 | |
|   NumLeft = (int)n;
 | |
| 
 | |
|   for( --s1; n != 0; --n) {
 | |
|     *s1++ = '\0';
 | |
|   }
 | |
| 
 | |
|   return NumLeft;   // Zero if we ran out of buffer ( strlen(s1) < strlen(s2) )
 | |
| }
 | |
| 
 | |
| /** NetBSD Compatibility Function strdup creates a duplicate copy of a string. **/
 | |
| char *
 | |
| strdup(const char *str)
 | |
| {
 | |
|   size_t len;
 | |
|   char *copy;
 | |
| 
 | |
|   len = strlen(str) + 1;
 | |
|   if ((copy = malloc(len)) == NULL)
 | |
|     return (NULL);
 | |
|   memcpy(copy, str, len);
 | |
|   return (copy);
 | |
| }
 |