MR_Dlist * MR_dlist_addlist(MR_Dlist *list1, MR_Dlist *list2) { if (list1 == NULL) { list1 = MR_dlist_makelist0(); } if (list2 == NULL) { list2 = MR_dlist_makelist0(); } if (MR_dlist_length(list2) > 0) { if (MR_dlist_length(list1) == 0) { MR_dlist_data(list1) = MR_dlist_data(list2); // Pointers from header. MR_dlist_next(list1) = MR_dlist_next(list2); MR_dlist_prev(list1) = MR_dlist_prev(list2); // Pointers to header. MR_dlist_prev(MR_dlist_next(list1)) = list1; MR_dlist_next(MR_dlist_prev(list1)) = list1; } else { MR_dlist_length_field(list1) = MR_dlist_length(list1) + MR_dlist_length(list2); // End of list 1 to start of list 2. MR_dlist_next(MR_dlist_prev(list1)) = MR_dlist_next(list2); MR_dlist_prev(MR_dlist_next(list2)) = MR_dlist_prev(list1); // End of list 2 to start of list 1. MR_dlist_next(MR_dlist_prev(list2)) = list1; MR_dlist_prev(list1) = MR_dlist_prev(list2); } } MR_GC_free(list2); return list1; }
static MR_bool MR_find_zone_for_det_ptr(const MR_Word *ptr, MR_Context **ctxt_ptr, MR_MemoryZone **zone_ptr, int *zone_num_ptr) { #ifdef MR_USE_MINIMAL_MODEL_OWN_STACKS const MR_Dlist *item; MR_Context *ctxt; if (MR_find_zone_for_det_ptr_in_context(ptr, MR_ENGINE(MR_eng_main_context), zone_ptr, zone_num_ptr)) { if (ctxt_ptr != NULL) { *ctxt_ptr = MR_ENGINE(MR_eng_main_context); } return MR_TRUE; } MR_for_dlist(item, MR_ENGINE(MR_eng_gen_contexts)) { ctxt = (MR_Context *) MR_dlist_data(item); if (MR_find_zone_for_det_ptr_in_context(ptr, ctxt, zone_ptr, zone_num_ptr)) { if (ctxt_ptr != NULL) { *ctxt_ptr = ctxt; } return MR_TRUE; } }
MR_Dlist * MR_dlist_makelist0(void) { MR_Dlist *list; list = MR_GC_NEW_ATTRIB(MR_Dlist, MR_ALLOC_SITE_RUNTIME); MR_dlist_data(list) = NULL; MR_dlist_next(list) = list; MR_dlist_prev(list) = list; return list; }
MR_Dlist * MR_dlist_addndlist(MR_Dlist *list1, MR_Dlist *list2) { MR_Dlist *ptr; if (list1 == NULL) { list1 = MR_dlist_makelist0(); } if (list2 == NULL) { list2 = MR_dlist_makelist0(); } MR_for_dlist (ptr, list2) { MR_dlist_addtail(list1, MR_dlist_data(ptr)); }
MR_Dlist * MR_dlist_addtail(MR_Dlist *list, const void *data) { MR_Dlist *item; if (list == NULL) { list = MR_dlist_makelist0(); } item = MR_GC_NEW_ATTRIB(MR_Dlist, MR_ALLOC_SITE_RUNTIME); MR_dlist_data(item) = data; MR_dlist_length_field(list)++; // Item's pointers. MR_dlist_next(item) = list; MR_dlist_prev(item) = MR_dlist_prev(list); // Neighbours' pointers. MR_dlist_next(MR_dlist_prev(item)) = item; MR_dlist_prev(MR_dlist_next(item)) = item; return list; }