From: ken Date: Mon, 3 Oct 2016 20:55:50 +0000 (-0700) Subject: example stack implementation X-Git-Url: https://git.kengrimes.com/?p=henge%2Fwebcc.git;a=commitdiff_plain;h=929e4cfe463bb5e41583d915b8609fcf99c86ca1 example stack implementation --- diff --git a/src/apc/irmem.c b/src/apc/irmem.c index 140a16a..5b4fb57 100644 --- a/src/apc/irmem.c +++ b/src/apc/irmem.c @@ -63,10 +63,30 @@ int num_odats = 0; 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;