void fixup(struct Tree * T, struct node * temp)
{
	struct node * z = temp;

	while((z->parent)->color == RED)
	{
		if(z->parent == ((z->parent)->parent)->lchild)
		{
			struct node * y = ((z->parent)->parent)->rchild;
			if(y->color == RED) 
			{
				(z->parent)->color = BLACK;
				y->color = BLACK;
				((z->parent)->parent)->color = RED;
				z = (z->parent)->parent;
			}
			else
			{
				if(z == (z->parent)->rchild)
				{
					z = z->parent;
					lrotate(T,z);
				}
				(z->parent)->color = BLACK;
				((z->parent)->parent)->color = RED;
				rrotate(T,(z->parent)->parent);
			}
		}
		else
		{
			struct node * y = ((z->parent)->parent)->lchild;
			if(y->color == RED) 
			{
				(z->parent)->color = BLACK;
				y->color = BLACK;
				((z->parent)->parent)->color = RED;
				z = (z->parent)->parent;
			}
			else
			{
				if(z == (z->parent)->lchild)
				{
					z = z->parent;
					rrotate(T,z);
				}
				(z->parent)->color = BLACK;
				((z->parent)->parent)->color = RED;
				lrotate(T,(z->parent)->parent);
			}
		}	
	}

	(T->root)->color = BLACK;
}
Example #2
0
    void des(const std::string& inp, std::string& key, std::string& p_encrypted) {
        boost::uint32_t c = bpermute(key.data(), 28, PC1[0]);
        boost::uint32_t d = bpermute(key.data(), 28, PC1[1]);
        boost::uint32_t l = rrotate(bpermute(inp.data(), 32, IP[0]),31);
        boost::uint32_t r = rrotate(bpermute(inp.data(), 32, IP[1]),31);

        boost::uint32_t rot=1;
        for(boost::uint32_t i=0;i<16;++i){
            boost::uint32_t k[2]=
            {
                permute(rrotate28(c,rot),24,PC2[1]),
                permute(rrotate28(d,rot),24,PC2[0])
            };

            for(boost::uint32_t j=0; j<8; ++j){
                boost::uint32_t x=k[j>>2]>>(j&3)*6;
                boost::uint32_t b=(rrotate(r,j*4)^x)&0x3f;
                boost::uint32_t s=(S[j][b>>3]>>((b&7)*4))&0xf;
                l^=rrotate(permute(s<<j*4,32,P),31);
            }
            boost::uint32_t t=l;
            l=r;
            r=t;
            ++rot;
            if(i!=0 && i!=7 && i!=14)
                ++rot;
        }
        char v[8]={};
        packbe(v,0,rrotate(r,1));
        packbe(v,4,rrotate(l,1));
        l=bpermute(v,32,FP[0]);
        r=bpermute(v,32,FP[1]);
        char out[8]={};
        packbe(out,0,l);
        packbe(out,4,r);
        p_encrypted.assign(out, 8);
    }
Example #3
0
static void do_rotation(struct avltree *tree, struct avlnode *parent)
{
	struct avlnode *node;
	/* do rotation */
	while (parent) {
		int balance;
		struct avlnode *left, *right;
		node = parent;
		parent = node->parent;
		left = node->left;
		right = node->right;

		balance = avl_balance(node);

		if (balance < -1) {
			int son_balance = avl_balance(right);
			/* RR */
			if (son_balance <= 0) {
				if (!parent) {
					lrotate(&tree->root);
				} else {
					lrotate(node == parent->left ? &parent->left : &parent->right);
				}
				continue;
			}
			/* RL */
			if (son_balance > 0) {
				rrotate(&node->right);
				if (!parent) {
					lrotate(&tree->root);
				} else {
					lrotate(node == parent->left ? &parent->left : &parent->right);
				}
				continue;
			}
			assert(0);
		} else if (balance > 1) {
			int son_balance = avl_balance(left);
			/* LL */
			if (son_balance >= 0) {
				if (!parent) {
					rrotate(&tree->root);
				} else {
					rrotate(node == parent->left ? &parent->left : &parent->right);
				}
				continue;
			}
			/* LR */
			if (son_balance < 0) {
				lrotate(&node->left);
				if (!parent) {
					rrotate(&tree->root);
				} else {
					rrotate(node == parent->left ? &parent->left : &parent->right);
				}
				continue;
			}
			assert(0);
		} else {
			avl_update_height(node);
		}
	}
}
Example #4
0
void		rrotate_2(t_all *all, int *op)
{
	rrotate(&all->a, op);
	rrotate(&all->b, op);
}