static inline ssize_t _fr_dbuff_out_int64v(int64_t *num, uint8_t **pos_p, fr_dbuff_t *dbuff, size_t length)
{
ssize_t slen;
- bool negative;
+ uint8_t msb = **pos_p;
fr_assert(length > 0 && length <= sizeof(uint64_t));
- negative = *fr_dbuff_current(dbuff) & 0x80;
-
*num = 0;
slen = _fr_dbuff_out_memcpy(((uint8_t *) num) + (8 - length), pos_p, dbuff, length);
if (slen <= 0) return slen;
+ if (msb & 0x80) memset(((uint8_t *)num), 0xff, sizeof(*num) - length);
*num = fr_net_to_int64((uint8_t const *)num);
- if (negative) *num = -*num;
return length;
}
return ntohll(num);
}
+static inline uint64_t fr_net_to_int64v(uint8_t const *data, size_t data_len)
+{
+ int64_t num = 0;
+
+ if (unlikely(data_len > sizeof(uint64_t))) return 0;
+
+ /*
+ * Copy at an offset into memory
+ * allocated for the uin64_t
+ */
+ memcpy(((uint8_t *)&num) + (sizeof(uint64_t) - data_len), data, data_len); /* aligned */
+
+ if (*data & 0x80) memset(((uint8_t *)&num) + data_len, 0xff, sizeof(num) - data_len);
+
+ return ntohll(num);
+}
+
/** Convert bits (as in prefix length) to bytes, rounding up.
*
* @param bits number of bits in the prefix