From 602b184e1e27d21b7e872666c3c5ae3d34f5e971 Mon Sep 17 00:00:00 2001 From: ken Date: Thu, 16 Feb 2017 21:41:39 -0800 Subject: [PATCH] linkdata_set implementation --- src/ir.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/ir.c b/src/ir.c index d6ad16f..5f5ba21 100644 --- a/src/ir.c +++ b/src/ir.c @@ -631,6 +631,55 @@ uint32_t ir_linkdata_ref return linkdata->link.setld->ref; } +/* Resolve and return the link's target set */ +struct ir_set_t* ir_linkdata_set +( union ir_setdata_t* linkdata ) +{ struct ir_class_t* class_iter; + struct ir_namelist_t* namelist_iter; + struct ir_setld_t* setld; + struct ir_classld_t* classld; + struct ir_set_t* set; + set = NULL; + if (linkdata->header.type != LDAT) + eprintf("Data %s is not a link\n", linkdata->header.data_name); + setld = linkdata->link.setld; + if (linkdata->link.setld == NULL) + eprintf("Link data is invalid\n"); + classld = linkdata->link.classld; + if (classld != NULL) + { namelist_iter = classld->namelist; + if (classld->root_class == NULL) + eprintf("No root class for classld\n"); + for (class_iter = classld->root_class->nextchild; + class_iter != NULL; + class_iter = class_iter->nextsib) + { if (classnames_identical(class_iter->name, namelist_iter->name)) + { if (namelist_iter == classld->namelist_head) + break; + class_iter = class_iter->nextchild; + namelist_iter = namelist_iter->nextsib; + } + } + if (class_iter == NULL) + eprintf("Class resolution failed\n"); + set = class_iter->root_set; + } + else if (setld->ref) + set = ir_set_from_ref(setld->ref); + if (set == NULL) + eprintf("Initial set resolution failed\n"); + namelist_iter = setld->namelist; + while (set != NULL) + { if (bytes_identical(set->name, namelist_iter->name)) + { if (namelist_iter == setld->namelist_head) + break; + set = set->nextchild; + namelist_iter = namelist_iter->nextsib; + } + } + return set; +} + /* Get a setdata's next sibling */ union ir_setdata_t* ir_setdata_nextsib ( union ir_setdata_t* setdata ) -- 2.18.0