Skip to content

MemMove

Description

Move memory from source to destination, handling overlapping regions. A zero byte count returns dst without reading either pointer.

Parameters

Name Direction Description
dst out Destination memory region.
src in Source memory region.
n in Number of bytes to move.

Success

Returns destination pointer.

Failure

Aborts via LOG_FATAL when n > 0 and either dst or src is NULL.

Usage example (Cross-references)

Usage examples (Cross-references)
    
    __attribute__((used)) void *memmove(void *dst, const void *src, freestanding_size_t n) {
        MemMove(dst, src, (size)n);
        return dst;
    }
    }
    
    void *MemMove(void *dst, const void *src, size n) {
        if (n == 0) {
            return dst;
        u32 to_move = *len_p - ins;
        if (to_move > 0u) {
            MemMove(&arr[ins + 1u], &arr[ins], (size)to_move * sizeof(PageEntry));
        }
        arr[ins].ptr    = ptr;
        u32 to_move  = *len_p - idx;
        if (to_move > 0u) {
            MemMove(&arr[idx], &arr[idx + 1u], (size)to_move * sizeof(PageEntry));
        }
    }
        u32 to_move = page->free_len - ins;
        if (to_move > 0u) {
            MemMove(&arr[ins + 1u], &arr[ins], (size)to_move * sizeof(PageEntry));
        }
        arr[ins].ptr    = ptr;
            // [ins..len) slice has to shift in lockstep -- per-slab the
            // shift is `bw` u64 words wide.
            MemMove(&slab->slabs[ins + 1u], &slab->slabs[ins], (size)to_move * sizeof(void *));
            MemMove(
                &slab->bitmaps[(size)(ins + 1u) * (size)bw],
            // shift is `bw` u64 words wide.
            MemMove(&slab->slabs[ins + 1u], &slab->slabs[ins], (size)to_move * sizeof(void *));
            MemMove(
                &slab->bitmaps[(size)(ins + 1u) * (size)bw],
                &slab->bitmaps[(size)ins * (size)bw],
    
        if (idx < vec->length) {
            MemMove(
                vec_ptr_at(vec, idx + count, item_size),
                vec_ptr_at(vec, idx, item_size),
                    MemSet(vec_ptr_at(vec, idx, item_size), 0, count * aligned_size);
                    if (idx < vec->length) {
                        MemMove(
                            vec_ptr_at(vec, idx, item_size),
                            vec_ptr_at(vec, idx + count, item_size),
                displaced = count;
            }
            MemMove(
                vec_ptr_at(vec, vec->length + count - displaced, item_size),
                vec_ptr_at(vec, idx, item_size),
    
                    if (displaced) {
                        MemMove(
                            vec_ptr_at(vec, idx, item_size),
                            vec_ptr_at(vec, vec->length + count - displaced, item_size),
        // MemCopy) because the source and destination ranges overlap when
        // start + count < length.
        MemMove(
            vec_ptr_at(vec, start, item_size),
            vec_ptr_at(vec, start + count, item_size),
    
        if (elements_to_move > 0) {
            MemMove(
                vec_ptr_at(vec, start, item_size),
                vec_ptr_at(vec, vec->length - elements_to_move, item_size),
Last updated on