/* Enumerated types */\r
enum dtype { FSDAT, MSDAT, ADAT, LDAT, FBDAT };\r
enum ltype { OLINK, MLINK, VLINK, ALINK };\r
+/* Set link data */\r
+struct ir_namelist_t;\r
+struct ir_namelist_t\r
+{ struct ir_namelist_t* nextsib;\r
+ uint8_t* name;\r
+};\r
+struct ir_classld_t\r
+{ struct ir_class_t* root_class;\r
+ struct ir_namelist_t* namelist;\r
+};\r
+struct ir_setld_t\r
+{ struct classld_t* classld;\r
+ long long ref;\r
+ struct ir_namelist_t* namelist;\r
+};\r
/* Set data mem */\r
struct ir_setdata_header_t\r
{ enum dtype type;\r
{ struct ir_setdata_header_t header; };\r
struct ir_link_t\r
{ struct ir_setdata_header_t header;\r
- struct ir_set_t* src, * trg;\r
+ struct ir_classld_t* classld;\r
+ struct ir_setld_t* setld;\r
enum ltype type;\r
};\r
union ir_setdata_t\r
{ iter = iter->nextsib;\r
goto check;\r
}\r
- return iter->nextsib = struct_alloc(ir_class_t);\r
+ iter = struct_alloc(ir_class_t);\r
+ iter->nextsib = class->nextchild;\r
+ return class->nextchild = iter;\r
}\r
\r
/* Add a set to a class\r
{ iter = iter->nextsib;\r
goto check;\r
}\r
- return iter->nextsib = struct_alloc(ir_set_t);\r
+ iter = struct_alloc(ir_set_t);\r
+ iter->nextsib = class->root_set;\r
+ return class->root_set = iter;\r
}\r
\r
/* Add a set to a set\r
{ iter = iter->nextsib;\r
goto check;\r
}\r
- return iter->nextsib = struct_alloc(ir_set_t);\r
+ iter = struct_alloc(ir_set_t);\r
+ iter->nextsib = set->nextchild;\r
+ return set->nextchild = iter;\r
}\r
\r
/* Add a framebox to a set\r
{ iter = (struct ir_framebox_t*) iter->header.nextsib;\r
goto check;\r
}\r
- iter->header.nextsib = (union ir_setdata_t*) struct_alloc(ir_framebox_t);\r
- return (struct ir_framebox_t*) iter->header.nextsib;\r
+ iter = struct_alloc(ir_framebox_t);\r
+ iter->header.nextsib = (union ir_setdata_t*) set->frameboxes;\r
+ return set->frameboxes = iter;\r
}\r
\r
/* Match two null-terminated bytestrings\r
( uint8_t* stra,\r
uint8_t* strb\r
)\r
-{ while (*stra && *strb)\r
- if (*stra++ != *strb++)\r
- return 0;\r
- return *stra == *strb;\r
+{ int ca, cb;\r
+ do {\r
+ ca = *stra++;\r
+ cb = *strb++;\r
+ } while (ca && ca == cb);\r
+ return (ca == cb);\r
}\r
\r
/* Assign Setdata to Set\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 (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
+ //setdata is now a pointer to redundant, unused memory.\r
return;\r
}\r
else\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
+ setdata->link.header.nextsib = set->links;\r
+ set->links = (struct ir_link_t*) setdata;\r
break;\r
default:\r
fprintf(stderr, "Unknown setdata type %x\n", setdata->header.type);\r