diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2008-10-22 15:43:01 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2008-10-22 15:43:01 +0000 |
commit | e19106f5fb7da7db15449a9a50f9be9047800757 (patch) | |
tree | 0341d860168821112fb47ded07b1f761895c04cd /crypto/objects/objects.h | |
parent | ae7ec4c71de74fa52c5d89e32e28445c6602990d (diff) |
Create function of the form OBJ_bsearch_xxx() in bsearch typesafe macros
with the appropriate parameters which calls OBJ_bsearch(). A compiler will
typically inline this.
This avoids the need for cmp_xxx variables and fixes unchecked const issues
with CHECKED_PTR_OF()
Diffstat (limited to 'crypto/objects/objects.h')
-rw-r--r-- | crypto/objects/objects.h | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/crypto/objects/objects.h b/crypto/objects/objects.h index 3e6d71021b..65b6f01358 100644 --- a/crypto/objects/objects.h +++ b/crypto/objects/objects.h @@ -1018,16 +1018,15 @@ const void * OBJ_bsearch_ex_(const void *key,const void *base,int num, int (*cmp)(const void *, const void *), int flags); -#define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, cmp) \ - scope type1 *cmp##_type_1; \ - scope type2 *cmp##_type_2; \ - scope int cmp##_BSEARCH_CMP_FN(const void *, const void *); \ - scope int cmp(type1 const *, type2 const *) +#define _DECLARE_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *, const void *); \ + static int nm##_cmp(type1 const *, type2 const *); \ + scope type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) #define DECLARE_OBJ_BSEARCH_CMP_FN(type1, type2, cmp) \ _DECLARE_OBJ_BSEARCH_CMP_FN(static, type1, type2, cmp) -#define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, cmp) \ - _DECLARE_OBJ_BSEARCH_CMP_FN(, type1, type2, cmp) +#define DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(type1, type2, nm) \ + type2 * OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) /* * Unsolved problem: if a type is actually a pointer type, like @@ -1055,12 +1054,17 @@ const void * OBJ_bsearch_ex_(const void *key,const void *base,int num, * the non-constness means a lot of complication, and in practice * comparison routines do always not touch their arguments. */ -#define _IMPLEMENT_OBJ_BSEARCH_CMP_FN(scope, type1, type2, cmp) \ - scope int cmp##_BSEARCH_CMP_FN(const void *a_, const void *b_) \ +#define _IMPLEMENT_OBJ_BSEARCH_CMP_FN(scope, type1, type2, nm) \ + static int nm##_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) \ { \ type1 const *a = a_; \ type2 const *b = b_; \ - return cmp(a,b); \ + return nm##_cmp(a,b); \ + } \ + scope type2 *OBJ_bsearch_##nm(type1 *key, type2 const *base, int num) \ + { \ + return (type2 *)OBJ_bsearch_(key, base, num, sizeof(type2), \ + nm##_cmp_BSEARCH_CMP_FN); \ } \ extern void dummy_prototype(void) |