Windows specific vsnprintf fixes.

* Changes flac_snprintf (in src/share/grabbag/snprintf.c) and its copy
  local_snprintf (src/libFLAC/metadata_iterators.c) to be almost sane.

* Adds flac_vsnprintf (src/share/grabbag/snprintf.c) and its copy
  local_vsnprintf (src/share/win_utf8_io/win_utf8_io.c).

* Changes stats_print_info in src/flac/utils.c so it uses flac_vsnprintf
  instead of vsnprintf. This makes return value checking unnecessary.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
diff --git a/src/libFLAC/metadata_iterators.c b/src/libFLAC/metadata_iterators.c
index 778bb8c..d50df39 100644
--- a/src/libFLAC/metadata_iterators.c
+++ b/src/libFLAC/metadata_iterators.c
@@ -3201,13 +3201,18 @@
 local_snprintf(char *str, size_t size, const char *fmt, ...)
 {
 	va_list va;
-	int rc ;
+	int rc;
 
 	va_start (va, fmt);
 
-#ifdef _MSC_VER
+#if defined _MSC_VER
+	if (size == 0)
+		return 1024;
 	rc = vsnprintf_s (str, size, _TRUNCATE, fmt, va);
-	rc = (rc > 0) ? rc : (size == 0 ? 1024 : size * 2);
+	if (rc < 0)
+		rc = size - 1;
+#elif defined __MINGW32__
+	rc = __mingw_vsnprintf (str, size, fmt, va);
 #else
 	rc = vsnprintf (str, size, fmt, va);
 #endif