diff options
author | Richard Levitte <levitte@openssl.org> | 2019-05-08 10:40:20 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2019-05-08 16:17:16 +0200 |
commit | 5c3f1e34b559c9b4372bf48aab63b61a6cd5edbb (patch) | |
tree | 3c6d91959d546794e32517dd5adecc8f1bbc0333 /crypto/objects/obj_dat.c | |
parent | 67c81ec311d696464bdbf4c6d6f8a887a3ddf9f8 (diff) |
ossl_bsearch(): New generic internal binary search utility function
OBJ_bsearch_ and OBJ_bsearch_ex_ are generic functions that don't
really belong with the OBJ API, but should rather be generic utility
functions. The ending underscore indicates that they are considered
internal, even though they are declared publicly.
Since crypto/stack/stack.c uses OBJ_bsearch_ex_, the stack API ends up
depending on the OBJ API, which is unnecessary, and carries along
other dependencies.
Therefor, a generic internal function is created, ossl_bsearch().
This removes the unecessary dependencies.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8899)
Diffstat (limited to 'crypto/objects/obj_dat.c')
-rw-r--r-- | crypto/objects/obj_dat.c | 38 |
1 files changed, 9 insertions, 29 deletions
diff --git a/crypto/objects/obj_dat.c b/crypto/objects/obj_dat.c index f374d19fc7..ec9e131337 100644 --- a/crypto/objects/obj_dat.c +++ b/crypto/objects/obj_dat.c @@ -585,52 +585,32 @@ const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, 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) { - const char *base = base_; - int l, h, i = 0, c = 0; - const char *p = NULL; + const char *p = ossl_bsearch(key, base, num, size, cmp, flags); - if (num == 0) - return NULL; - l = 0; - h = num; - while (l < h) { - i = (l + h) / 2; - p = &(base[i * size]); - c = (*cmp) (key, p); - if (c < 0) - h = i; - else if (c > 0) - l = i + 1; - else - break; - } #ifdef CHARSET_EBCDIC /* * THIS IS A KLUDGE - Because the *_obj is sorted in ASCII order, and I * don't have perl (yet), we revert to a *LINEAR* search when the object * wasn't found in the binary search. */ - if (c != 0) { + if (p == NULL) { + const char *base_ = base; + int l, h, i = 0, c = 0; + for (i = 0; i < num; ++i) { - p = &(base[i * size]); + p = &(base_[i * size]); c = (*cmp) (key, p); - if (c == 0 || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH))) + if (c == 0 + || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH))) return p; } } #endif - if (c != 0 && !(flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)) - p = NULL; - else if (c == 0 && (flags & OBJ_BSEARCH_FIRST_VALUE_ON_MATCH)) { - while (i > 0 && (*cmp) (key, &(base[(i - 1) * size])) == 0) - i--; - p = &(base[i * size]); - } return p; } |