| Index: openssl/crypto/ex_data.c | 
| =================================================================== | 
| --- openssl/crypto/ex_data.c	(revision 105093) | 
| +++ openssl/crypto/ex_data.c	(working copy) | 
| @@ -245,18 +245,21 @@ | 
| static int ex_class = CRYPTO_EX_INDEX_USER; | 
|  | 
| /* The global hash table of EX_CLASS_ITEM items */ | 
| -static LHASH *ex_data = NULL; | 
| +DECLARE_LHASH_OF(EX_CLASS_ITEM); | 
| +static LHASH_OF(EX_CLASS_ITEM) *ex_data = NULL; | 
|  | 
| /* The callbacks required in the "ex_data" hash table */ | 
| -static unsigned long ex_hash_cb(const void *a_void) | 
| +static unsigned long ex_class_item_hash(const EX_CLASS_ITEM *a) | 
| { | 
| -	return ((const EX_CLASS_ITEM *)a_void)->class_index; | 
| +	return a->class_index; | 
| } | 
| -static int ex_cmp_cb(const void *a_void, const void *b_void) | 
| +static IMPLEMENT_LHASH_HASH_FN(ex_class_item, EX_CLASS_ITEM) | 
| + | 
| +static int ex_class_item_cmp(const EX_CLASS_ITEM *a, const EX_CLASS_ITEM *b) | 
| { | 
| -	return (((const EX_CLASS_ITEM *)a_void)->class_index - | 
| -		((const EX_CLASS_ITEM *)b_void)->class_index); | 
| +	return a->class_index - b->class_index; | 
| } | 
| +static IMPLEMENT_LHASH_COMP_FN(ex_class_item, EX_CLASS_ITEM) | 
|  | 
| /* Internal functions used by the "impl_default" implementation to access the | 
| * state */ | 
| @@ -265,7 +268,8 @@ | 
| { | 
| int toret = 1; | 
| CRYPTO_w_lock(CRYPTO_LOCK_EX_DATA); | 
| -	if(!ex_data && ((ex_data = lh_new(ex_hash_cb, ex_cmp_cb)) == NULL)) | 
| +	if(!ex_data | 
| +	   && (ex_data = lh_EX_CLASS_ITEM_new()) == NULL) | 
| toret = 0; | 
| CRYPTO_w_unlock(CRYPTO_LOCK_EX_DATA); | 
| return toret; | 
| @@ -298,7 +302,7 @@ | 
| EX_DATA_CHECK(return NULL;) | 
| d.class_index = class_index; | 
| CRYPTO_w_lock(CRYPTO_LOCK_EX_DATA); | 
| -	p = lh_retrieve(ex_data, &d); | 
| +	p = lh_EX_CLASS_ITEM_retrieve(ex_data, &d); | 
| if(!p) | 
| { | 
| gen = OPENSSL_malloc(sizeof(EX_CLASS_ITEM)); | 
| @@ -313,7 +317,7 @@ | 
| { | 
| /* Because we're inside the ex_data lock, the | 
| * return value from the insert will be NULL */ | 
| -				lh_insert(ex_data, gen); | 
| +				(void)lh_EX_CLASS_ITEM_insert(ex_data, gen); | 
| p = gen; | 
| } | 
| } | 
| @@ -375,8 +379,8 @@ | 
| static void int_cleanup(void) | 
| { | 
| EX_DATA_CHECK(return;) | 
| -	lh_doall(ex_data, def_cleanup_cb); | 
| -	lh_free(ex_data); | 
| +	lh_EX_CLASS_ITEM_doall(ex_data, def_cleanup_cb); | 
| +	lh_EX_CLASS_ITEM_free(ex_data); | 
| ex_data = NULL; | 
| impl = NULL; | 
| } | 
| @@ -452,7 +456,7 @@ | 
| return 0; | 
| CRYPTO_r_lock(CRYPTO_LOCK_EX_DATA); | 
| mx = sk_CRYPTO_EX_DATA_FUNCS_num(item->meth); | 
| -	j = sk_num(from->sk); | 
| +	j = sk_void_num(from->sk); | 
| if(j < mx) | 
| mx = j; | 
| if(mx > 0) | 
| @@ -523,7 +527,7 @@ | 
| OPENSSL_free(storage); | 
| if(ad->sk) | 
| { | 
| -		sk_free(ad->sk); | 
| +		sk_void_free(ad->sk); | 
| ad->sk=NULL; | 
| } | 
| } | 
| @@ -596,24 +600,24 @@ | 
|  | 
| if (ad->sk == NULL) | 
| { | 
| -		if ((ad->sk=sk_new_null()) == NULL) | 
| +		if ((ad->sk=sk_void_new_null()) == NULL) | 
| { | 
| CRYPTOerr(CRYPTO_F_CRYPTO_SET_EX_DATA,ERR_R_MALLOC_FAILURE); | 
| return(0); | 
| } | 
| } | 
| -	i=sk_num(ad->sk); | 
| +	i=sk_void_num(ad->sk); | 
|  | 
| while (i <= idx) | 
| { | 
| -		if (!sk_push(ad->sk,NULL)) | 
| +		if (!sk_void_push(ad->sk,NULL)) | 
| { | 
| CRYPTOerr(CRYPTO_F_CRYPTO_SET_EX_DATA,ERR_R_MALLOC_FAILURE); | 
| return(0); | 
| } | 
| i++; | 
| } | 
| -	sk_set(ad->sk,idx,val); | 
| +	sk_void_set(ad->sk,idx,val); | 
| return(1); | 
| } | 
|  | 
| @@ -623,10 +627,10 @@ | 
| { | 
| if (ad->sk == NULL) | 
| return(0); | 
| -	else if (idx >= sk_num(ad->sk)) | 
| +	else if (idx >= sk_void_num(ad->sk)) | 
| return(0); | 
| else | 
| -		return(sk_value(ad->sk,idx)); | 
| +		return(sk_void_value(ad->sk,idx)); | 
| } | 
|  | 
| IMPLEMENT_STACK_OF(CRYPTO_EX_DATA_FUNCS) | 
|  |