Commit 0bfa73234263de03e5f797c2f4c514def145433a

Vicent Marti 2013-11-01T17:07:44

iconv: Do not fake an API when iconv is not available

diff --git a/src/path.c b/src/path.c
index d45751c..750dd3e 100644
--- a/src/path.c
+++ b/src/path.c
@@ -834,7 +834,12 @@ int git_path_direach(
 	DIR *dir;
 	path_dirent_data de_data;
 	struct dirent *de, *de_buf = (struct dirent *)&de_data;
+
+	(void)flags;
+
+#ifdef GIT_USE_ICONV
 	git_path_iconv_t ic = GIT_PATH_ICONV_INIT;
+#endif
 
 	if (git_path_to_dir(path) < 0)
 		return -1;
@@ -846,8 +851,10 @@ int git_path_direach(
 		return -1;
 	}
 
+#ifdef GIT_USE_ICONV
 	if ((flags & GIT_PATH_DIR_PRECOMPOSE_UNICODE) != 0)
 		(void)git_path_iconv_init_precompose(&ic);
+#endif
 
 	while (p_readdir_r(dir, de_buf, &de) == 0 && de != NULL) {
 		char *de_path = de->d_name;
@@ -856,8 +863,12 @@ int git_path_direach(
 		if (git_path_is_dot_or_dotdot(de_path))
 			continue;
 
-		if ((error = git_path_iconv(&ic, &de_path, &de_len)) < 0 ||
-			(error = git_buf_put(path, de_path, de_len)) < 0)
+#ifdef GIT_USE_ICONV
+		if ((error = git_path_iconv(&ic, &de_path, &de_len)) < 0)
+			break;
+#endif
+				
+		if ((error = git_buf_put(path, de_path, de_len)) < 0)
 			break;
 
 		error = fn(arg, path);
@@ -871,7 +882,10 @@ int git_path_direach(
 	}
 
 	closedir(dir);
+
+#ifdef GIT_USE_ICONV
 	git_path_iconv_clear(&ic);
+#endif
 
 	return error;
 }
@@ -888,7 +902,12 @@ int git_path_dirload(
 	size_t path_len;
 	path_dirent_data de_data;
 	struct dirent *de, *de_buf = (struct dirent *)&de_data;
+
+	(void)flags;
+
+#ifdef GIT_USE_ICONV
 	git_path_iconv_t ic = GIT_PATH_ICONV_INIT;
+#endif
 
 	assert(path && contents);
 
@@ -903,8 +922,10 @@ int git_path_dirload(
 		return -1;
 	}
 
+#ifdef GIT_USE_ICONV
 	if ((flags & GIT_PATH_DIR_PRECOMPOSE_UNICODE) != 0)
 		(void)git_path_iconv_init_precompose(&ic);
+#endif
 
 	path += prefix_len;
 	path_len -= prefix_len;
@@ -917,8 +938,10 @@ int git_path_dirload(
 		if (git_path_is_dot_or_dotdot(de_path))
 			continue;
 
+#ifdef GIT_USE_ICONV
 		if ((error = git_path_iconv(&ic, &de_path, &de_len)) < 0)
 			break;
+#endif
 
 		alloc_size = path_len + need_slash + de_len + 1 + alloc_extra;
 		if ((entry_path = git__calloc(alloc_size, 1)) == NULL) {
@@ -937,7 +960,10 @@ int git_path_dirload(
 	}
 
 	closedir(dir);
+
+#ifdef GIT_USE_ICONV
 	git_path_iconv_clear(&ic);
+#endif
 
 	if (error != 0)
 		giterr_set(GITERR_OS, "Failed to process directory entry in '%s'", path);
diff --git a/src/path.h b/src/path.h
index 17f4f77..3daafd2 100644
--- a/src/path.h
+++ b/src/path.h
@@ -425,16 +425,6 @@ extern void git_path_iconv_clear(git_path_iconv_t *ic);
  */
 extern int git_path_iconv(git_path_iconv_t *ic, char **in, size_t *inlen);
 
-#else
-
-typedef struct {
-	int unused;
-} git_path_iconv_t;
-#define GIT_PATH_ICONV_INIT { 0 }
-#define git_path_iconv_init_precompose(X) 0
-#define git_path_iconv_clear(X) (void)(X)
-#define git_path_iconv(X,Y,Z) 0
-
 #endif /* GIT_USE_ICONV */
 
 #endif
diff --git a/src/refs.c b/src/refs.c
index 269c5f5..472a798 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -737,7 +737,10 @@ int git_reference__normalize_name(
 	int segment_len, segments_count = 0, error = GIT_EINVALIDSPEC;
 	unsigned int process_flags;
 	bool normalize = (buf != NULL);
+
+#ifdef GIT_USE_ICONV
 	git_path_iconv_t ic = GIT_PATH_ICONV_INIT;
+#endif
 
 	assert(name);
 
@@ -750,6 +753,7 @@ int git_reference__normalize_name(
 	if (normalize)
 		git_buf_clear(buf);
 
+#ifdef GIT_USE_ICONV
 	if ((flags & GIT_REF_FORMAT__PRECOMPOSE_UNICODE) != 0) {
 		size_t namelen = strlen(current);
 		if ((error = git_path_iconv_init_precompose(&ic)) < 0 ||
@@ -757,6 +761,7 @@ int git_reference__normalize_name(
 			goto cleanup;
 		error = GIT_EINVALIDSPEC;
 	}
+#endif
 
 	while (true) {
 		segment_len = ensure_segment_validity(current);
@@ -834,7 +839,9 @@ cleanup:
 	if (error && normalize)
 		git_buf_free(buf);
 
+#ifdef GIT_USE_ICONV
 	git_path_iconv_clear(&ic);
+#endif
 
 	return error;
 }
diff --git a/tests-clar/core/iconv.c b/tests-clar/core/iconv.c
index 73bc99a..8aedab2 100644
--- a/tests-clar/core/iconv.c
+++ b/tests-clar/core/iconv.c
@@ -1,22 +1,29 @@
 #include "clar_libgit2.h"
 #include "path.h"
 
+#ifdef GIT_USE_ICONV
 static git_path_iconv_t ic;
 static char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D";
 static char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D";
+#endif
 
 void test_core_iconv__initialize(void)
 {
+#ifdef GIT_USE_ICONV
 	cl_git_pass(git_path_iconv_init_precompose(&ic));
+#endif
 }
 
 void test_core_iconv__cleanup(void)
 {
+#ifdef GIT_USE_ICONV
 	git_path_iconv_clear(&ic);
+#endif
 }
 
 void test_core_iconv__unchanged(void)
 {
+#ifdef GIT_USE_ICONV
 	char *data = "Ascii data", *original = data;
 	size_t datalen = strlen(data);
 
@@ -25,10 +32,12 @@ void test_core_iconv__unchanged(void)
 
 	/* There are no high bits set, so this should leave data untouched */
 	cl_assert(data == original);
+#endif
 }
 
 void test_core_iconv__decomposed_to_precomposed(void)
 {
+#ifdef GIT_USE_ICONV
 	char *data = nfd;
 	size_t datalen = strlen(nfd);
 
@@ -38,15 +47,13 @@ void test_core_iconv__decomposed_to_precomposed(void)
 	/* The decomposed nfd string should be transformed to the nfc form
 	 * (on platforms where iconv is enabled, of course).
 	 */
-#ifdef GIT_USE_ICONV
 	cl_assert_equal_s(nfc, data);
-#else
-	cl_assert_equal_s(nfd, data);
 #endif
 }
 
 void test_core_iconv__precomposed_is_unmodified(void)
 {
+#ifdef GIT_USE_ICONV
 	char *data = nfc;
 	size_t datalen = strlen(nfc);
 
@@ -57,4 +64,5 @@ void test_core_iconv__precomposed_is_unmodified(void)
 	 * the high-bit set, the iconv transform should result in no change.
 	 */
 	cl_assert_equal_s(nfc, data);
+#endif
 }
diff --git a/tests-clar/repo/init.c b/tests-clar/repo/init.c
index 617fdf8..aea383c 100644
--- a/tests-clar/repo/init.c
+++ b/tests-clar/repo/init.c
@@ -232,6 +232,7 @@ void test_repo_init__detect_ignorecase(void)
 
 void test_repo_init__detect_precompose_unicode_required(void)
 {
+#ifdef GIT_USE_ICONV
 	char *composed = "ḱṷṓn", *decomposed = "ḱṷṓn";
 	struct stat st;
 	bool found_with_nfd;
@@ -240,7 +241,6 @@ void test_repo_init__detect_precompose_unicode_required(void)
 	found_with_nfd = (p_stat(decomposed, &st) == 0);
 	cl_must_pass(p_unlink(composed));
 
-#ifdef GIT_USE_ICONV
 	assert_config_entry_on_init("core.precomposeunicode", found_with_nfd);
 #else
 	assert_config_entry_on_init("core.precomposeunicode", GIT_ENOTFOUND);