| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | /* | |||
| 2 | * FragmentEntry.cpp | |||
| 3 | * | |||
| 4 | * Created on: Jan 5, 2022 | |||
| 5 | * @author Andrey Belomutskiy, (c) 2012-2022 | |||
| 6 | */ | |||
| 7 | ||||
| 8 | #include <rusefi/fragments.h> | |||
| 9 | ||||
| 10 | #include <rusefi/rusefi_math.h> | |||
| 11 | #include <cstring> | |||
| 12 | ||||
| 13 | 7 | size_t copyRange(uint8_t* destination, FragmentList src, size_t skip, size_t size) { | ||
| 14 | 7 | size_t fragmentIndex = 0; | ||
| 15 | ||||
| 16 | // Find which fragment to start - skip any full fragments smaller than `skip` parameter | |||
| 17 |
4/4✓ Branch 0 taken 17 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 6 times.
|
0/1? Decision couldn't be analyzed.
|
18 | while (fragmentIndex < src.count && skip >= src.fragments[fragmentIndex].size) { |
| 18 | 11 | skip -= src.fragments[fragmentIndex].size; | ||
| 19 | 11 | fragmentIndex++; | ||
| 20 | } | |||
| 21 | ||||
| 22 | 7 | size_t destinationIndex = 0; | ||
| 23 | ||||
| 24 |
2/2✓ Branch 0 taken 14 times.
✓ Branch 1 taken 5 times.
|
2/2✓ Decision 'true' taken 14 times.
✓ Decision 'false' taken 5 times.
|
19 | while (size > 0) { |
| 25 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 12 times.
|
2/2✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 12 times.
|
14 | if (fragmentIndex >= src.count) { |
| 26 | // somehow we are past the end of fragments - fill with zeros | |||
| 27 | 2 | memset(destination + destinationIndex, 0, size); | ||
| 28 | 2 | return destinationIndex; | ||
| 29 | } | |||
| 30 | ||||
| 31 | 12 | int copyNowSize = minI(size, src.fragments[fragmentIndex].size - skip); | ||
| 32 | 12 | const uint8_t* fromBase = src.fragments[fragmentIndex].get(); | ||
| 33 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 9 times.
|
2/2✓ Decision 'true' taken 3 times.
✓ Decision 'false' taken 9 times.
|
12 | if (!fromBase) { |
| 34 | // we have no buffer for this fragment - fill with zeroes | |||
| 35 | 3 | memset(destination + destinationIndex, 0, copyNowSize); | ||
| 36 | } else { | |||
| 37 | 9 | memcpy(destination + destinationIndex, fromBase + skip, copyNowSize); | ||
| 38 | } | |||
| 39 | 12 | destinationIndex += copyNowSize; | ||
| 40 | 12 | skip = 0; | ||
| 41 | 12 | size -= copyNowSize; | ||
| 42 | 12 | fragmentIndex++; | ||
| 43 | } | |||
| 44 | 5 | return destinationIndex; | ||
| 45 | } | |||
| 46 | ||||
| 47 | 14 | size_t getRangePtr(uint8_t **ptr, FragmentList src, size_t offset, size_t size) | ||
| 48 | { | |||
| 49 | 14 | size_t fragmentIndex = 0; | ||
| 50 | ||||
| 51 | // Find which fragment to start - skip any full fragments smaller than `skip` parameter | |||
| 52 |
4/4✓ Branch 0 taken 39 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 12 times.
|
0/1? Decision couldn't be analyzed.
|
41 | while (fragmentIndex < src.count && offset >= src.fragments[fragmentIndex].size) { |
| 53 | 27 | offset -= src.fragments[fragmentIndex].size; | ||
| 54 | 27 | fragmentIndex++; | ||
| 55 | } | |||
| 56 | ||||
| 57 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 12 times.
|
2/2✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 12 times.
|
14 | if (fragmentIndex >= src.count) { |
| 58 | // out of range | |||
| 59 | 2 | *ptr = NULL; | ||
| 60 | 2 | return size; | ||
| 61 | } | |||
| 62 | ||||
| 63 |
2/2✓ Branch 1 taken 9 times.
✓ Branch 2 taken 3 times.
|
2/2✓ Decision 'true' taken 9 times.
✓ Decision 'false' taken 3 times.
|
12 | if (src.fragments[fragmentIndex].get() != NULL) |
| 64 | 9 | *ptr = (uint8_t *)src.fragments[fragmentIndex].get() + offset; | ||
| 65 | else | |||
| 66 | 3 | *ptr = NULL; | ||
| 67 | 12 | return minI(size, src.fragments[fragmentIndex].size - offset); | ||
| 68 | } | |||
| 69 |