diff options
Diffstat (limited to 'src/iterator.h')
-rw-r--r-- | src/iterator.h | 66 |
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); |