+\r
+/* Assign Setdata to Set\r
+\r
+ */\r
+void ir_set_assign_data\r
+( struct ir_set_t* set,\r
+ union ir_setdata_t* setdata\r
+)\r
+{ struct ir_framebox_t* framebox;\r
+ struct ir_simplex_t* simplex;\r
+ struct ir_link_t* link;\r
+ switch (setdata->header.type)\r
+ { case FSDAT:\r
+ framebox = ir_set_add_framebox(set, setdata->header.name);\r
+ if (framebox->framesheets[setdata->framesheet.frameinfo.facing] != NULL)\r
+ wprintf("Duplicate framesheet [%i] %s\n",\r
+ setdata->framesheet.frameinfo.facing, setdata->header.data_name);\r
+ framebox->framesheets[setdata->framesheet.frameinfo.facing] = setdata->framesheet;\r
+ break;\r
+ case MSDAT:\r
+ framebox = ir_set_add_framebox(set, setdata->header.name);\r
+ if (framebox->mapsheets[setdata->mapsheet.frameinfo.facing] != NULL)\r
+ wprintf("Duplicate mapsheet [%i] %s\n",\r
+ setdata->mapsheet.frameinfo.facing, setdata->header.data_name);\r
+ framebox->mapsheets[setdata->mapsheet.frameinfo.facing] = setdata->mapsheet;\r
+ break;\r
+ case ADAT:\r
+ if (set->audio == NULL)\r
+ { set->audio = &setdata->audio;\r
+ return;\r
+ }\r
+ simplex = set->audio;\r
+ while (simplex->header.nextsib != NULL;)\r
+ if (bytes_identical(simplex->header.data_name, setdata->header.data_name))\r
+ { wprintf("Duplicate audio %s\n", setdata->header.data_name);\r
+ *simplex = setdata->audio;\r
+ return;\r
+ }\r
+ else\r
+ simplex = simplex->header.nextsib;\r
+ simplex->header.nextsib = &setdata->audio;\r
+ break;\r
+ case LDAT:\r
+ if (set->links == NULL)\r
+ { set->links = &setdata->link;\r
+ return;\r
+ }\r
+ link = set->links;\r
+ while (link->header.nextsib != NULL)\r
+ link = link->header.nextsib;\r
+ link->header.nextsib = &setdata->link;\r
+ break;\r
+ default:\r
+ fprintf(stderr, "Unknown setdata type %x\n", setdata->header.type);\r
+ exit(-1);\r
+ }\r
+}\r
+\r
+void ir_set_assign_ref\r
+( ir_set_t* set,\r
+ long long ref\r
+)\r
+{ if (set->ref != 0)\r
+ wprintf("Ref override: 0x%x -> 0x%x for set %s\n",\r
+ set->ref, ref, set->name);\r
+ set->ref = ref;\r
+ //TODO: reflist_add(set);\r
+}\r
+\r
+void ir_data_assign_path\r
+( union ir_setdata_t* setdata,\r
+ uint8_t* path\r
+)\r
+{ if (set->header.src_filename)\r
+ wprintf("Path override: %s -> %s for set %s\n",\r
+ set->header.src_filename, path, set->name);\r
+ set->header.src_filename = path;\r
+ //TODO: internal strdup, not assign (= path;)\r
+}\r
+\r
+\r
+//TODO: Macro ir_framsheet and mapsheet?\r
+union ir_setdata_t* ir_framesheet\r
+( uint8_t* name,\r
+ apc_facing d,\r
+ int width,\r
+ int height\r
+)\r
+{ struct ir_framedata_t* framesheet = struct_alloc(ir_framedata_t);\r
+ framesheet->header->type = FSDAT;\r
+ framesheet->header.data_name = name;\r
+ framesheet->frameinfo.facing = d;\r
+ framesheet->frameinfo.w = width;\r
+ framesheet->frameinfo.h = height;\r
+ return (union ir_setdata_t*) framesheet; \r
+}\r
+\r
+union ir_setdata_t* ir_mapsheet\r
+( uint8_t* name,\r
+ apc_facing d,\r
+ int width,\r
+ int height,\r
+)\r
+{ struct ir_framedata_t* mapsheet = struct_alloc(ir_framedata_t);\r
+ mapsheet->header.type = MSDAT;\r
+ mapsheet->header.data_name = name;\r
+ mapsheet->frameinfo.facing = d;\r
+ mapsheet->frameinfo.w = width;\r
+ mapsheet->frameinfo.h = height;\r
+ return (union ir_setdata_t*) mapsheet;\r
+}\r
+\r
+union ir_setdata_t* ir_audio\r
+( uint8_t* name )\r
+{ struct ir_simplex_t* audio = struct_alloc(ir_simplex_t);\r
+ audio->header.type = ADAT;\r
+ audio->header.data_name = name;\r
+ return (union ir_setdata_t*) audio;\r
+}\r
+\r
+\r
+#define PN_ALLOCSIZE (sys_pagesize)\r
+#define PN_HEADERSIZE() (sizeof(struct pagenode_t*) + sizeof(void*))\r
+#define PN_MEMSIZE() (PN_ALLOCSIZE - PN_HEADERSIZE())\r
+#define PN_HEADSIZE() (pagenode_head->head - pagenode_head->root)\r
+#define PN_HEADSPACE() (PN_MEMSIZE() - PN_HEADSIZE())\r
+struct pagenode_t {\r
+ struct pagenode_t* next;\r
+ char* head;\r
+ char root[];\r
+}* pagenode_root, * pagenode_head;\r
+\r
+\r
+static\r
+void* stack_alloc(size_t bytes)\r
+{ if (!bytes)\r
+ { wprint("Attempting to allocate 0 bytes in stack_alloc");\r
+ return pagenode_head->head;\r
+ }\r
+ if (PN_HEADSPACE() < bytes) \r
+ { pagenode_head->next = (struct pagenode_t*) calloc(PN_ALLOCSIZE);\r
+ pagenode_head = pagenode_head->next;\r
+ pagenode_head->head = pagenode_head->root;\r
+ }\r
+ pagenode_head->head += bytes;\r
+ return (void*) pagenode_head->head - bytes;\r
+}\r
+\r