summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/config_file.c5
-rw-r--r--src/strmap.c34
-rw-r--r--src/strmap.h12
3 files changed, 49 insertions, 2 deletions
diff --git a/src/config_file.c b/src/config_file.c
index 570f286c8..088f6190d 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -270,7 +270,8 @@ static int file_foreach(
}
}
- git_strmap_foreach(b->values, key, var,
+ git_strmap_iter iter = git_strmap_begin(b->values);
+ while (!(git_strmap_next(&key, (void**) &var, &iter, b->values) < 0)) {
for (; var != NULL; var = next_var) {
next_var = CVAR_LIST_NEXT(var);
@@ -285,7 +286,7 @@ static int file_foreach(
goto cleanup;
}
}
- );
+ }
cleanup:
if (regexp != NULL)
diff --git a/src/strmap.c b/src/strmap.c
new file mode 100644
index 000000000..1b07359d1
--- /dev/null
+++ b/src/strmap.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
+
+#include "strmap.h"
+
+int git_strmap_next(
+ const char **key,
+ void **data,
+ git_strmap_iter* iter,
+ git_strmap *map)
+{
+ if (!map)
+ return GIT_ERROR;
+
+ while (*iter != git_strmap_end(map)) {
+ if (!(git_strmap_has_data(map, *iter))) {
+ ++(*iter);
+ continue;
+ }
+
+ *key = git_strmap_key(map, *iter);
+ *data = git_strmap_value_at(map, *iter);
+
+ ++(*iter);
+
+ return GIT_OK;
+ }
+
+ return GIT_ITEROVER;
+}
diff --git a/src/strmap.h b/src/strmap.h
index 44176a0fc..cb079b500 100644
--- a/src/strmap.h
+++ b/src/strmap.h
@@ -17,6 +17,7 @@
__KHASH_TYPE(str, const char *, void *);
typedef khash_t(str) git_strmap;
+typedef khiter_t git_strmap_iter;
#define GIT__USE_STRMAP \
__KHASH_IMPL(str, static kh_inline, const char *, void *, 1, kh_str_hash_func, kh_str_hash_equal)
@@ -31,7 +32,9 @@ typedef khash_t(str) git_strmap;
#define git_strmap_valid_index(h, idx) (idx != kh_end(h))
#define git_strmap_exists(h, k) (kh_get(str, h, k) != kh_end(h))
+#define git_strmap_has_data(h, idx) kh_exist(h, idx)
+#define git_strmap_key(h, idx) kh_key(h, idx)
#define git_strmap_value_at(h, idx) kh_val(h, idx)
#define git_strmap_set_value_at(h, idx, v) kh_val(h, idx) = v
#define git_strmap_delete_at(h, idx) kh_del(str, h, idx)
@@ -61,4 +64,13 @@ typedef khash_t(str) git_strmap;
#define git_strmap_foreach kh_foreach
#define git_strmap_foreach_value kh_foreach_value
+#define git_strmap_begin kh_begin
+#define git_strmap_end kh_end
+
+int git_strmap_next(
+ const char **key,
+ void **data,
+ git_strmap_iter* iter,
+ git_strmap *map);
+
#endif