File Coverage

deps/libgit2/src/idxmap.c
Criterion Covered Total %
statement 37 91 40.6
branch 82 212 38.6
condition n/a
subroutine n/a
pod n/a
total 119 303 39.2


line stmt bran cond sub pod time code
1             /*
2             * Copyright (C) the libgit2 contributors. All rights reserved.
3             *
4             * This file is part of libgit2, distributed under the GNU GPL v2 with
5             * a Linking Exception. For full terms see the included COPYING file.
6             */
7              
8             #include "idxmap.h"
9              
10             #define kmalloc git__malloc
11             #define kcalloc git__calloc
12             #define krealloc git__realloc
13             #define kreallocarray git__reallocarray
14             #define kfree git__free
15             #include "khash.h"
16              
17             __KHASH_TYPE(idx, const git_index_entry *, git_index_entry *)
18             __KHASH_TYPE(idxicase, const git_index_entry *, git_index_entry *)
19              
20             /* This is __ac_X31_hash_string but with tolower and it takes the entry's stage into account */
21 589           static kh_inline khint_t idxentry_hash(const git_index_entry *e)
22             {
23 589           const char *s = e->path;
24 589           khint_t h = (khint_t)git__tolower(*s);
25 4733 50         if (h) for (++s ; *s; ++s) h = (h << 5) - h + (khint_t)git__tolower(*s);
    100          
26 589           return h + GIT_INDEX_ENTRY_STAGE(e);
27             }
28              
29             #define idxentry_equal(a, b) (GIT_INDEX_ENTRY_STAGE(a) == GIT_INDEX_ENTRY_STAGE(b) && strcmp(a->path, b->path) == 0)
30             #define idxentry_icase_equal(a, b) (GIT_INDEX_ENTRY_STAGE(a) == GIT_INDEX_ENTRY_STAGE(b) && strcasecmp(a->path, b->path) == 0)
31              
32 1926 50         __KHASH_IMPL(idx, static kh_inline, const git_index_entry *, git_index_entry *, 1, idxentry_hash, idxentry_equal)
    50          
    100          
    100          
    50          
    50          
    100          
    100          
    50          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    100          
    100          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    100          
    50          
33 0 0         __KHASH_IMPL(idxicase, static kh_inline, const git_index_entry *, git_index_entry *, 1, idxentry_hash, idxentry_icase_equal)
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
34              
35 54           int git_idxmap_new(git_idxmap **out)
36             {
37 54           *out = kh_init(idx);
38 54 50         GIT_ERROR_CHECK_ALLOC(*out);
39              
40 54           return 0;
41             }
42              
43 0           int git_idxmap_icase_new(git_idxmap_icase **out)
44             {
45 0           *out = kh_init(idxicase);
46 0 0         GIT_ERROR_CHECK_ALLOC(*out);
47              
48 0           return 0;
49             }
50              
51 54           void git_idxmap_free(git_idxmap *map)
52             {
53 54           kh_destroy(idx, map);
54 54           }
55              
56 0           void git_idxmap_icase_free(git_idxmap_icase *map)
57             {
58 0           kh_destroy(idxicase, map);
59 0           }
60              
61 71           void git_idxmap_clear(git_idxmap *map)
62             {
63 71           kh_clear(idx, map);
64 71           }
65              
66 0           void git_idxmap_icase_clear(git_idxmap_icase *map)
67             {
68 0           kh_clear(idxicase, map);
69 0           }
70              
71 43           int git_idxmap_resize(git_idxmap *map, size_t size)
72             {
73 86           if (!git__is_uint32(size) ||
74 43           kh_resize(idx, map, (khiter_t)size) < 0) {
75 0           git_error_set_oom();
76 0           return -1;
77             }
78 43           return 0;
79             }
80              
81 0           int git_idxmap_icase_resize(git_idxmap_icase *map, size_t size)
82             {
83 0           if (!git__is_uint32(size) ||
84 0           kh_resize(idxicase, map, (khiter_t)size) < 0) {
85 0           git_error_set_oom();
86 0           return -1;
87             }
88 0           return 0;
89             }
90              
91 170           void *git_idxmap_get(git_idxmap *map, const git_index_entry *key)
92             {
93 170           size_t idx = kh_get(idx, map, key);
94 170 100         if (idx == kh_end(map) || !kh_exist(map, idx))
    50          
95 23           return NULL;
96 147           return kh_val(map, idx);
97             }
98              
99 173           int git_idxmap_set(git_idxmap *map, const git_index_entry *key, void *value)
100             {
101             size_t idx;
102             int rval;
103              
104 173           idx = kh_put(idx, map, key, &rval);
105 173 50         if (rval < 0)
106 0           return -1;
107              
108 173 50         if (rval == 0)
109 0           kh_key(map, idx) = key;
110              
111 173           kh_val(map, idx) = value;
112              
113 173           return 0;
114             }
115              
116 0           int git_idxmap_icase_set(git_idxmap_icase *map, const git_index_entry *key, void *value)
117             {
118             size_t idx;
119             int rval;
120              
121 0           idx = kh_put(idxicase, map, key, &rval);
122 0 0         if (rval < 0)
123 0           return -1;
124              
125 0 0         if (rval == 0)
126 0           kh_key(map, idx) = key;
127              
128 0           kh_val(map, idx) = value;
129              
130 0           return 0;
131             }
132              
133 0           void *git_idxmap_icase_get(git_idxmap_icase *map, const git_index_entry *key)
134             {
135 0           size_t idx = kh_get(idxicase, map, key);
136 0 0         if (idx == kh_end(map) || !kh_exist(map, idx))
    0          
137 0           return NULL;
138 0           return kh_val(map, idx);
139             }
140              
141 0           void git_idxmap_insert(git_idxmap *map, const git_index_entry *key, void *value, int *rval)
142             {
143 0           khiter_t idx = kh_put(idx, map, key, rval);
144              
145 0 0         if ((*rval) >= 0) {
146 0 0         if ((*rval) == 0)
147 0           kh_key(map, idx) = key;
148 0           kh_val(map, idx) = value;
149             }
150 0           }
151              
152 0           void git_idxmap_icase_insert(git_idxmap_icase *map, const git_index_entry *key, void *value, int *rval)
153             {
154 0           khiter_t idx = kh_put(idxicase, map, key, rval);
155              
156 0 0         if ((*rval) >= 0) {
157 0 0         if ((*rval) == 0)
158 0           kh_key(map, idx) = key;
159 0           kh_val(map, idx) = value;
160             }
161 0           }
162              
163 217           int git_idxmap_delete(git_idxmap *map, const git_index_entry *key)
164             {
165 217           khiter_t idx = kh_get(idx, map, key);
166 217 100         if (idx == kh_end(map))
167 190           return GIT_ENOTFOUND;
168 27           kh_del(idx, map, idx);
169 27           return 0;
170             }
171              
172 0           int git_idxmap_icase_delete(git_idxmap_icase *map, const git_index_entry *key)
173             {
174 0           khiter_t idx = kh_get(idxicase, map, key);
175 0 0         if (idx == kh_end(map))
176 0           return GIT_ENOTFOUND;
177 0           kh_del(idxicase, map, idx);
178 0           return 0;
179             }