diff options
| author | Carlos Martín Nieto <carlosmn@github.com> | 2016-04-12 00:18:17 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <carlosmn@github.com> | 2016-04-12 00:18:17 +0200 |
| commit | 211e117a0590583a720c53172406f34186c543bd (patch) | |
| tree | f9df7f4049a0fbc67ce6d725d83e3bb0b4d79a1e /src/array.h | |
| parent | 785d8c48ea8725691da3c50e7dae8751523d4c30 (diff) | |
| parent | 8edadbf97889fbd80289a72209fdd485ddea3521 (diff) | |
| download | libgit2-0.24.1.tar.gz | |
Merge pull request #3739 from ethomson/0.24.1v0.24.1
Backport bug fixes to 0.24
Diffstat (limited to 'src/array.h')
| -rw-r--r-- | src/array.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/array.h b/src/array.h index 7cd9b7153..490e6be20 100644 --- a/src/array.h +++ b/src/array.h @@ -82,4 +82,44 @@ on_oom: #define git_array_valid_index(a, i) ((i) < (a).size) +#define git_array_foreach(a, i, element) \ + for ((i) = 0; (i) < (a).size && ((element) = &(a).ptr[(i)]); (i)++) + + +GIT_INLINE(int) git_array__search( + size_t *out, + void *array_ptr, + size_t item_size, + size_t array_len, + int (*compare)(const void *, const void *), + const void *key) +{ + size_t lim; + unsigned char *part, *array = array_ptr, *base = array_ptr; + int cmp; + + for (lim = array_len; lim != 0; lim >>= 1) { + part = base + (lim >> 1) * item_size; + cmp = (*compare)(key, part); + + if (cmp == 0) { + base = part; + break; + } + if (cmp > 0) { /* key > p; take right partition */ + base = part + 1 * item_size; + lim--; + } /* else take left partition */ + } + + if (out) + *out = (base - array) / item_size; + + return (cmp == 0) ? 0 : GIT_ENOTFOUND; +} + +#define git_array_search(out, a, cmp, key) \ + git_array__search(out, (a).ptr, sizeof(*(a).ptr), (a).size, \ + (cmp), (key)) + #endif |
