void* odat_buf[MAX_CHUNKS];
long odats_per_page;
-int num_vdat_chunks = 0;
-int num_vdats = 0;
-void* vdat_buf[MAX_CHUNKS];
-long vdats_per_page;
+
+//"type free" chunk stacking
+struct chunk_stack
+{ void* chunks[MAX_CHUNKS];
+ void* csp; //chunk stack pointer
+ void* dsp[MAX_CHUNKS]; //dat stack pointer (per chunk)
+} ocs, vcs, ccs; //odat, vdat, and cdat chunk stacks
+
+//type safety handled by macro expansion
+#define CHUNK_LEN(STACK) ((STACK).csp - (STACK).chunks)
+#define CURRENT_DAT(STACK,TYPE) ((TYPE)(STACK.dsp[CHUNK_LEN(STACK)])
+#define INCREMENT_DAT(STACK,TYPE) (++CURRENT_DAT(STACK,TYPE))
+//Stack-specific macros
+#define CURRENT_ODAT() (CURRENT_DAT(ocs,struct odat*))
+#define CURRENT_VDAT() (CURRENT_DAT(vcs,struct vdat*))
+#define CURRENT_CDAT() (CURRENT_DAT(ccs,struct cdat*))
+//Metadata
+#define CURRENT_MODEL() (CURRENT_VDAT()->model_list[CURRENT_VDAT()->num_models])
+
+
+int num_vdat_chunks = 0;
+int num_vdats = 0;
+struct vdat* vdat_buf[MAX_CHUNKS];
+long vdats_per_page;
int num_ref_chunks = 0;
int num_refs = 0;