34 static inline int circ_range(
void **b1,
size_t *l1,
void **b2,
void *b_base,
35 size_t b_len,
size_t pos,
size_t len)
40 if (pos + len <= b_len) {
59 static inline size_t circ_offset(
size_t pos,
size_t len,
size_t off)
68 static inline int circ_in_interval(
size_t start,
size_t end,
size_t len,
72 return (pos >= start && pos <= end);
74 return (pos >= start) || (pos <= end);
78 static inline void circ_read(
void *dst,
void *b_base,
size_t b_len,
79 size_t pos,
size_t len)
85 if (circ_range(&b1, &l, &b2, b_base, b_len, pos, len) == 0) {
89 memcpy(d + l, b2, len - l);
93 static inline void circ_write(
const void *dst,
void *b_base,
size_t b_len,
94 size_t pos,
size_t len)
96 const uint8_t *d = dst;
100 if (circ_range(&b1, &l, &b2, b_base, b_len, pos, len) == 0) {
104 memcpy(b2, d + l, len - l);
108 static inline void split_write(
const void *src,
size_t len,
void *buf_1,
109 size_t len_1,
void *buf_2,
size_t len_2,
size_t off)
113 assert(len + off <= len_1 + len_2);
114 if (off + len <= len_1) {
116 memcpy((uint8_t *) buf_1 + off, src, len);
117 }
else if (off >= len_1) {
119 memcpy((uint8_t *) buf_2 + (off - len_1), src, len);
123 memcpy((uint8_t *) buf_1 + off, src, l);
124 memcpy(buf_2, (
const uint8_t *) src + l, len - l);
128 static inline void split_read(
void *dst,
size_t len,
const void *buf_1,
129 size_t len_1,
const void *buf_2,
size_t len_2,
size_t off)
133 assert(len + off <= len_1 + len_2);
134 if (off + len <= len_1) {
136 memcpy(dst, (
const uint8_t *) buf_1 + off, len);
137 }
else if (off >= len_1) {
139 memcpy(dst, (
const uint8_t *) buf_2 + (off - len_1), len);
143 memcpy(dst, (
const uint8_t *) buf_1 + off, l);
144 memcpy((uint8_t *) dst + l, buf_2, len - l);