#include <stdint.h> //uint64_t
#include <string.h> //memmove
#include <stdlib.h> //malloc
-#include "ir.h"
+#include <apc/ir.h>
#define CURR_CDAT (*cdat_stackp)
#define CURR_SET set_list[CURR_CDAT->num_sets]
#define PREV_VDAT (vdat_buf[num_vdats-1])
#define CURR_MODEL model_list[CURR_VDAT->num_models]
#define CURR_LINK (link_buf[num_links])
+#define CURR_POST (post_buf[num_posts])
+int num_cdats = 0;
+int curr_max_cdats = PTRS_IN_PAGE;
+
+int num_odats = 0;
+int curr_max_odats = PTRS_IN_PAGE;
+
+
+int num_vdats = 0;
+int curr_max_vdats = PTRS_IN_PAGE;
+
+int num_refs = 0;
+int curr_max_refs = PTRS_IN_PAGE;
+uint64_t ss_ref_id = 0x00FFFFFF; /* system space for ref_ids */
+
+int num_links = 0;
+int curr_max_links = PTRS_IN_PAGE;
+
+int num_posts = 0;
+int curr_max_posts = PTRS_IN_PAGE;
void
ir_init()
/* Init first link */
if( (CURR_LINK = (struct link*) malloc(sizeof(struct link))) == NULL)
perror("malloc first link failed");
+
+ /* Init first post */
+ if( (CURR_POST = (struct ref*) malloc(sizeof(struct ref))) == NULL)
+ perror("malloc first post failed");
}
//TODO: FREE MEMORY!
cdat_stackp--;
}
+void
+inc_posts()
+{
+ num_posts++;
+ if(num_posts >= curr_max_posts)
+ {
+ if( (realloc((void*) post_buf, PTRS_IN_PAGE * 4)) == NULL)
+ perror("realloc post_buf failed");
+ curr_max_posts += PTRS_IN_PAGE;
+ }
+ if( (CURR_POST = (struct ref*) malloc(sizeof (struct ref))) == NULL)
+ {
+ perror("malloc post failed");
+ }
+
+}
void
inc_odat()
{
if(num_refs % 16 == 0)
{
- posts[num_posts++] = *CURR_REF;
+ CURR_POST = CURR_REF;
+ inc_posts();
}
num_refs++;
}
void
-insert_framesheets(char direction, char* name, uint64_t ref_id, int height , int width, int num_frames)
+insert_framesheet(char direction, char* name, uint64_t ref_id, int height , int width, int num_frames)
{
CURR_VDAT->CURR_MODEL.spritesheet[(int)direction].height = height;
CURR_VDAT->CURR_MODEL.spritesheet[(int)direction].width = width;
/* There are an unknown amount of cdats at compile time, so we maintain */
/* a cdat_buf of cdat pointers that can be expanded as needed. */
struct cdat* cdat_buf[PTRS_IN_PAGE];
-int num_cdats = 0;
-int curr_max_cdats = PTRS_IN_PAGE;
/* The cdat_stack is a stack pointers to cdat pointers, the top of which is
the cdat that is currently being parsed. Whenever a new cdat is recognized
/* Like the cdat_buf, ref_buf stores pointers to refs and can
increase in size */
struct ref* ref_buf[PTRS_IN_PAGE];
-int num_refs = 0;
-int curr_max_refs = PTRS_IN_PAGE;
-uint64_t ss_ref_id = 0x00FFFFFF; /* system space for ref_ids */
-
/* posts for ref_buf */
-struct ref posts[MAX_POSTS];
-int num_posts;
+struct ref* post_buf[PTRS_IN_PAGE];
/* Links: At parse time, a set/ele can include a link in their
grammar representation instead of the actual data and this signifies
This does not include quad refs, because
those are already known to need to be resolved */
struct link* link_buf[PTRS_IN_PAGE];
-int num_links = 0;
-int curr_max_links = PTRS_IN_PAGE;
/* Odats: Odats consist of the object data necessary for
/* Populated and allocated same way as other bufs */
struct odat* odat_buf[PTRS_IN_PAGE];
-int curr_max_odats = PTRS_IN_PAGE;
-int num_odats = 0;
/* A framesheet is a grouping of animation frames in
a single direction (N,W,S,E) */
struct vdat* vdat_buf[PTRS_IN_PAGE];
-int curr_max_vdats = PTRS_IN_PAGE;
-int num_vdats = 0;
/* The initalization function of the IR. Mallocs the
first c/v/odat and the first links and refs and