提交 1ea6472e 编写于 作者: B Ben Laurie

Type-safe OBJ_bsearch_ex.

上级 b8dfde2a
...@@ -4,10 +4,14 @@ ...@@ -4,10 +4,14 @@
Changes between 0.9.8j and 0.9.9 [xx XXX xxxx] Changes between 0.9.8j and 0.9.9 [xx XXX xxxx]
*) Type-checked OBJ_bsearch_ex.
[Ben Laurie]
*) Type-checked OBJ_bsearch. Also some constification necessitated *) Type-checked OBJ_bsearch. Also some constification necessitated
by type-checking. Still to come: TXT_DB, bsearch(?), by type-checking. Still to come: TXT_DB, bsearch(?),
OBJ_bsearch_ex, qsort, CRYPTO_EX_DATA, ASN1_VALUE, ASN1_STRING, OBJ_bsearch_ex, qsort, CRYPTO_EX_DATA, ASN1_VALUE, ASN1_STRING,
CONF_VALUE. [Ben Laurie] CONF_VALUE.
[Ben Laurie]
*) New function OPENSSL_gmtime_adj() to add a specific number of days and *) New function OPENSSL_gmtime_adj() to add a specific number of days and
seconds to a tm structure directly, instead of going through OS seconds to a tm structure directly, instead of going through OS
......
...@@ -678,11 +678,13 @@ int OBJ_sn2nid(const char *s) ...@@ -678,11 +678,13 @@ int OBJ_sn2nid(const char *s)
const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, const void *OBJ_bsearch_(const void *key, const void *base, int num, int size,
int (*cmp)(const void *, const void *)) int (*cmp)(const void *, const void *))
{ {
return OBJ_bsearch_ex(key, base, num, size, cmp, 0); return OBJ_bsearch_ex_(key, base, num, size, cmp, 0);
} }
const void *OBJ_bsearch_ex(const void *key, const void *base_, int num, const void *OBJ_bsearch_ex_(const void *key, const void *base_, int num,
int size, int (*cmp)(const void *, const void *), int flags) int size,
int (*cmp)(const void *, const void *),
int flags)
{ {
const char *base=base_; const char *base=base_;
int l,h,i=0,c=0; int l,h,i=0,c=0;
......
...@@ -1013,9 +1013,10 @@ int OBJ_sn2nid(const char *s); ...@@ -1013,9 +1013,10 @@ int OBJ_sn2nid(const char *s);
int OBJ_cmp(const ASN1_OBJECT *a,const ASN1_OBJECT *b); int OBJ_cmp(const ASN1_OBJECT *a,const ASN1_OBJECT *b);
const void * OBJ_bsearch_(const void *key,const void *base,int num,int size, const void * OBJ_bsearch_(const void *key,const void *base,int num,int size,
int (*cmp)(const void *, const void *)); int (*cmp)(const void *, const void *));
const void * OBJ_bsearch_ex(const void *key,const void *base,int num, const void * OBJ_bsearch_ex_(const void *key,const void *base,int num,
int size, int (*cmp)(const void *, const void *), int size,
int flags); int (*cmp)(const void *, const void *),
int flags);
#define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, cmp) \ #define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, cmp) \
scope type1 *cmp##_type_1; \ scope type1 *cmp##_type_1; \
...@@ -1074,6 +1075,13 @@ const void * OBJ_bsearch_ex(const void *key,const void *base,int num, ...@@ -1074,6 +1075,13 @@ const void * OBJ_bsearch_ex(const void *key,const void *base,int num,
cmp##_type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \ cmp##_type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \
cmp##_BSEARCH_CMP_FN))) cmp##_BSEARCH_CMP_FN)))
#define OBJ_bsearch_ex(type1,key,type2,base,num,cmp,flags) \
((type2 *)OBJ_bsearch_(CHECKED_PTR_OF(type1,key),CHECKED_PTR_OF(type2,base), \
num,sizeof(type2), \
(cmp##_type_1=CHECKED_PTR_OF(type1,cmp##_type_1), \
cmp##_type_2=CHECKED_PTR_OF(type2,cmp##_type_2), \
cmp##_BSEARCH_CMP_FN)),flags)
int OBJ_new_nid(int num); int OBJ_new_nid(int num);
int OBJ_add_object(const ASN1_OBJECT *obj); int OBJ_add_object(const ASN1_OBJECT *obj);
int OBJ_create(const char *oid,const char *sn,const char *ln); int OBJ_create(const char *oid,const char *sn,const char *ln);
......
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
((void (*)(void *)) ((1 ? p : (void (*)(type))0))) ((void (*)(void *)) ((1 ? p : (void (*)(type))0)))
#define CHECKED_SK_CMP_FUNC(type, p) \ #define CHECKED_SK_CMP_FUNC(type, p) \
((int (*)(const void * const *, const void * const *)) \ ((int (*)(const void *, const void *)) \
((1 ? p : (int (*)(const type * const *, const type * const *))0))) ((1 ? p : (int (*)(const type * const *, const type * const *))0)))
#define STACK_OF(type) struct stack_st_##type #define STACK_OF(type) struct stack_st_##type
......
...@@ -77,11 +77,10 @@ const char STACK_version[]="Stack" OPENSSL_VERSION_PTEXT; ...@@ -77,11 +77,10 @@ const char STACK_version[]="Stack" OPENSSL_VERSION_PTEXT;
#include <errno.h> #include <errno.h>
int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void * const *, int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void *, const void *)))
const void * const *))) (const void *, const void *)
(const void * const *, const void * const *)
{ {
int (*old)(const void * const *,const void * const *)=sk->comp; int (*old)(const void *,const void *)=sk->comp;
if (sk->comp != c) if (sk->comp != c)
sk->sorted=0; sk->sorted=0;
...@@ -115,10 +114,10 @@ err: ...@@ -115,10 +114,10 @@ err:
_STACK *sk_new_null(void) _STACK *sk_new_null(void)
{ {
return sk_new((int (*)(const void * const *, const void * const *))0); return sk_new((int (*)(const void *, const void *))0);
} }
_STACK *sk_new(int (*c)(const void * const *, const void * const *)) _STACK *sk_new(int (*c)(const void *, const void *))
{ {
_STACK *ret; _STACK *ret;
int i; int i;
...@@ -213,9 +212,9 @@ void *sk_delete(_STACK *st, int loc) ...@@ -213,9 +212,9 @@ void *sk_delete(_STACK *st, int loc)
static int internal_find(_STACK *st, void *data, int ret_val_options) static int internal_find(_STACK *st, void *data, int ret_val_options)
{ {
char **r; const void * const *r;
int i; int i;
int (*comp_func)(const void *,const void *);
if(st == NULL) return -1; if(st == NULL) return -1;
if (st->comp == NULL) if (st->comp == NULL)
...@@ -227,17 +226,10 @@ static int internal_find(_STACK *st, void *data, int ret_val_options) ...@@ -227,17 +226,10 @@ static int internal_find(_STACK *st, void *data, int ret_val_options)
} }
sk_sort(st); sk_sort(st);
if (data == NULL) return(-1); if (data == NULL) return(-1);
/* This (and the "qsort" below) are the two places in OpenSSL r=OBJ_bsearch_ex_(&data,st->data,st->num,sizeof(void *),st->comp,
* where we need to convert from our standard (type **,type **) ret_val_options);
* compare callback type to the (void *,void *) type required by
* bsearch. However, the "data" it is being called(back) with are
* not (type *) pointers, but the *pointers* to (type *) pointers,
* so we get our extra level of pointer dereferencing that way. */
comp_func=(int (*)(const void *,const void *))(st->comp);
r=(char **)OBJ_bsearch_ex((char *)&data,(char *)st->data,
st->num,sizeof(char *),comp_func,ret_val_options);
if (r == NULL) return(-1); if (r == NULL) return(-1);
return((int)(r-st->data)); return (int)((char **)r-st->data);
} }
int sk_find(_STACK *st, void *data) int sk_find(_STACK *st, void *data)
......
...@@ -70,7 +70,7 @@ typedef struct stack_st ...@@ -70,7 +70,7 @@ typedef struct stack_st
int sorted; int sorted;
int num_alloc; int num_alloc;
int (*comp)(const void * const *, const void * const *); int (*comp)(const void *, const void *);
} _STACK; /* Use STACK_OF(...) instead */ } _STACK; /* Use STACK_OF(...) instead */
#define M_sk_num(sk) ((sk) ? (sk)->num:-1) #define M_sk_num(sk) ((sk) ? (sk)->num:-1)
...@@ -81,7 +81,7 @@ void *sk_value(const _STACK *, int); ...@@ -81,7 +81,7 @@ void *sk_value(const _STACK *, int);
void *sk_set(_STACK *, int, void *); void *sk_set(_STACK *, int, void *);
_STACK *sk_new(int (*cmp)(const void * const *, const void * const *)); _STACK *sk_new(int (*cmp)(const void *, const void *));
_STACK *sk_new_null(void); _STACK *sk_new_null(void);
void sk_free(_STACK *); void sk_free(_STACK *);
void sk_pop_free(_STACK *st, void (*func)(void *)); void sk_pop_free(_STACK *st, void (*func)(void *));
...@@ -95,9 +95,8 @@ int sk_unshift(_STACK *st, void *data); ...@@ -95,9 +95,8 @@ int sk_unshift(_STACK *st, void *data);
void *sk_shift(_STACK *st); void *sk_shift(_STACK *st);
void *sk_pop(_STACK *st); void *sk_pop(_STACK *st);
void sk_zero(_STACK *st); void sk_zero(_STACK *st);
int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void * const *, int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void *, const void *)))
const void * const *))) (const void *, const void *);
(const void * const *, const void * const *);
_STACK *sk_dup(_STACK *st); _STACK *sk_dup(_STACK *st);
void sk_sort(_STACK *st); void sk_sort(_STACK *st);
int sk_is_sorted(const _STACK *st); int sk_is_sorted(const _STACK *st);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册