+\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.data_name);\r
+ if (framebox->framesheets[setdata->framesheet.frameinfo.facing].header.data_name != 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.data_name);\r
+ if (framebox->mapsheets[setdata->mapsheet.frameinfo.facing].header.data_name != 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 = (struct ir_simplex_t*) setdata;\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
+ //setdata->audio is now a pointer to redundant, unused memory.\r
+ return;\r
+ }\r
+ else\r
+ simplex = (struct ir_simplex_t*) simplex->header.nextsib;\r
+ simplex->header.nextsib = setdata;\r
+ break;\r
+ case LDAT:\r
+ if (set->links == NULL)\r
+ { set->links = (struct ir_link_t*) setdata;\r
+ return;\r
+ }\r
+ link = set->links;\r
+ while (link->header.nextsib != NULL)\r
+ link = (struct ir_link_t*) link->header.nextsib;\r
+ link->header.nextsib = setdata;\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
+( struct ir_set_t* set,\r
+ long long ref\r
+)\r
+{ if (set->ref != 0)\r
+ wprintf("Ref override: 0x%lx -> 0x%lx for set %s\n",\r
+ (long unsigned) set->ref, (long unsigned) 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
+{ setdata->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
+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,1);\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