X-Git-Url: https://www.kengrimes.com/gitweb/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Fir.c;h=0bdba39315462fbbbd12e49e40b249775b3c6407;hp=e860bd71204c8f1ae11061e1e7da3fef10c17a46;hb=e92cf135e461e07d723762aa4efb4bf7a0a17589;hpb=0628265d7e697838d836c292d77d0e4ba1b72bbd diff --git a/src/ir.c b/src/ir.c index e860bd7..0bdba39 100644 --- a/src/ir.c +++ b/src/ir.c @@ -64,9 +64,9 @@ struct ir_framebox_t struct ir_simplex_t { struct ir_setdata_header_t header; }; struct ir_link_t { struct ir_setdata_header_t header; - struct ir_classld_t* classld; struct ir_setld_t* setld; struct ir_set_t* trg_set; + uint8_t* dlink; enum ltype type; }; union ir_setdata_t @@ -596,8 +596,7 @@ union ir_setdata_t* ir_link link = struct_alloc(ir_link_t); struct_clear(link); link->header.type = LDAT; - link->type = link_type; - link->classld = setld->classld; + link->type = link_type; link->setld = setld; if (link_type != OLINK && name != NULL) link->header.data_name = name_alloc(name); @@ -619,10 +618,10 @@ union ir_setdata_t* ir_set_link ( struct ir_set_t* set ) { return (union ir_setdata_t*) set->links; } -#define assert_link(linkdata) do { \ +#define assert_link(linkdata) if (DEBUG) { \ if (linkdata->header.type != LDAT) \ eprintf("Data %s is not a link\n", linkdata->header.data_name); \ - } while (0) + } /* Return the link type */ enum ltype ir_linkdata_type @@ -662,7 +661,7 @@ void ir_linkdata_resolve_set setld = linkdata->link.setld; if (linkdata->link.setld == NULL) eprintf("Link data is invalid\n"); - classld = linkdata->link.classld; + classld = setld->classld; if (classld != NULL) { namelist_iter = classld->namelist; if (classld->root_class == NULL) @@ -686,7 +685,9 @@ void ir_linkdata_resolve_set namelist_iter->name, namelist_iter_last->name); else - eprintf("No such class \"%s\"\n", namelist_iter->name); + { wprintf("No such class \"%s\"\n", namelist_iter->name); + return; + } } set = class_iter->root_set; } @@ -722,6 +723,83 @@ void ir_linkdata_resolve_set linkdata->link.trg_set = set; } +/* Assign a linkdatas trg_set */ +void ir_linkdata_assign_set +( union ir_setdata_t* link, struct ir_set_t* set ) +{ assert_link(link); + link->link.trg_set = set; +} + +/* Assign a linkdatas type */ +void ir_linkdata_assign_type +( union ir_setdata_t* link, enum ltype type ) +{ assert_link(link); + link->link.type = type; +} + +/* Get, or generate, the fully qualified name of the link's target set */ +uint8_t* +ir_linkdata_dlink_name +( union ir_setdata_t* link ) +{ struct ir_namelist_t* namelist_iter; + struct ir_setld_t* setld; + struct ir_classld_t* classld; + uint8_t* bytep; + size_t bytes; + char setpass; + uint8_t delimiter; + assert_link(link); + if (link->link.dlink != NULL) + return link->link.dlink; + bytes = 0; + setld = link->link.setld; + if (setld == NULL) + eprintf("No setld in dlink\n"); + classld = setld->classld; + if (classld == NULL) + eprintf("No classld in dlink\n"); + if (classld->root_class != NULL) + eprintf("Cannot dlink local class \"%s\"\n", classld->root_class->name); + namelist_iter = classld->namelist; + setpass = 0; + count_bytes_in_namelist: + while (namelist_iter != NULL) + { bytep = namelist_iter->name; + while (*bytep++); + bytes += (bytep - namelist_iter->name); + namelist_iter = namelist_iter->nextsib; + } + if (setpass == 0) + { setpass = 1; + namelist_iter = setld->namelist; + goto count_bytes_in_namelist; + } + bytes += 2; //trailing '\0' and preceding '.' + link->link.dlink = stack_alloc(&namepages, bytes); + bytes = 0; + link->link.dlink[bytes++] = '.'; //dlinks start with '.' + namelist_iter = classld->namelist; + setpass = 0; + delimiter = '-'; //class delimiter + copy_bytes_in_namelist: + while (namelist_iter != NULL) + { bytep = namelist_iter->name; + while (*bytep) + link->link.dlink[bytes++] = *bytep++; + link->link.dlink[bytes++] = delimiter; + namelist_iter = namelist_iter->nextsib; + } + if (setpass == 0) + { setpass = 1; + namelist_iter = setld->namelist; + delimiter = '_'; //set delimiter + link->link.dlink[bytes - 1] = delimiter; //overwrite last delimiter + goto copy_bytes_in_namelist; + } + link->link.dlink[bytes] = '\0'; //tailing '\0' null termination + return link->link.dlink; +} + /* Get a setdata's next sibling */ union ir_setdata_t* ir_setdata_nextsib ( union ir_setdata_t* setdata ) @@ -749,6 +827,11 @@ void ir_setdata_assign_fpos ) { setdata->header.filepos = newpos; } +/* Assign a setdatas name */ +void ir_setdata_assign_name +( union ir_setdata_t* setdata, uint8_t* name ) +{ setdata->header.data_name = name;} + /* Return a framebox's specified framesheet */ union ir_setdata_t* ir_framebox_framesheet ( union ir_setdata_t* fbox,