/*
 * Callback with config info. Assume that only one TLV comes in, carrying
 * the response to earlier conf read request. Copy in all the data to
 * current table being read. You might also get an error TLV as response
 * in a NAK.
 */
static void conf_rsp_cb(void *buf, size_t rlen)
{
	struct ayla_cmd *cmd;
	struct ayla_tlv *tlv;
	size_t tlen;

	cmd = buf;
	rlen -= sizeof(*cmd);
	tlv = (struct ayla_tlv *)(cmd + 1);

	while (rlen > sizeof(*tlv)) {
		tlen = sizeof(*tlv) + tlv->len;
		if (tlen > rlen) {
			copy_val(NULL, tlv->type, -1);
			break;
		}
		if (tlv->type != ATLV_CONF) {
			copy_val(tlv + 1, tlv->type, tlv->len);
			cur_idx++;
			conf_read_next_tbl();
			return;
		}
		rlen -= tlen;
		tlv = (struct ayla_tlv *)((char *)tlv + tlen);
	}
	copy_val(NULL, ATLV_ERR, 0);
	cur_idx++;
	conf_read_next_tbl();
}
Exemple #2
0
/* reg must be MAX_ADDR_CELLS */
static int find_range(u32 *reg, u32 *ranges, int nregaddr,
                      int naddr, int nsize, int buflen)
{
	int nrange = nregaddr + naddr + nsize;
	int i;

	for (i = 0; i + nrange <= buflen; i += nrange) {
		u32 range_addr[MAX_ADDR_CELLS];
		u32 range_size[MAX_ADDR_CELLS];

		copy_val(range_addr, ranges + i, naddr);
		copy_val(range_size, ranges + i + nregaddr + naddr, nsize);

		if (compare_reg(reg, range_addr, range_size))
			return i;
	}

	return -1;
}
int main(void)
{
    int ar[NUM];

    copy_val(ar,NUM,RANGE);
    show_ar(ar,NUM);
    putchar('\n');
    putchar('\n');
    sort_ar(ar,NUM);
    show_ar(ar,NUM);
    putchar('\n');
    putchar('\n');
    printf("%d", ar[100]);

    return 0;
}
Exemple #4
0
static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
		unsigned long *size)
{
	u32 last_addr[MAX_ADDR_CELLS];
	u32 this_addr[MAX_ADDR_CELLS];
	void *parent;
	u64 ret_addr, ret_size;
	u32 naddr, nsize, prev_naddr, prev_nsize;
	int buflen, offset;

	parent = get_parent(node);
	if (!parent)
		return 0;

	dt_get_reg_format(parent, &naddr, &nsize);

	if (nsize > 2)
		return 0;

	offset = (naddr + nsize) * res;

	if (reglen < offset + naddr + nsize ||
	    MAX_PROP_LEN < (offset + naddr + nsize) * 4)
		return 0;

	copy_val(last_addr, prop_buf + offset, naddr);

	ret_size = prop_buf[offset + naddr];
	if (nsize == 2) {
		ret_size <<= 32;
		ret_size |= prop_buf[offset + naddr + 1];
	}

	for (;;) {
		prev_naddr = naddr;
		prev_nsize = nsize;
		node = parent;

		parent = get_parent(node);
		if (!parent)
			break;

		dt_get_reg_format(parent, &naddr, &nsize);

		buflen = getprop(node, "ranges", prop_buf,
				sizeof(prop_buf));
		if (buflen == 0)
			continue;
		if (buflen < 0 || buflen > sizeof(prop_buf))
			return 0;

		offset = find_range(last_addr, prop_buf, prev_naddr,
		                    naddr, prev_nsize, buflen / 4);

		if (offset < 0)
			return 0;

		copy_val(this_addr, prop_buf + offset, prev_naddr);

		if (!sub_reg(last_addr, this_addr))
			return 0;

		copy_val(this_addr, prop_buf + offset + prev_naddr, naddr);

		if (!add_reg(last_addr, this_addr, naddr))
			return 0;
	}

	if (naddr > 2)
		return 0;

	ret_addr = ((u64)last_addr[2] << 32) | last_addr[3];

	if (sizeof(void *) == 4 &&
	    (ret_addr >= 0x100000000ULL || ret_size > 0x100000000ULL ||
	     ret_addr + ret_size > 0x100000000ULL))
		return 0;

	*addr = ret_addr;
	if (size)
		*size = ret_size;

	return 1;
}
	int main()
	{
		int att_array[3];
		int i = 0;
		TransactionManager transact_val1;
		dct_tree *tree_val = NULL;
		dct_tree *tree_val2 = NULL;
		dct_tree *tree_val3 = NULL;
		dct_node *temp = NULL;
		tree_val = build_dcttree(3);
		tree_val3 = build_dcttree(3);
		att_array[0] = 1;
		att_array[1] = 2;
		att_array[2] = 3;
		try
		{
			insert_val(att_array, tree_val, transact_val1);
			insert_val(att_array, tree_val3, transact_val1);
			//throw -1;
			transact_val1.commit_transaction();
			tree_val2 = copy_val((tree_val->getdummy()), (tree_val->getnumber_of_nodes()));
		}catch (int e)
		{
			cout<<"exception caught"<<" "<<e<<endl;
			return 1;
		}

		//att_array[2] = 3;
		if (search_val(att_array, tree_val))
		{
			cout<<"All values found"<<endl;
		}
		else
		{
			cout<<"All values not found"<<endl;
		}

		temp = search_val(att_array, tree_val2);
		if (temp != NULL)
		{
			cout<<" All values found copy tree"<<endl;
		}
		else
		{
			cout<<"All values not found copy tree"<<endl;
		}

		if (search_val(att_array, tree_val3))
		{
			cout<<"All values found3"<<endl;
		}
		else
		{
			cout<<"All values not found3"<<endl;
		}

		delete tree_val;
		delete tree_val2;
		delete tree_val3;
		delete temp;
	}