X-Git-Url: https://www.kengrimes.com/gitweb/?a=blobdiff_plain;f=src%2Fir.c;h=10c053efd498bfe25aff8c6f195a42867dcf33dd;hb=2adb4f588fa1a6a16876af1bfaeebebc8bbbc748;hp=4ef2e5a9fa328be6fd935f8624dfc922a36239a3;hpb=32084db924eb07c8a5e44748aaf12883189b37d2;p=henge%2Fapc.git diff --git a/src/ir.c b/src/ir.c index 4ef2e5a..10c053e 100644 --- a/src/ir.c +++ b/src/ir.c @@ -17,12 +17,11 @@ #include //u32_cpy #include //ulc_fprintf /* Local */ +#define eprintf_callback(...) exit(EXIT_FAILURE) #include "print.h" #include "apc.h" #include "ir.h" #include "pagenode.h" -#undef do_error -#define do_error(...) exit(-1) #define XXH_PRIVATE_API #include "../xxHash/xxhash.h" /* Public */ @@ -67,6 +66,7 @@ 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; enum ltype type; }; union ir_setdata_t @@ -98,6 +98,8 @@ struct ir_framebox_t* ir_set_add_framebox(struct ir_set_t*,uint8_t*); static inline union ir_setdata_t* ir_framedata (enum dtype,const uint8_t*,apc_facing,int,int); static inline +void ir_linkdata_resolve_set(union ir_setdata_t*); +static inline int bytes_identical(const uint8_t*,const uint8_t*); static inline int classnames_identical(const uint8_t*,const uint8_t*); @@ -110,10 +112,12 @@ uint8_t* classname_alloc(const uint8_t*); #define struct_alloc(_T) ((struct _T*) stack_alloc(&datapages, sizeof(struct _T))) extern //apc.c long sys_pagesize; +extern //apc.c +char* apc_package_name; static struct pagelist_t datapages, namepages, refhashpages; static -struct ir_class_t root_class = { .name = (uint8_t*)"." }; +struct ir_class_t root_class; /* Init */ int ir_init @@ -121,7 +125,7 @@ int ir_init { pagelist_init(datapages, (size_t)SYS_PAGESIZE); pagelist_init(namepages, (size_t)NAME_PAGESIZE); pagelist_init(refhashpages, (size_t)SYS_PAGESIZE); - + root_class.name = (uint8_t*) apc_package_name; return 0; } @@ -615,27 +619,38 @@ union ir_setdata_t* ir_set_link ( struct ir_set_t* set ) { return (union ir_setdata_t*) set->links; } +#define assert_link(linkdata) do { \ + 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 ( union ir_setdata_t* linkdata ) -{ if (linkdata->header.type != LDAT) - eprintf("Data %s is not a link\n", linkdata->header.data_name); +{ assert_link(linkdata); return linkdata->link.type; } /* Return the link type */ uint32_t ir_linkdata_ref ( union ir_setdata_t* linkdata ) -{ if (linkdata->header.type != LDAT) - eprintf("Data %s is not a link\n", linkdata->header.data_name); +{ assert_link(linkdata); return linkdata->link.setld->ref; } -/* Resolve and return the link's target set - Fails on error, cannot return NULL -*/ +/* Return the current target set, resolving it first if not present */ struct ir_set_t* ir_linkdata_set ( union ir_setdata_t* linkdata ) +{ assert_link(linkdata); + if (linkdata->link.trg_set == NULL) + ir_linkdata_resolve_set(linkdata); + return linkdata->link.trg_set; +} + +/* Resolve and assign the link's target set */ +static inline +void ir_linkdata_resolve_set +( union ir_setdata_t* linkdata ) { struct ir_class_t* class_iter; struct ir_namelist_t* namelist_iter,* namelist_iter_last; struct ir_setld_t* setld; @@ -643,8 +658,7 @@ struct ir_set_t* ir_linkdata_set struct ir_set_t* set; set = NULL; class_iter = NULL; - if (linkdata->header.type != LDAT) - eprintf("Data %s is not a link\n", linkdata->header.data_name); + assert_link(linkdata); setld = linkdata->link.setld; if (linkdata->link.setld == NULL) eprintf("Link data is invalid\n"); @@ -705,9 +719,19 @@ struct ir_set_t* ir_linkdata_set class_iter->name); } } - return set; + linkdata->link.trg_set = set; } +/* Assign a linkdatas trg_set */ +void ir_linkdata_assign_set +( struct ir_link_t* link, struct ir_set_t* set ) +{ link->trg_set = set; } + +/* Assign a linkdatas type */ +void ir_linkdata_assign_type +( struct ir_link_t* link, ltype type; ) +{ link->type = type; } + /* Get a setdata's next sibling */ union ir_setdata_t* ir_setdata_nextsib ( union ir_setdata_t* setdata ) @@ -735,6 +759,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,