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; }
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; }
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; }