Esempio n. 1
0
void
window_part::split_rec(const rect_type& r, unsigned& k)
{
    const partition& p = m_index[k ++];
    if (p.split == horizontal)
    {
        num_type dx = (r.x2 - r.x1) / p.childs_number;
        for (unsigned j = 0; j < unsigned(p.childs_number); j++)
        {
            rect_type rs(r.x1 + j * dx, r.y1, r.x1 + (j + 1) * dx, r.y2);
            split_rec(rs, k);
        }
    }
    else if (p.split == vertical)
    {
        num_type dy = (r.y2 - r.y1) / p.childs_number;
        for (unsigned j = 0; j < unsigned(p.childs_number); j++)
        {
            rect_type rs(r.x1, r.y1 + j * dy, r.x2, r.y1 + (j + 1) * dy);
            split_rec(rs, k);
        }
    }
    else
    {
        m_rect.add(r);
    }
}
int allocate(int size) {

    if(size + 1 > 512) {
        return -1;
    }

    int temp,ceil_size, req_free_list,req_free_list_size,start_addr;

    ceil_size = ceil2(size + 1);
    req_free_list = get_free_list(ceil_size);
    req_free_list_size = find_free_list_size(ceil_size);

    if(heap[req_free_list] == -1) {
        temp = split_rec(req_free_list, req_free_list_size, ceil_size, ceil_size);
        if(temp == 0) {
            return -1;
        }
    }

    temp = req_free_list;
    while(temp < req_free_list + req_free_list_size && heap[temp] != -1) {
        temp = temp + 1;
    }

    temp--;
    start_addr = heap[temp];
    heap[temp] = -1;
    heap[start_addr] = size;
    return start_addr;
}
Esempio n. 3
0
void
window_part::split()
{
    m_rect.clear();
    rect_type r(0, 0, 1, 1);
    unsigned pos = 0;
    split_rec(r, pos);
}
int split_rec(int current_list, int list_size, int current_size, int required_size) {
    if(current_list < 0) {
        return 0;
    }
    if(heap[current_list] == -1 && !split_rec((current_list - 1)/2, list_size / 2, current_size*2, required_size)) {
        return 0;
    }
    if(required_size == current_size && heap[current_list] != -1) {
        return 1;
    }
    int temp = get_free_block(current_list,list_size);
    add_to_list(2*current_list+1, temp + current_size/2);
    add_to_list(2*current_list+1, temp);
    return 1;
}
Esempio n. 5
0
File: asn.c Progetto: bzruk/mtr
char *get_ipinfo(ip_t *addr, int ndx) {
    if (!addr)
        return NULL;

    char key[NAMELEN];
    char lookup_key[NAMELEN];

    if (af == AF_INET6) {
#ifdef ENABLE_IPV6
        if (!origins[origin_no].ip6zone)
            return NULL;
        reverse_host6(addr, key);
        sprintf(lookup_key, "%s.%s", key, origins[origin_no].ip6zone);
#else
	return NULL;
#endif
    } else {
        if (!origins[origin_no].ip4zone)
            return NULL;
        unsigned char buff[4];
        memcpy(buff, addr, 4);
        sprintf(key, "%d.%d.%d.%d", buff[3], buff[2], buff[1], buff[0]);
        sprintf(lookup_key, "%s.%s", key, origins[origin_no].ip4zone);
    }

    char *val = NULL;
    ENTRY item;

    if (hash) {
        IIDEBUG_MSG((LOG_INFO, ">> Search: %s", key));
        item.key = key;
        ENTRY *found_item;
        if ((found_item = hsearch(item, FIND))) {
            if (!(val = (*((items_t*)found_item->data))[ipinfo_no[ndx]]))
                val = (*((items_t*)found_item->data))[0];
            IIDEBUG_MSG((LOG_INFO, "Found (hashed): %s", val));
        }
    }

    if (!val) {
        IIDEBUG_MSG((LOG_INFO, "Lookup: %s", key));
        if ((val = split_rec(ipinfo_lookup(lookup_key), ndx))) {
            IIDEBUG_MSG((LOG_INFO, "Looked up: %s", key));
            if (hash)
                if ((item.key = strdup(key))) {
                    item.data = (void*)items;
                    hsearch(item, ENTER);
#ifdef IIDEBUG
                    {
                        char buff[NAMELEN] = {0};
                        int i, len = 0;
                        for (i = 0; (i < II_ITEM_MAX) && (*items)[i]; i++) {
                            sprintf(buff + len, "\"%s\" ", (*items)[i]);
                            len = strlen(buff);
                        }
                        syslog(LOG_INFO, "Insert into hash: \"%s\" => %s", key, buff);
                    }
#endif
                }
        }
    }

    return val;
}