diff options
Diffstat (limited to 'examples/dte/block.h')
| -rw-r--r-- | examples/dte/block.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/examples/dte/block.h b/examples/dte/block.h new file mode 100644 index 0000000..6fbf361 --- /dev/null +++ b/examples/dte/block.h @@ -0,0 +1,39 @@ +#ifndef BLOCK_H +#define BLOCK_H + +#include <stddef.h> +#include "util/list.h" +#include "util/macros.h" + +enum { + BLOCK_ALLOC_MULTIPLE = 64 +}; + +// Blocks always contain whole lines. +// There's one zero-sized block for an empty file. +// Otherwise zero-sized blocks are forbidden. +typedef struct { + ListHead node; + unsigned char NONSTRING *data; + size_t size; + size_t alloc; + size_t nl; +} Block; + +#define block_for_each(block_, list_head_) \ + for ( \ + block_ = BLOCK((list_head_)->next); \ + &block_->node != (list_head_); \ + block_ = BLOCK(block_->node.next) \ + ) + +static inline Block *BLOCK(ListHead *item) +{ + static_assert(offsetof(Block, node) == 0); + return (Block*)item; +} + +Block *block_new(size_t alloc) RETURNS_NONNULL; +void block_free(Block *blk) NONNULL_ARGS; + +#endif |
