mirror of
https://github.com/ipxe/ipxe
synced 2025-12-18 02:20:19 +03:00
[libc] Provide an unoptimised generic_memcpy_reverse()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -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;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user