summaryrefslogtreecommitdiff
path: root/src/iterator.h
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-01-08 15:53:13 -0800
committerRussell Belfer <rb@github.com>2013-01-15 09:51:34 -0800
commit134d8c918c3430b19b75f45b1e490ce2aae526ff (patch)
tree73c79fc8d49d494c49e2fe034f3e30d167f7326e /src/iterator.h
parent5c8bb98ce9c4e5bb6527c8ffc274c8b3e0755fa7 (diff)
downloadlibgit2-134d8c918c3430b19b75f45b1e490ce2aae526ff.tar.gz
Update iterator API with flags for ignore_case
This changes the iterator API so that flags can be passed in to the constructor functions to control the ignore_case behavior. At this point, the flags are not supported on tree iterators (i.e. there is no functional change over the old API), but the API changes are all made to accomodate this. By the way, I went with a flags parameter because in the future I have a couple of other ideas for iterator flags that will make it easier to fix some diff/status/checkout bugs.
Diffstat (limited to 'src/iterator.h')
-rw-r--r--src/iterator.h66
1 files changed, 52 insertions, 14 deletions
diff --git a/src/iterator.h b/src/iterator.h
index 727da97b3..67e8a42dd 100644
--- a/src/iterator.h
+++ b/src/iterator.h
@@ -12,20 +12,26 @@
#include "vector.h"
#include "buffer.h"
-#define ITERATOR_PREFIXCMP(ITER, STR, PREFIX) (((ITER).ignore_case) ? \
+#define ITERATOR_PREFIXCMP(ITER, STR, PREFIX) \
+ (((ITER).flags & GIT_ITERATOR_IGNORE_CASE) != 0 ? \
git__prefixcmp_icase((STR), (PREFIX)) : \
git__prefixcmp((STR), (PREFIX)))
typedef struct git_iterator git_iterator;
typedef enum {
- GIT_ITERATOR_EMPTY = 0,
- GIT_ITERATOR_TREE = 1,
- GIT_ITERATOR_INDEX = 2,
- GIT_ITERATOR_WORKDIR = 3,
- GIT_ITERATOR_SPOOLANDSORT = 4
+ GIT_ITERATOR_TYPE_EMPTY = 0,
+ GIT_ITERATOR_TYPE_TREE = 1,
+ GIT_ITERATOR_TYPE_INDEX = 2,
+ GIT_ITERATOR_TYPE_WORKDIR = 3,
+ GIT_ITERATOR_TYPE_SPOOLANDSORT = 4
} git_iterator_type_t;
+typedef enum {
+ GIT_ITERATOR_IGNORE_CASE = (1 << 0), /* ignore_case */
+ GIT_ITERATOR_DONT_IGNORE_CASE = (1 << 1), /* force ignore_case off */
+} git_iterator_flag_t;
+
typedef struct {
int (*current)(git_iterator *, const git_index_entry **);
int (*at_end)(git_iterator *);
@@ -41,33 +47,55 @@ struct git_iterator {
git_repository *repo;
char *start;
char *end;
- bool ignore_case;
+ unsigned int flags;
};
-extern int git_iterator_for_nothing(git_iterator **out);
+extern int git_iterator_for_nothing(
+ git_iterator **out, git_iterator_flag_t flags);
+/* tree iterators will match the ignore_case value from the index of the
+ * repository, unless you override with a non-zero flag value
+ */
extern int git_iterator_for_tree_range(
- git_iterator **out, git_tree *tree, const char *start, const char *end);
+ git_iterator **out,
+ git_tree *tree,
+ git_iterator_flag_t flags,
+ const char *start,
+ const char *end);
GIT_INLINE(int) git_iterator_for_tree(git_iterator **out, git_tree *tree)
{
- return git_iterator_for_tree_range(out, tree, NULL, NULL);
+ return git_iterator_for_tree_range(out, tree, 0, NULL, NULL);
}
+/* index iterators will take the ignore_case value from the index; the
+ * ignore_case flags are not used
+ */
extern int git_iterator_for_index_range(
- git_iterator **out, git_index *index, const char *start, const char *end);
+ git_iterator **out,
+ git_index *index,
+ git_iterator_flag_t flags,
+ const char *start,
+ const char *end);
GIT_INLINE(int) git_iterator_for_index(git_iterator **out, git_index *index)
{
- return git_iterator_for_index_range(out, index, NULL, NULL);
+ return git_iterator_for_index_range(out, index, 0, NULL, NULL);
}
+/* workdir iterators will match the ignore_case value from the index of the
+ * repository, unless you override with a non-zero flag value
+ */
extern int git_iterator_for_workdir_range(
- git_iterator **out, git_repository *repo, const char *start, const char *end);
+ git_iterator **out,
+ git_repository *repo,
+ git_iterator_flag_t flags,
+ const char *start,
+ const char *end);
GIT_INLINE(int) git_iterator_for_workdir(git_iterator **out, git_repository *repo)
{
- return git_iterator_for_workdir_range(out, repo, NULL, NULL);
+ return git_iterator_for_workdir_range(out, repo, 0, NULL, NULL);
}
extern void git_iterator_free(git_iterator *iter);
@@ -127,6 +155,16 @@ GIT_INLINE(git_repository *) git_iterator_owner(git_iterator *iter)
return iter->repo;
}
+GIT_INLINE(git_iterator_flag_t) git_iterator_flags(git_iterator *iter)
+{
+ return iter->flags;
+}
+
+GIT_INLINE(bool) git_iterator_ignore_case(git_iterator *iter)
+{
+ return ((iter->flags & GIT_ITERATOR_IGNORE_CASE) != 0);
+}
+
extern int git_iterator_current_tree_entry(
git_iterator *iter, const git_tree_entry **tree_entry);