diff --git a/src/block_alloc.h b/src/block_alloc.h
new file mode 100644
index 0000000000000000000000000000000000000000..f2b41ead34b6602f7e48e6c9a0412e825111e04d
--- /dev/null
+++ b/src/block_alloc.h
@@ -0,0 +1,60 @@
+#define INIT_BLOCK(X)
+#define EXIT_BLOCK(X)
+#define BLOCK_ALLOC(DATA,BSIZE)									\
+												\
+struct PIKE_CONCAT(DATA,_block)									\
+{												\
+  struct PIKE_CONCAT(DATA,_block) *next;							\
+  struct DATA x[BSIZE];										\
+};												\
+												\
+static struct PIKE_CONCAT(DATA,_block) *PIKE_CONCAT(DATA,_blocks)=0;				\
+static struct DATA *PIKE_CONCAT3(free_,DATA,s)=0;						\
+												\
+struct DATA *PIKE_CONCAT(alloc_,DATA)(void)							\
+{												\
+  struct DATA *tmp;										\
+  if(!PIKE_CONCAT3(free_,DATA,s))								\
+  {												\
+    struct PIKE_CONCAT(DATA,_block) *n;								\
+    int e;											\
+    n=(struct PIKE_CONCAT(DATA,_block) *)malloc(sizeof(struct PIKE_CONCAT(DATA,_block)));	\
+    if(!n)											\
+    {												\
+      fprintf(stderr,"Fatal: out of memory.\n");						\
+      exit(17);											\
+    }												\
+    n->next=PIKE_CONCAT(DATA,_blocks);								\
+    PIKE_CONCAT(DATA,_blocks)=n;								\
+												\
+    for(e=0;e<BSIZE;e++)									\
+    {												\
+      n->x[e].next=PIKE_CONCAT3(free_,DATA,s);							\
+      PIKE_CONCAT3(free_,DATA,s)=n->x+e;							\
+    }												\
+  }												\
+												\
+  tmp=PIKE_CONCAT3(free_,DATA,s);								\
+  PIKE_CONCAT3(free_,DATA,s)=tmp->next;								\
+  INIT_BLOCK(tmp);										\
+  return tmp;											\
+}												\
+												\
+inline void PIKE_CONCAT(free_,DATA)(struct DATA *d)						\
+{												\
+  EXIT_BLOCK(d);										\
+  d->next=PIKE_CONCAT3(free_,DATA,s);								\
+  PIKE_CONCAT3(free_,DATA,s)=d;									\
+}												\
+												\
+void PIKE_CONCAT3(free_all_,DATA,_blocks)(void)							\
+{												\
+  struct PIKE_CONCAT(DATA,_block) *tmp;								\
+  while((tmp=PIKE_CONCAT(DATA,_blocks)))							\
+  {												\
+    PIKE_CONCAT(DATA,_blocks)=tmp->next;							\
+    free((char *)tmp);										\
+  }												\
+  PIKE_CONCAT(DATA,_blocks)=0;									\
+}												\
+