X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Fir.c;h=63fe72bbdfa353ceea2324c3da81779f8d880ef5;hp=76c221d2d376d164489635b47fec0920c976cd8c;hb=1f5e543b9088b021c859a2995a273dfa3397d381;hpb=9aae885b30d1325721b77ad072007af7089d7b69 diff --git a/src/ir.c b/src/ir.c index 76c221d..63fe72b 100644 --- a/src/ir.c +++ b/src/ir.c @@ -23,17 +23,28 @@ void ir_quit(void); int ir_linker(void); int ir_condenser(void); /* Private */ +struct pagenode_t; extern //apc.c long sys_pagesize; -static - static inline struct ir_framebox_t* ir_set_add_framebox(struct ir_set_t*, uint8_t*); -static inline -void ir_quit_r(struct pagenode_t*); +static +void ir_free_pages(struct pagenode_t*); static inline int bytes_identical(uint8_t*,uint8_t*); - +static +void* stack_alloc(size_t); +/* Memory allocator */ +struct pagenode_t { + struct pagenode_t* next; + char* head; + char root[]; +}* pagenode_root, * pagenode_head; +#define PN_ALLOCSIZE (sys_pagesize) +#define PN_HEADERSIZE() (sizeof(struct pagenode_t*) + sizeof(char*)) +#define PN_MEMSIZE() (PN_ALLOCSIZE - PN_HEADERSIZE()) +#define PN_HEADSIZE() (pagenode_head->head - pagenode_head->root) +#define PN_HEADSPACE() (PN_MEMSIZE() - PN_HEADSIZE()) /* Enumerated types */ enum dtype { FSDAT, MSDAT, ADAT, LDAT, FBDAT }; enum ltype { OLINK, MLINK, VLINK, ALINK }; @@ -47,21 +58,20 @@ struct ir_frameinfo_t { int facing, w, h; }; struct ir_framedata_t { struct ir_setdata_header_t header; - struct ir_frameinfo_t frameinfo; -}** framedatas; + struct ir_frameinfo_t frameinfo; +}; struct ir_framebox_t { struct ir_setdata_header_t header; struct ir_framedata_t framesheets[FACING_MAX]; struct ir_framedata_t mapsheets[FACING_MAX]; -}** frameboxes; +}; struct ir_simplex_t -{ struct ir_setdat_header_t header; -}** simplexes; +{ struct ir_setdata_header_t header; }; struct ir_link_t -{ struct ir_setdat_header_t header; - struct ir_set_t* src, * trg; - enum ltype type; -}** links; +{ struct ir_setdata_header_t header; + struct ir_set_t* src, * trg; + enum ltype type; +}; union ir_setdata_t { struct ir_setdata_header_t header; struct ir_framebox_t framebox; @@ -74,16 +84,16 @@ struct ir_class_t { struct ir_class_t* nextchild, * nextsib; struct ir_set_t* root_set; uint8_t* name; -}** classes; +}; struct ir_set_t -{ struct ir_set_t* nextchild, * nextsib; - struct ir_class_t* class; - long long ref; - uint8_t* name; - struct framebox_t* frameboxes; - struct simplex_t* audio; - struct link_t* links; -}** sets; +{ struct ir_set_t* nextchild, * nextsib; + struct ir_class_t* class; + long long ref; + uint8_t* name; + struct ir_framebox_t* frameboxes; + struct ir_simplex_t* audio; + struct ir_link_t* links; +}; /* Function-Like Macros */ #define do_warn() do { \ } while (0) @@ -108,14 +118,13 @@ struct ir_set_t } while (0) #define struct_alloc(_T) ((struct _T*) stack_alloc(sizeof(struct _T))) - static -struct ir_class_t root_class = { .name = "." }; +struct ir_class_t root_class = { .name = (uint8_t*)"." }; /* Init */ int ir_init ( void ) -{ pagenode_root = calloc(struct pagenode_t*) calloc(PN_ALLOCSIZE); +{ pagenode_root = (struct pagenode_t*) calloc((size_t)PN_ALLOCSIZE,1); if (pagenode_root == NULL) return -1; pagenode_root->head = pagenode_root->root; @@ -128,13 +137,13 @@ int ir_init */ void ir_quit ( void ) -{ ir_quit_r(pagenode_root); } +{ ir_free_pages(pagenode_root); } -static inline -void ir_quit_r +static +void ir_free_pages ( struct pagenode_t* pagenode ) { if (pagenode->next != NULL) - ir_quit_r(pagenode->next); + ir_free_pages(pagenode->next); free(pagenode); } @@ -235,13 +244,14 @@ struct ir_framebox_t* ir_set_add_framebox return set->frameboxes = struct_alloc(ir_framebox_t); iter = set->frameboxes; check: - if (bytes_identical(iter->header.name, name)) + if (bytes_identical(iter->header.data_name, name)) return iter; if (iter->header.nextsib != NULL) - { iter = iter->header.nextsib; + { iter = (struct ir_framebox_t*) iter->header.nextsib; goto check; } - return iter->header.nextsib = struct_alloc(ir_framebox_t); + iter->header.nextsib = (union ir_setdata_t*) struct_alloc(ir_framebox_t); + return (struct ir_framebox_t*) iter->header.nextsib; } /* Match two null-terminated bytestrings @@ -270,44 +280,45 @@ void ir_set_assign_data struct ir_link_t* link; switch (setdata->header.type) { case FSDAT: - framebox = ir_set_add_framebox(set, setdata->header.name); - if (framebox->framesheets[setdata->framesheet.frameinfo.facing] != NULL) + framebox = ir_set_add_framebox(set, setdata->header.data_name); + if (framebox->framesheets[setdata->framesheet.frameinfo.facing].header.data_name != NULL) wprintf("Duplicate framesheet [%i] %s\n", setdata->framesheet.frameinfo.facing, setdata->header.data_name); framebox->framesheets[setdata->framesheet.frameinfo.facing] = setdata->framesheet; break; case MSDAT: - framebox = ir_set_add_framebox(set, setdata->header.name); - if (framebox->mapsheets[setdata->mapsheet.frameinfo.facing] != NULL) + framebox = ir_set_add_framebox(set, setdata->header.data_name); + if (framebox->mapsheets[setdata->mapsheet.frameinfo.facing].header.data_name != NULL) wprintf("Duplicate mapsheet [%i] %s\n", setdata->mapsheet.frameinfo.facing, setdata->header.data_name); framebox->mapsheets[setdata->mapsheet.frameinfo.facing] = setdata->mapsheet; break; case ADAT: if (set->audio == NULL) - { set->audio = &setdata->audio; + { set->audio = (struct ir_simplex_t*) setdata; return; } simplex = set->audio; - while (simplex->header.nextsib != NULL;) + while (simplex->header.nextsib != NULL) if (bytes_identical(simplex->header.data_name, setdata->header.data_name)) { wprintf("Duplicate audio %s\n", setdata->header.data_name); *simplex = setdata->audio; + //setdata->audio is now a pointer to redundant, unused memory. return; } else - simplex = simplex->header.nextsib; - simplex->header.nextsib = &setdata->audio; + simplex = (struct ir_simplex_t*) simplex->header.nextsib; + simplex->header.nextsib = setdata; break; case LDAT: if (set->links == NULL) - { set->links = &setdata->link; + { set->links = (struct ir_link_t*) setdata; return; } link = set->links; while (link->header.nextsib != NULL) - link = link->header.nextsib; - link->header.nextsib = &setdata->link; + link = (struct ir_link_t*) link->header.nextsib; + link->header.nextsib = setdata; break; default: fprintf(stderr, "Unknown setdata type %x\n", setdata->header.type); @@ -316,12 +327,12 @@ void ir_set_assign_data } void ir_set_assign_ref -( ir_set_t* set, - long long ref +( struct ir_set_t* set, + long long ref ) { if (set->ref != 0) - wprintf("Ref override: 0x%x -> 0x%x for set %s\n", - set->ref, ref, set->name); + wprintf("Ref override: 0x%lx -> 0x%lx for set %s\n", + (long unsigned) set->ref, (long unsigned) ref, set->name); set->ref = ref; //TODO: reflist_add(set); } @@ -330,10 +341,7 @@ void ir_data_assign_path ( union ir_setdata_t* setdata, uint8_t* path ) -{ if (set->header.src_filename) - wprintf("Path override: %s -> %s for set %s\n", - set->header.src_filename, path, set->name); - set->header.src_filename = path; +{ setdata->header.src_filename = path; //TODO: internal strdup, not assign (= path;) } @@ -346,7 +354,7 @@ union ir_setdata_t* ir_framesheet int height ) { struct ir_framedata_t* framesheet = struct_alloc(ir_framedata_t); - framesheet->header->type = FSDAT; + framesheet->header.type = FSDAT; framesheet->header.data_name = name; framesheet->frameinfo.facing = d; framesheet->frameinfo.w = width; @@ -358,7 +366,7 @@ union ir_setdata_t* ir_mapsheet ( uint8_t* name, apc_facing d, int width, - int height, + int height ) { struct ir_framedata_t* mapsheet = struct_alloc(ir_framedata_t); mapsheet->header.type = MSDAT; @@ -377,19 +385,6 @@ union ir_setdata_t* ir_audio return (union ir_setdata_t*) audio; } - -#define PN_ALLOCSIZE (sys_pagesize) -#define PN_HEADERSIZE() (sizeof(struct pagenode_t*) + sizeof(void*)) -#define PN_MEMSIZE() (PN_ALLOCSIZE - PN_HEADERSIZE()) -#define PN_HEADSIZE() (pagenode_head->head - pagenode_head->root) -#define PN_HEADSPACE() (PN_MEMSIZE() - PN_HEADSIZE()) -struct pagenode_t { - struct pagenode_t* next; - char* head; - char root[]; -}* pagenode_root, * pagenode_head; - - static void* stack_alloc(size_t bytes) { if (!bytes) @@ -397,7 +392,7 @@ void* stack_alloc(size_t bytes) return pagenode_head->head; } if (PN_HEADSPACE() < bytes) - { pagenode_head->next = (struct pagenode_t*) calloc(PN_ALLOCSIZE); + { pagenode_head->next = (struct pagenode_t*) calloc(PN_ALLOCSIZE,1); pagenode_head = pagenode_head->next; pagenode_head->head = pagenode_head->root; }