From 59459f248b674ffefa42bc8f6b0326879953f814 Mon Sep 17 00:00:00 2001 From: Jordan Date: Wed, 11 Jan 2017 18:11:50 -0800 Subject: [PATCH] fixes --- src/ir.c | 58 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/src/ir.c b/src/ir.c index 63fe72b..0f98698 100644 --- a/src/ir.c +++ b/src/ir.c @@ -48,6 +48,21 @@ struct pagenode_t { /* Enumerated types */ enum dtype { FSDAT, MSDAT, ADAT, LDAT, FBDAT }; enum ltype { OLINK, MLINK, VLINK, ALINK }; +/* Set link data */ +struct ir_namelist_t; +struct ir_namelist_t +{ struct ir_namelist_t* nextsib; + uint8_t* name; +}; +struct ir_classld_t +{ struct ir_class_t* root_class; + struct ir_namelist_t* namelist; +}; +struct ir_setld_t +{ struct classld_t* classld; + long long ref; + struct ir_namelist_t* namelist; +}; /* Set data mem */ struct ir_setdata_header_t { enum dtype type; @@ -69,7 +84,8 @@ struct ir_simplex_t { struct ir_setdata_header_t header; }; struct ir_link_t { struct ir_setdata_header_t header; - struct ir_set_t* src, * trg; + struct ir_classld_t* classld; + struct ir_setld_t* setld; enum ltype type; }; union ir_setdata_t @@ -183,7 +199,9 @@ struct ir_class_t* ir_class_addchild { iter = iter->nextsib; goto check; } - return iter->nextsib = struct_alloc(ir_class_t); + iter = struct_alloc(ir_class_t); + iter->nextsib = class->nextchild; + return class->nextchild = iter; } /* Add a set to a class @@ -205,7 +223,9 @@ struct ir_set_t* ir_class_addset { iter = iter->nextsib; goto check; } - return iter->nextsib = struct_alloc(ir_set_t); + iter = struct_alloc(ir_set_t); + iter->nextsib = class->root_set; + return class->root_set = iter; } /* Add a set to a set @@ -227,7 +247,9 @@ struct ir_set_t* ir_set_addchild { iter = iter->nextsib; goto check; } - return iter->nextsib = struct_alloc(ir_set_t); + iter = struct_alloc(ir_set_t); + iter->nextsib = set->nextchild; + return set->nextchild = iter; } /* Add a framebox to a set @@ -250,8 +272,9 @@ struct ir_framebox_t* ir_set_add_framebox { iter = (struct ir_framebox_t*) iter->header.nextsib; goto check; } - iter->header.nextsib = (union ir_setdata_t*) struct_alloc(ir_framebox_t); - return (struct ir_framebox_t*) iter->header.nextsib; + iter = struct_alloc(ir_framebox_t); + iter->header.nextsib = (union ir_setdata_t*) set->frameboxes; + return set->frameboxes = iter; } /* Match two null-terminated bytestrings @@ -262,10 +285,12 @@ int bytes_identical ( uint8_t* stra, uint8_t* strb ) -{ while (*stra && *strb) - if (*stra++ != *strb++) - return 0; - return *stra == *strb; +{ int ca, cb; + do { + ca = *stra++; + cb = *strb++; + } while (ca && ca == cb); + return (ca == cb); } /* Assign Setdata to Set @@ -277,7 +302,6 @@ void ir_set_assign_data ) { struct ir_framebox_t* framebox; struct ir_simplex_t* simplex; - struct ir_link_t* link; switch (setdata->header.type) { case FSDAT: framebox = ir_set_add_framebox(set, setdata->header.data_name); @@ -303,7 +327,7 @@ void ir_set_assign_data 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. + //setdata is now a pointer to redundant, unused memory. return; } else @@ -311,14 +335,8 @@ void ir_set_assign_data simplex->header.nextsib = setdata; break; case LDAT: - if (set->links == NULL) - { set->links = (struct ir_link_t*) setdata; - return; - } - link = set->links; - while (link->header.nextsib != NULL) - link = (struct ir_link_t*) link->header.nextsib; - link->header.nextsib = setdata; + setdata->link.header.nextsib = set->links; + set->links = (struct ir_link_t*) setdata; break; default: fprintf(stderr, "Unknown setdata type %x\n", setdata->header.type); -- 2.18.0