Mercurial > repo
diff src/ploki/re_block.c.h @ 4223:ac0403686959
<oerjan> rm -rf src/ploki; mv ploki src
author | HackBot |
---|---|
date | Fri, 20 Dec 2013 22:18:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ploki/re_block.c.h Fri Dec 20 22:18:50 2013 +0000 @@ -0,0 +1,60 @@ +/* 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; +}