From 743007d2fe6c7ceb5232c2b9e4dbaeb232635dce Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Wed, 21 Apr 1999 15:27:31 +0000
Subject: Patch by Christian Tismer for Win32, to use FormatMessage() instead
 of strerror().  This improves the quality of the error messages.

---
 Python/errors.c | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/Python/errors.c b/Python/errors.c
index f2768ee..cb0503b 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -49,6 +49,11 @@ extern char *strerror Py_PROTO((int));
 #endif
 #endif
 
+#ifdef MS_WIN32
+#include "windows.h"
+#include "winbase.h"
+#endif
+
 void
 PyErr_Restore(type, value, traceback)
 	PyObject *type;
@@ -142,7 +147,7 @@ PyErr_GivenExceptionMatches(err, exc)
 
 	return err == exc;
 }
-	
+
 
 int
 PyErr_ExceptionMatches(exc)
@@ -291,7 +296,26 @@ PyErr_SetFromErrnoWithFilename(exc, filename)
 	if (i == 0)
 		s = "Error"; /* Sometimes errno didn't get set */
 	else
+#ifndef MS_WIN32
 		s = strerror(i);
+#else
+	{
+		int len = FormatMessage(
+			FORMAT_MESSAGE_ALLOCATE_BUFFER |
+			FORMAT_MESSAGE_FROM_SYSTEM |
+			FORMAT_MESSAGE_IGNORE_INSERTS,
+			NULL,	/* no message source */
+			i,
+			MAKELANGID(LANG_NEUTRAL,
+				   SUBLANG_DEFAULT), /* Default language */
+			(LPTSTR) &s,
+			0,	/* size not used */
+			NULL);	/* no args */
+		/* remove trailing cr/lf and dots */
+		while (len > 0 && s[len-1] <= '.')
+			s[--len] = '\0';
+	}
+#endif
 	if (filename != NULL && Py_UseClassExceptionsFlag)
 		v = Py_BuildValue("(iss)", i, s, filename);
 	else
@@ -300,9 +324,12 @@ PyErr_SetFromErrnoWithFilename(exc, filename)
 		PyErr_SetObject(exc, v);
 		Py_DECREF(v);
 	}
+#ifdef MS_WIN32
+	LocalFree(s);
+#endif
 	return NULL;
 }
-	
+
 
 PyObject *
 PyErr_SetFromErrno(exc)
-- 
cgit v0.12