_INLINE_ uint8_t print_last_block()

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;
}