summaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/src/tree.c b/src/tree.c
index ad9643f69..de557d2ae 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -37,29 +37,29 @@ static int valid_attributes(const int attributes) {
return attributes >= 0 && attributes <= MAX_FILEMODE;
}
+struct tree_key_search {
+ const char *filename;
+ size_t filename_len;
+};
+
int entry_search_cmp(const void *key, const void *array_member)
{
- const char *filename = (const char *)key;
+ struct tree_key_search *ksearch = (struct tree_key_search *)key;
const git_tree_entry *entry = (const git_tree_entry *)(array_member);
- return strcmp(filename, entry->filename);
-}
-
-#if 0
-static int valid_attributes(const int attributes) {
- return attributes >= 0 && attributes <= MAX_FILEMODE;
+ return git_futils_cmp_path(
+ ksearch->filename, ksearch->filename_len, entry->attr & 040000,
+ entry->filename, entry->filename_len, entry->attr & 040000);
}
-#endif
int entry_sort_cmp(const void *a, const void *b)
{
const git_tree_entry *entry_a = (const git_tree_entry *)(a);
const git_tree_entry *entry_b = (const git_tree_entry *)(b);
- return git_futils_cmp_path(entry_a->filename, strlen(entry_a->filename),
- entry_a->attr & 040000,
- entry_b->filename, strlen(entry_b->filename),
- entry_b->attr & 040000);
+ return git_futils_cmp_path(
+ entry_a->filename, entry_a->filename_len, entry_a->attr & 040000,
+ entry_b->filename, entry_b->filename_len, entry_b->attr & 040000);
}
void git_tree__free(git_tree *tree)
@@ -121,10 +121,14 @@ int git_tree_entry_2object(git_object **object_out, git_repository *repo, const
const git_tree_entry *git_tree_entry_byname(git_tree *tree, const char *filename)
{
int idx;
+ struct tree_key_search ksearch;
assert(tree && filename);
- idx = git_vector_bsearch2(&tree->entries, entry_search_cmp, filename);
+ ksearch.filename = filename;
+ ksearch.filename_len = strlen(filename);
+
+ idx = git_vector_bsearch2(&tree->entries, entry_search_cmp, &ksearch);
if (idx == GIT_ENOTFOUND)
return NULL;
@@ -351,13 +355,17 @@ int git_treebuilder_insert(git_tree_entry **entry_out, git_treebuilder *bld, con
{
git_tree_entry *entry;
int pos;
+ struct tree_key_search ksearch;
assert(bld && id && filename);
if (!valid_attributes(attributes))
return git__throw(GIT_ERROR, "Failed to insert entry. Invalid atrributes");
- if ((pos = git_vector_bsearch2(&bld->entries, entry_search_cmp, filename)) != GIT_ENOTFOUND) {
+ ksearch.filename = filename;
+ ksearch.filename_len = strlen(filename);
+
+ if ((pos = git_vector_bsearch2(&bld->entries, entry_search_cmp, &ksearch)) != GIT_ENOTFOUND) {
entry = git_vector_get(&bld->entries, pos);
if (entry->removed) {
entry->removed = 0;
@@ -392,11 +400,15 @@ const git_tree_entry *git_treebuilder_get(git_treebuilder *bld, const char *file
{
int idx;
git_tree_entry *entry;
+ struct tree_key_search ksearch;
assert(bld && filename);
+ ksearch.filename = filename;
+ ksearch.filename_len = strlen(filename);
+
sort_entries(bld);
- idx = git_vector_bsearch2(&bld->entries, entry_search_cmp, filename);
+ idx = git_vector_bsearch2(&bld->entries, entry_search_cmp, &ksearch);
if (idx == GIT_ENOTFOUND)
return NULL;