X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Fir.c;h=0f98698036edec70aaf431099db7a387816e526d;hp=593bae120d815563638c248acb00936325e3b3c6;hb=59459f248b674ffefa42bc8f6b0326879953f814;hpb=b503d817730f737819886d20463be80e5935dfb2 diff --git a/src/ir.c b/src/ir.c index 593bae1..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 @@ -247,10 +269,12 @@ struct ir_framebox_t* ir_set_add_framebox 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 = struct_alloc(ir_framebox_t); + iter->header.nextsib = (union ir_setdata_t*) set->frameboxes; + return set->frameboxes = iter; } /* Match two null-terminated bytestrings @@ -261,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 @@ -276,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); @@ -294,30 +319,24 @@ void ir_set_assign_data 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) 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. + *simplex = setdata->audio; + //setdata 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; - return; - } - link = set->links; - while (link->header.nextsib != NULL) - link = link->header.nextsib; - link->header.nextsib = setdata->link; + 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); @@ -326,12 +345,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); } @@ -340,10 +359,7 @@ void ir_data_assign_path ( union ir_setdata_t* setdata, uint8_t* path ) -{ if (setdata->header.src_filename) - wprintf("Path override: %s -> %s for set %s\n", - setdata->header.src_filename, path, setdata->name); - setdata->header.src_filename = path; +{ setdata->header.src_filename = path; //TODO: internal strdup, not assign (= path;) }