aboutsummaryrefslogtreecommitdiffstats
path: root/src/zfree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zfree.c')
-rw-r--r--src/zfree.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/zfree.c b/src/zfree.c
index 95eb084..2a1680a 100644
--- a/src/zfree.c
+++ b/src/zfree.c
@@ -5,5 +5,31 @@
void
zfree(z_t a)
{
- free(a->chars);
+ size_t i = 0, x, j;
+ zahl_char_t **new;
+
+ if (!a->chars)
+ return;
+
+ for (x = a->alloced; x; x >>= 1)
+ i += 1;
+
+ j = libzahl_pool_n[i]++;
+
+ if (j == libzahl_pool_alloc[i]) {
+ x = j ? ((j * 3) >> 1) : 128;
+ new = realloc(libzahl_pool[i], x * sizeof(zahl_char_t *));
+ if (!new) {
+ free(a->chars);
+ free(libzahl_pool[i]);
+ libzahl_pool_n[i] = 0;
+ libzahl_pool[i] = 0;
+ libzahl_pool_alloc[i] = 0;
+ return;
+ }
+ libzahl_pool[i] = new;
+ libzahl_pool_alloc[i] = x;
+ }
+
+ libzahl_pool[i][j] = a->chars;
}