Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin.

Patch by Amaury Forgeot d'Arc, reviewed by me.
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index 8441f1e..fb2837e 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -49,7 +49,11 @@
 static PyObject*
 str2uni(const char* s)
 {
+#ifdef HAVE_BROKEN_MBSTOWCS
+    size_t needed = strlen(s);
+#else
     size_t needed = mbstowcs(NULL, s, 0);
+#endif
     size_t res1;
     wchar_t smallbuf[30];
     wchar_t *dest;
@@ -67,7 +71,11 @@
     }
     /* This shouldn't fail now */
     res1 = mbstowcs(dest, s, needed+1);
+#ifdef HAVE_BROKEN_MBSTOWCS
+    assert(res1 != (size_t)-1);
+#else
     assert(res1 == needed);
+#endif
     res2 = PyUnicode_FromWideChar(dest, res1);
     if (dest != smallbuf)
         PyMem_Free(dest);
diff --git a/Modules/python.c b/Modules/python.c
index c1de64a..1ff2298 100644
--- a/Modules/python.c
+++ b/Modules/python.c
@@ -40,7 +40,16 @@
 	oldloc = setlocale(LC_ALL, NULL);
 	setlocale(LC_ALL, "");
 	for (i = 0; i < argc; i++) {
+#ifdef HAVE_BROKEN_MBSTOWCS
+		/* Some platforms have a broken implementation of
+		 * mbstowcs which does not count the characters that
+		 * would result from conversion.  Use an upper bound.
+		 */
+		size_t argsize = strlen(argv[i]);
+#else
 		size_t argsize = mbstowcs(NULL, argv[i], 0);
+#endif
+		size_t count;
 		if (argsize == (size_t)-1) {
 			fprintf(stderr, "Could not convert argument %d to string", i);
 			return 1;
@@ -51,7 +60,11 @@
 			fprintf(stderr, "out of memory");
 			return 1;
 		}
-		mbstowcs(argv_copy[i], argv[i], argsize+1);
+		count = mbstowcs(argv_copy[i], argv[i], argsize+1);
+		if (count == (size_t)-1) {
+			fprintf(stderr, "Could not convert argument %d to string", i);
+			return 1;
+		}
 	}
 	setlocale(LC_ALL, oldloc);
 	res = Py_Main(argc, argv_copy);