in src/common/utilities.c [58:112]
_INLINE_ uint8_t print_last_block(IN const uint8_t *last_bytes,
IN const uint32_t bits_num,
IN const uint32_t endien)
{
// Floor of bits/64 the reminder is in the next QW
const uint32_t qw_num = bits_num / BITS_IN_QWORD;
// How many bits to pad with zero
const uint32_t rem_bits = bits_num - (BITS_IN_QWORD * qw_num);
// We read byte by byte and not the whole QW, in order to avoid reading a bad
// memory address
const uint32_t bytes_num =
((rem_bits % 8) == 0) ? rem_bits / BITS_IN_BYTE : 1 + rem_bits / BITS_IN_BYTE;
// Must be signed for the LE loop
int i;
if(0 == rem_bits) {
return 0;
}
// Mask unneeded bits
const uint8_t last_byte = (rem_bits % 8 == 0)
? last_bytes[bytes_num - 1]
: last_bytes[bytes_num - 1] & MASK(rem_bits % 8);
// BE
if(0 == endien) {
for(i = 0; (uint32_t)i < (bytes_num - 1); i++) {
printf("%.2x", last_bytes[i]);
}
printf("%.2x", last_byte);
for(i++; (uint32_t)i < sizeof(uint64_t); i++) {
printf("__");
}
} else {
for(i = sizeof(uint64_t) - 1; (uint32_t)i >= bytes_num; i--) {
printf("__");
}
printf("%.2x", last_byte);
for(i--; i >= 0; i--) {
printf("%.2x", last_bytes[i]);
}
}
# if !defined(NO_SPACE)
printf(" ");
# endif
return 1;
}