[libc] Provide an unoptimised generic_memcpy_reverse()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/119/head
Michael Brown 2020-07-07 13:13:28 +01:00
parent d2fb317fee
commit 2f032c84a2
2 changed files with 24 additions and 7 deletions

View File

@ -52,7 +52,7 @@ void * generic_memset ( void *dest, int character, size_t len ) {
} }
/** /**
* Copy memory region * Copy memory region (forwards)
* *
* @v dest Destination region * @v dest Destination region
* @v src Source region * @v src Source region
@ -68,6 +68,23 @@ void * generic_memcpy ( void *dest, const void *src, size_t len ) {
return dest; return dest;
} }
/**
* Copy memory region (backwards)
*
* @v dest Destination region
* @v src Source region
* @v len Length
* @ret dest Destination region
*/
void * generic_memcpy_reverse ( void *dest, const void *src, size_t len ) {
const uint8_t *src_bytes = ( src + len );
uint8_t *dest_bytes = ( dest + len );
while ( len-- )
*(--dest_bytes) = *(--src_bytes);
return dest;
}
/** /**
* Copy (possibly overlapping) memory region * Copy (possibly overlapping) memory region
* *
@ -77,14 +94,12 @@ void * generic_memcpy ( void *dest, const void *src, size_t len ) {
* @ret dest Destination region * @ret dest Destination region
*/ */
void * generic_memmove ( void *dest, const void *src, size_t len ) { void * generic_memmove ( void *dest, const void *src, size_t len ) {
const uint8_t *src_bytes = ( src + len );
uint8_t *dest_bytes = ( dest + len );
if ( dest < src ) if ( dest < src ) {
return generic_memcpy ( dest, src, len ); return generic_memcpy ( dest, src, len );
while ( len-- ) } else {
*(--dest_bytes) = *(--src_bytes); return generic_memcpy_reverse ( dest, src, len );
return dest; }
} }
/** /**

View File

@ -15,6 +15,8 @@ extern void * generic_memset ( void *dest, int character,
size_t len ) __nonnull; size_t len ) __nonnull;
extern void * generic_memcpy ( void *dest, const void *src, extern void * generic_memcpy ( void *dest, const void *src,
size_t len ) __nonnull; size_t len ) __nonnull;
extern void * generic_memcpy_reverse ( void *dest, const void *src,
size_t len ) __nonnull;
extern void * generic_memmove ( void *dest, const void *src, extern void * generic_memmove ( void *dest, const void *src,
size_t len ) __nonnull; size_t len ) __nonnull;