00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024 #ifndef SPB_H
00025 #define SPB_H
00026
00027 #include <stddef.h>
00028 #include <inttypes.h>
00029 #include <common/util.h>
00030
00031 #define __XC(a, b) OSCAP_CONCAT(a, b)
00032 #define _sym(n) __XC(__XC(_sym, __LINE__), n)
00033
00034 typedef uint32_t spb_flags_t;
00035
00036 #define SPB_FLAG_FREE 0x00000001
00037 #define SPB_FLAG_JOIN 0x00000002
00038 #define SPB_FLAG_FILE 0x00000004
00039
00040 typedef uint64_t spb_size_t;
00041 #define SPB_SZ_FMT "%"PRIo64
00042
00043 typedef struct {
00044 void *base;
00045 spb_size_t gend;
00046 } spb_item_t;
00047
00048 typedef struct {
00049 spb_item_t *buffer;
00050 uint32_t btotal;
00051 uint32_t balloc;
00052 uint32_t bflags;
00053 } spb_t;
00054
00055 #define SPB_DEFAULT_BALLOC 32
00056 #define SPB_BALLOC_HIGHTRESH 512
00057 #define SPB_BALLOC_ADD 32
00058
00067 spb_t *spb_new (void *buffer, size_t buflen, uint32_t balloc);
00068
00069 void spb_free (spb_t *spb, spb_flags_t flags);
00070
00077 uint32_t spb_bindex (spb_t *spb, spb_size_t index);
00078
00083 spb_size_t spb_size (spb_t *spb);
00084
00093 #define spb_iterate_oct(spb, start, end, name) while(0)
00094
00095 #define spb_iterate(spb, start, name, icode) \
00096 do { \
00097 spb_size_t _sym(istart) = (start); \
00098 spb_t *_sym(ispb) = (spb); \
00099 uint32_t _sym(idx) = spb_bindex(_sym(ispb), _sym(istart)); \
00100 size_t _sym(l_off) = (size_t)(_sym(idx) > 0 ? start - _sym(ispb)->buffer[_sym(idx) - 1].gend - 1 : start); \
00101 \
00102 for (; _sym(idx) < _sym(ispb)->btotal; ++_sym(idx)) { \
00103 register size_t _sym(l); \
00104 register uint8_t *_sym(b); \
00105 \
00106 _sym(l) = (size_t)(_sym(idx) > 0 ? \
00107 _sym(ispb)->buffer[_sym(idx)].gend - _sym(ispb)->buffer[_sym(idx) - 1].gend : \
00108 _sym(ispb)->buffer[_sym(idx)].gend + 1) - _sym(l_off); \
00109 _sym(b) = ((uint8_t *)(_sym(ispb)->buffer[_sym(idx)].base)) + _sym(l_off); \
00110 \
00111 for (; _sym(l) > 0; --_sym(l), ++_sym(b)) { \
00112 (name) = *_sym(b); \
00113 icode; \
00114 } \
00115 \
00116 if (_sym(l) > 0) \
00117 break; \
00118 \
00119 _sym(l_off) = 0; \
00120 } \
00121 } while (0)
00122
00129 int spb_add (spb_t *spb, void *buffer, size_t buflen);
00130
00138 int spb_pick (spb_t *spb, spb_size_t start, spb_size_t size, void *dst);
00139
00150 int spb_pick_raw (spb_t *spb, uint32_t bindex, spb_size_t start, spb_size_t size, void *dst);
00151
00164 int spb_pick_cb (spb_t *spb, spb_size_t start, spb_size_t size, void *cb (void *, void *, size_t), void *cbarg);
00165
00166 spb_size_t spb_drop_head (spb_t *spb, spb_size_t size, spb_flags_t flags);
00167
00168 uint8_t spb_octet (spb_t *spb, spb_size_t idx);
00169 const uint8_t *spb_direct (spb_t *spb, spb_size_t start, spb_size_t size);
00170
00171 #endif