43 lines
1.1 KiB
C++
43 lines
1.1 KiB
C++
/*
|
|
* FragmentEntry.cpp
|
|
*
|
|
* Created on: Jan 5, 2022
|
|
* @author Andrey Belomutskiy, (c) 2012-2022
|
|
*/
|
|
|
|
#include "pch.h"
|
|
#include "FragmentEntry.h"
|
|
|
|
void copyRange(uint8_t* destination, FragmentList src, size_t skip, size_t size) {
|
|
int fragmentIndex = 0;
|
|
|
|
// Find which fragment to start - skip any full fragments smaller than `skip` parameter
|
|
while (skip > src.fragments[fragmentIndex].size && fragmentIndex <= src.count) {
|
|
skip -= src.fragments[fragmentIndex].size;
|
|
fragmentIndex++;
|
|
}
|
|
|
|
int destinationIndex = 0;
|
|
|
|
while (size > 0) {
|
|
if (fragmentIndex >= src.count) {
|
|
// somehow we are past the end of fragments - fill with zeros
|
|
memset(destination + destinationIndex, 0, size);
|
|
return;
|
|
}
|
|
|
|
int copyNowSize = minI(size, src.fragments[fragmentIndex].size - skip);
|
|
const uint8_t* fromBase = src.fragments[fragmentIndex].data;
|
|
if (!fromBase) {
|
|
// we have no buffer for this fragment - fill with zeroes
|
|
memset(destination + destinationIndex, 0, copyNowSize);
|
|
} else {
|
|
memcpy(destination + destinationIndex, fromBase + skip, copyNowSize);
|
|
}
|
|
destinationIndex += copyNowSize;
|
|
skip = 0;
|
|
size -= copyNowSize;
|
|
fragmentIndex++;
|
|
}
|
|
}
|