/src/openssl/crypto/bsearch.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. |
3 | | * |
4 | | * Licensed under the Apache License 2.0 (the "License"). You may not use |
5 | | * this file except in compliance with the License. You can obtain a copy |
6 | | * in the file LICENSE in the source distribution or at |
7 | | * https://www.openssl.org/source/license.html |
8 | | */ |
9 | | |
10 | | #include <stddef.h> |
11 | | #include "internal/cryptlib.h" |
12 | | |
13 | | const void *ossl_bsearch(const void *key, const void *base, int num, |
14 | | int size, int (*cmp) (const void *, const void *), |
15 | | int flags) |
16 | 3.73M | { |
17 | 3.73M | const char *base_ = base; |
18 | 3.73M | int l, h, i = 0, c = 0; |
19 | 3.73M | const char *p = NULL; |
20 | | |
21 | 3.73M | if (num == 0) |
22 | 0 | return NULL; |
23 | 3.73M | l = 0; |
24 | 3.73M | h = num; |
25 | 32.6M | while (l < h) { |
26 | 31.1M | i = (l + h) / 2; |
27 | 31.1M | p = &(base_[i * size]); |
28 | 31.1M | c = (*cmp) (key, p); |
29 | 31.1M | if (c < 0) |
30 | 16.4M | h = i; |
31 | 14.6M | else if (c > 0) |
32 | 12.4M | l = i + 1; |
33 | 2.24M | else |
34 | 2.24M | break; |
35 | 31.1M | } |
36 | 3.73M | if (c != 0 && !(flags & OSSL_BSEARCH_VALUE_ON_NOMATCH)) |
37 | 1.49M | p = NULL; |
38 | 2.24M | else if (c == 0 && (flags & OSSL_BSEARCH_FIRST_VALUE_ON_MATCH)) { |
39 | 0 | while (i > 0 && (*cmp) (key, &(base_[(i - 1) * size])) == 0) |
40 | 0 | i--; |
41 | 0 | p = &(base_[i * size]); |
42 | 0 | } |
43 | 3.73M | return p; |
44 | 3.73M | } |