uint8_t for chars, lexfilename needs work
[henge/webcc.git] / src / apc / irmem.c
index 3716d59..c241a29 100644 (file)
@@ -11,7 +11,7 @@ struct cdat*
 alloc_cdat(void);
 struct odat*
 alloc_odat(void);
-void
+struct vdat*
 alloc_vdat(void);
 struct link*
 alloc_link(void);
@@ -23,6 +23,8 @@ struct odat*
 curr_odat(void);
 struct vdat*
 curr_vdat(void);
+struct variant*
+curr_variant(void);
 struct set*
 curr_set(void);
 struct ref*
@@ -41,7 +43,7 @@ struct chunk_stack
   void* dsp[MAX_CHUNKS]; //dat stack pointer (per chunk)
   int   chunk_size;      //size of a chunk (including its forfeited page)
   int   max_dats;        //number of dats per chunk for this stack
-} ocs, vcs, ccs, rcs, lcs, pcs; //odat, vdat, and cdat, ref, link, post stacks
+} ocs, vcs, ccs, rcs, lcs, pcs, varcs; //odat, vdat, cdat,variant, ref, link, post stacks
 
 //type safety handled by macro expansion (do not call these directly from code, make dependent macros for access to these)
 #define CHUNKS_LEN(STACK)         ((STACK).csp - (STACK).chunks)
@@ -80,6 +82,11 @@ struct chunk_stack
 #define CDAT_FULL()     (DATA_FULL(ccs, struct cdat))
 #define CDAT_ALLOC()    (ALLOC_DAT(ccs, struct cdat))
 #define CCS_FULL()      (CHUNKS_FULL(ccs))
+#define INIT_VARIANT()     (INIT_STACK(varcs, struct variant))
+#define CURRENT_VARIANT()  (CURRENT_DATP(varcs, struct variant))
+#define VARIANT_FULL()     (DATA_FULL(varcs, struct variant))
+#define VARIANT_ALLOC()     (ALLOC_DAT(varcs, struct variant))
+#define VARCS_FULL()      (CHUNKS_FULL(varcs))
 #define INIT_LINK()     (INIT_STACK(lcs, struct link))
 #define CURRENT_LINK()  (CURRENT_DATP(lcs,struct link))
 #define LDAT_FULL()     (DATA_FULL(lcs, struct link))
@@ -98,10 +105,10 @@ struct chunk_stack
 #define RCS_FULL()      (CHUNKS_FULL(rcs))
 //Metadata
 #define CURRENT_SET()   (CURRENT_CDAT()->set_list[CURRENT_CDAT()->num_sets])
-#define CURRENT_MODEL() (CURRENT_VDAT()->model_list[CURRENT_VDAT()->num_models])
+//#define CURRENT_QUAD()  (CURRENT_VARIANT()->quad_list[CURRENT_VARIANT()->num_quads])
+//#define CURRENT_MODEL() (CURRENT_VDAT()->model_list[CURRENT_VDAT()->num_models])
 
 
-#define CURR_QUAD  (CURR_ODAT->quad_file)
 
 long pagesize;
 
@@ -114,8 +121,10 @@ int num_odats = 0;
 
 int num_vdats = 0;
 
+int num_variants = 0;
+
 int num_refs = 0;
-uint64_t ss_ref_id = 0x00FFFFFF; /* system space for ref_ids */
+int ss_ref_id = 0x0FFFFFFF; /* system space for ref_ids */
 
 int num_posts = 0;
 
@@ -133,10 +142,12 @@ ir_init()
 
   INIT_CDAT();
   *cdat_stackp = CURRENT_CDAT();
+  
   memmove((*cdat_stackp)->name, root, 32);
 
   INIT_ODAT();
   INIT_VDAT();
+  INIT_VARIANT();
   INIT_LINK();
   INIT_REF();
   INIT_POST();
@@ -216,7 +227,7 @@ alloc_odat
   return CURRENT_ODAT();
 }
 
-void
+struct vdat*
 alloc_vdat
 ()
 { num_vdats++;
@@ -230,8 +241,29 @@ alloc_vdat
     }
   else
     VDAT_ALLOC();
+
+  return CURRENT_VDAT();
+}
+
+struct variant* 
+alloc_variant
+()
+{ num_variants++;
+  if(VARIANT_FULL())
+    { if(!VARCS_FULL())
+        { fprintf(stderr, "You have allocated to many (%d) variants ", num_variants);
+          exit(EXIT_FAILURE);
+        }
+      else
+        CSP_PUSH(varcs);
+    }
+  else
+    VARIANT_ALLOC();
+
+  return CURRENT_VARIANT();
 }
 
+
 struct link*
 alloc_link
 ()
@@ -322,9 +354,21 @@ curr_ref
 {
   return CURRENT_REF();
 }
-struct model*
-curr_model
+struct variant*
+curr_variant
 ()
 {
-  return &CURRENT_MODEL();
+  return CURRENT_VARIANT();
 }
+/* struct quad* */
+/* curr_quad */
+/* () */
+/* { */
+/*   return &CURRENT_QUAD(); */
+/* } */
+/* struct model* */
+/* curr_model */
+/* () */
+/* { */
+/*   return &CURRENT_MODEL(); */
+/* } */