Commit 6385fc5ff5d669d3ec99d89f19c5860cf53011ba

Nico von Geyso 2013-03-17T20:39:01

added new type and several functions to git_strmap This step is needed to easily add iterators to git_config_backend As well use these new git_strmap functions to implement foreach * git_strmap_iter * git_strmap_has_data(...) * git_strmap_begin(...) * git_strmap_end(...) * git_strmap_next(...)

diff --git a/src/config_file.c b/src/config_file.c
index 570f286..088f619 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 0000000..1b07359
--- /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 44176a0..cb079b5 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