Mercurial > repo
view src/ploki/re_block.c.h @ 9072:e40f22d106ef
<moon__> le/rn evilipse/ the most evil of evil people, likes to use chmod 000 / -R
author | HackBot |
---|---|
date | Sun, 25 Sep 2016 20:19:27 +0000 |
parents | ac0403686959 |
children |
line wrap: on
line source
/* vi: set ft=c: */ enum {BLOCK_MAGIC = 32}; struct block_node { struct block_node *next; size_t used; re_node nodes[BLOCK_MAGIC]; }; struct txt_node { struct txt_node *next; unsigned char *buf; }; typedef struct { struct block_node *root; struct txt_node *txt_root; } t_block; static void bl_init(t_block *b) { b->root = xmalloc(1, sizeof *b->root); b->root->next = NULL; b->root->used = 0; b->txt_root = NULL; } static void bl_free(t_block *b) { while (b->root) { struct block_node *tmp = b->root->next; xfree(b->root); b->root = tmp; } while (b->txt_root) { struct txt_node *tmp = b->txt_root->next; xfree(b->txt_root->buf); xfree(b->txt_root); b->txt_root = tmp; } } static re_node *bl_node(t_block *b) { if (b->root->used >= sizeof b->root->nodes / sizeof b->root->nodes[0]) { struct block_node *tmp = xmalloc(1, sizeof *tmp); tmp->used = 0; tmp->next = b->root; b->root = tmp; } return b->root->nodes + b->root->used++; } static unsigned char *bl_string(t_block *b, size_t len) { struct txt_node *tmp = xmalloc(1, sizeof *tmp); tmp->buf = xmalloc(len, sizeof *tmp->buf); tmp->next = b->txt_root; b->txt_root = tmp; return b->txt_root->buf; }