Example #1
0
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;
}
Example #2
0
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;
        }
    }
Example #3
0
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;
}
Example #4
0
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));
    }
Example #5
0
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;
}