static int left_balance( Avlnode **root ) { int shorter= 0; Avlnode *r, *l; switch( (*root)->avl_bf ) { case LH: /* was left high - equal now */ (*root)->avl_bf = EH; shorter = 1; break; case EH: /* was equal - right high now */ (*root)->avl_bf = RH; shorter = 0; break; case RH: /* was right high - balance */ r = (*root)->avl_right; switch ( r->avl_bf ) { case LH : /* double rotation left */ l = r->avl_left; switch ( l->avl_bf ) { case LH : (*root)->avl_bf = EH; r->avl_bf = RH; break; case EH : (*root)->avl_bf = EH; r->avl_bf = EH; break; case RH : (*root)->avl_bf = LH; r->avl_bf = EH; break; } l->avl_bf = EH; ROTATERIGHT( (&r) ) (*root)->avl_right = r; ROTATELEFT( root ) shorter = 1; break; case EH : /* single rotation left */ (*root)->avl_bf = RH; r->avl_bf = LH; ROTATELEFT( root ); shorter = 0; break; case RH : /* single rotation left */ (*root)->avl_bf = EH; r->avl_bf = EH; ROTATELEFT( root ) shorter = 1; break; } break; } return( shorter ); }
static int ravl_insert( Avlnode **iroot, caddr_t data, int *taller, IFP fcmp, /* comparison function */ IFP fdup, /* function to call for duplicates */ int depth ) { int rc, cmp, tallersub; Avlnode *l, *r; if ( *iroot == 0 ) { if ( (*iroot = (Avlnode *) malloc( sizeof( Avlnode ) )) == NULL ) { return( -1 ); } (*iroot)->avl_left = 0; (*iroot)->avl_right = 0; (*iroot)->avl_bf = 0; (*iroot)->avl_data = data; *taller = 1; return( 0 ); } cmp = (*fcmp)( data, (*iroot)->avl_data ); /* equal - duplicate name */ if ( cmp == 0 ) { *taller = 0; return( (*fdup)( (*iroot)->avl_data, data ) ); } /* go right */ else if ( cmp > 0 ) { rc = ravl_insert( &((*iroot)->avl_right), data, &tallersub, fcmp, fdup, depth ); if ( tallersub ) switch ( (*iroot)->avl_bf ) { case LH : /* left high - balance is restored */ (*iroot)->avl_bf = EH; *taller = 0; break; case EH : /* equal height - now right heavy */ (*iroot)->avl_bf = RH; *taller = 1; break; case RH : /* right heavy to start - right balance */ r = (*iroot)->avl_right; switch ( r->avl_bf ) { case LH : /* double rotation left */ l = r->avl_left; switch ( l->avl_bf ) { case LH : (*iroot)->avl_bf = EH; r->avl_bf = RH; break; case EH : (*iroot)->avl_bf = EH; r->avl_bf = EH; break; case RH : (*iroot)->avl_bf = LH; r->avl_bf = EH; break; } l->avl_bf = EH; ROTATERIGHT( (&r) ) (*iroot)->avl_right = r; ROTATELEFT( iroot ) *taller = 0; break; case EH : /* This should never happen */ break; case RH : /* single rotation left */ (*iroot)->avl_bf = EH; r->avl_bf = EH; ROTATELEFT( iroot ) *taller = 0; break; } break; } else *taller = 0; } /* go left */ else { rc = ravl_insert( &((*iroot)->avl_left), data, &tallersub, fcmp, fdup, depth ); if ( tallersub ) switch ( (*iroot)->avl_bf ) { case LH : /* left high to start - left balance */ l = (*iroot)->avl_left; switch ( l->avl_bf ) { case LH : /* single rotation right */ (*iroot)->avl_bf = EH; l->avl_bf = EH; ROTATERIGHT( iroot ) *taller = 0; break; case EH : /* this should never happen */ break; case RH : /* double rotation right */ r = l->avl_right; switch ( r->avl_bf ) { case LH : (*iroot)->avl_bf = RH; l->avl_bf = EH; break; case EH : (*iroot)->avl_bf = EH; l->avl_bf = EH; break; case RH : (*iroot)->avl_bf = EH; l->avl_bf = LH; break; } r->avl_bf = EH; ROTATELEFT( (&l) ) (*iroot)->avl_left = l; ROTATERIGHT( iroot ) *taller = 0; break; } break; case EH : /* equal height - now left heavy */ (*iroot)->avl_bf = LH; *taller = 1; break; case RH : /* right high - balance is restored */ (*iroot)->avl_bf = EH; *taller = 0; break; } else *taller = 0; } return( rc ); }
void sm3_compress(uint32_t digest[8], const unsigned char block[64]) { int j; uint32_t W[68], W1[64]; const uint32_t *pblock = (const uint32_t *)block; uint32_t A = digest[0]; uint32_t B = digest[1]; uint32_t C = digest[2]; uint32_t D = digest[3]; uint32_t E = digest[4]; uint32_t F = digest[5]; uint32_t G = digest[6]; uint32_t H = digest[7]; uint32_t SS1,SS2,TT1,TT2,T[64]; for (j = 0; j < 16; j++) { W[j] = cpu_to_be32(pblock[j]); } for (j = 16; j < 68; j++) { W[j] = P1( W[j-16] ^ W[j-9] ^ ROTATELEFT(W[j-3],15)) ^ ROTATELEFT(W[j - 13],7 ) ^ W[j-6];; } for( j = 0; j < 64; j++) { W1[j] = W[j] ^ W[j+4]; } for(j =0; j < 16; j++) { T[j] = 0x79CC4519; SS1 = ROTATELEFT((ROTATELEFT(A,12) + E + ROTATELEFT(T[j],j)), 7); SS2 = SS1 ^ ROTATELEFT(A,12); TT1 = FF0(A,B,C) + D + SS2 + W1[j]; TT2 = GG0(E,F,G) + H + SS1 + W[j]; D = C; C = ROTATELEFT(B,9); B = A; A = TT1; H = G; G = ROTATELEFT(F,19); F = E; E = P0(TT2); } for(j =16; j < 64; j++) { T[j] = 0x7A879D8A; SS1 = ROTATELEFT((ROTATELEFT(A,12) + E + ROTATELEFT(T[j],j)), 7); SS2 = SS1 ^ ROTATELEFT(A,12); TT1 = FF1(A,B,C) + D + SS2 + W1[j]; TT2 = GG1(E,F,G) + H + SS1 + W[j]; D = C; C = ROTATELEFT(B,9); B = A; A = TT1; H = G; G = ROTATELEFT(F,19); F = E; E = P0(TT2); } digest[0] ^= A; digest[1] ^= B; digest[2] ^= C; digest[3] ^= D; digest[4] ^= E; digest[5] ^= F; digest[6] ^= G; digest[7] ^= H; }