29#include <common/util.h>
31#define __XC(a, b) OSCAP_CONCAT(a, b)
32#define _sym(n) __XC(__XC(_sym, __LINE__), n)
34typedef uint32_t spb_flags_t;
36#define SPB_FLAG_FREE 0x00000001
37#define SPB_FLAG_JOIN 0x00000002
38#define SPB_FLAG_FILE 0x00000004
40typedef uint64_t spb_size_t;
41#define SPB_SZ_FMT "%"PRIo64
55#define SPB_DEFAULT_BALLOC 32
56#define SPB_BALLOC_HIGHTRESH 512
57#define SPB_BALLOC_ADD 32
67spb_t *spb_new (
void *buffer,
size_t buflen, uint32_t balloc);
69void spb_free (
spb_t *spb, spb_flags_t flags);
77uint32_t spb_bindex (
spb_t *spb, spb_size_t index);
83spb_size_t spb_size (
spb_t *spb);
93#define spb_iterate_oct(spb, start, end, name) while(0)
95#define spb_iterate(spb, start, name, icode) \
97 spb_size_t _sym(istart) = (start); \
98 spb_t *_sym(ispb) = (spb); \
99 uint32_t _sym(idx) = spb_bindex(_sym(ispb), _sym(istart)); \
100 size_t _sym(l_off) = (size_t)(_sym(idx) > 0 ? start - _sym(ispb)->buffer[_sym(idx) - 1].gend - 1 : start); \
102 for (; _sym(idx) < _sym(ispb)->btotal; ++_sym(idx)) { \
103 register size_t _sym(l); \
104 register uint8_t *_sym(b); \
106 _sym(l) = (size_t)(_sym(idx) > 0 ? \
107 _sym(ispb)->buffer[_sym(idx)].gend - _sym(ispb)->buffer[_sym(idx) - 1].gend : \
108 _sym(ispb)->buffer[_sym(idx)].gend + 1) - _sym(l_off); \
109 _sym(b) = ((uint8_t *)(_sym(ispb)->buffer[_sym(idx)].base)) + _sym(l_off); \
111 for (; _sym(l) > 0; --_sym(l), ++_sym(b)) { \
129int spb_add (
spb_t *spb,
void *buffer,
size_t buflen);
138int spb_pick (
spb_t *spb, spb_size_t start, spb_size_t size,
void *dst);
150int spb_pick_raw (
spb_t *spb, uint32_t bindex, spb_size_t start, spb_size_t size,
void *dst);
164int spb_pick_cb (
spb_t *spb, spb_size_t start, spb_size_t size,
void *cb (
void *,
void *,
size_t),
void *cbarg);
166spb_size_t spb_drop_head (
spb_t *spb, spb_size_t size, spb_flags_t flags);
168uint8_t spb_octet (
spb_t *spb, spb_size_t idx);
169const uint8_t *spb_direct (
spb_t *spb, spb_size_t start, spb_size_t size);