summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1999-04-21 15:27:31 (GMT)
committerGuido van Rossum <guido@python.org>1999-04-21 15:27:31 (GMT)
commit743007d2fe6c7ceb5232c2b9e4dbaeb232635dce (patch)
treece5176ad0c5dcb6b89904ba18b0460b8b3bbc46d /Python
parent085b8121eb04b6f563b23784f5761f579ed22b3d (diff)
downloadcpython-743007d2fe6c7ceb5232c2b9e4dbaeb232635dce.zip
cpython-743007d2fe6c7ceb5232c2b9e4dbaeb232635dce.tar.gz
cpython-743007d2fe6c7ceb5232c2b9e4dbaeb232635dce.tar.bz2
Patch by Christian Tismer for Win32, to use FormatMessage() instead of
strerror(). This improves the quality of the error messages.
Diffstat (limited to 'Python')
-rw-r--r--Python/errors.c31
1 files 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)