Mailing List Archive

python/dist/src/Python errors.c,2.71,2.72
Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv29768/Python

Modified Files:
errors.c
Log Message:
Patch 594001: PEP 277 - Unicode file name support for Windows NT.


Index: errors.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/errors.c,v
retrieving revision 2.71
retrieving revision 2.72
diff -C2 -d -r2.71 -r2.72
*** errors.c 29 Jul 2002 14:27:41 -0000 2.71
--- errors.c 3 Oct 2002 05:10:39 -0000 2.72
***************
*** 260,264 ****

PyObject *
! PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
{
PyObject *v;
--- 260,264 ----

PyObject *
! PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
{
PyObject *v;
***************
*** 315,320 ****
#endif /* Unix/Windows */
#endif /* PLAN 9*/
! if (filename != NULL)
! v = Py_BuildValue("(iss)", i, s, filename);
else
v = Py_BuildValue("(is)", i, s);
--- 315,320 ----
#endif /* Unix/Windows */
#endif /* PLAN 9*/
! if (filenameObject != NULL)
! v = Py_BuildValue("(isO)", i, s, filenameObject);
else
v = Py_BuildValue("(is)", i, s);
***************
*** 331,345 ****

PyObject *
PyErr_SetFromErrno(PyObject *exc)
{
! return PyErr_SetFromErrnoWithFilename(exc, NULL);
}

#ifdef MS_WINDOWS
/* Windows specific error code handling */
! PyObject *PyErr_SetExcFromWindowsErrWithFilename(
PyObject *exc,
int ierr,
! const char *filename)
{
int len;
--- 331,367 ----

PyObject *
+ PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
+ {
+ PyObject *name = filename ? PyString_FromString(filename) : NULL;
+ PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
+ Py_DECREF(name);
+ return result;
+ }
+
+ #ifdef Py_WIN_WIDE_FILENAMES
+ PyObject *
+ PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
+ {
+ PyObject *name = filename ?
+ PyUnicode_FromUnicode(filename, wcslen(filename)) :
+ NULL;
+ PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
+ Py_XDECREF(name);
+ return result;
+ }
+ #endif /* Py_WIN_WIDE_FILENAMES */
+
+ PyObject *
PyErr_SetFromErrno(PyObject *exc)
{
! return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
}

#ifdef MS_WINDOWS
/* Windows specific error code handling */
! PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
PyObject *exc,
int ierr,
! PyObject *filenameObject)
{
int len;
***************
*** 363,368 ****
while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
s[--len] = '\0';
! if (filename != NULL)
! v = Py_BuildValue("(iss)", err, s, filename);
else
v = Py_BuildValue("(is)", err, s);
--- 385,390 ----
while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
s[--len] = '\0';
! if (filenameObject != NULL)
! v = Py_BuildValue("(isO)", err, s, filenameObject);
else
v = Py_BuildValue("(is)", err, s);
***************
*** 375,378 ****
--- 397,430 ----
}

+ PyObject *PyErr_SetExcFromWindowsErrWithFilename(
+ PyObject *exc,
+ int ierr,
+ const char *filename)
+ {
+ PyObject *name = filename ? PyString_FromString(filename) : NULL;
+ PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
+ ierr,
+ name);
+ Py_XDECREF(name);
+ return ret;
+ }
+
+ #ifdef Py_WIN_WIDE_FILENAMES
+ PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
+ PyObject *exc,
+ int ierr,
+ const Py_UNICODE *filename)
+ {
+ PyObject *name = filename ?
+ PyUnicode_FromUnicode(filename, wcslen(filename)) :
+ NULL;
+ PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
+ ierr,
+ name);
+ Py_XDECREF(name);
+ return ret;
+ }
+ #endif /* Py_WIN_WIDE_FILENAMES */
+
PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
{
***************
*** 389,395 ****
const char *filename)
{
! return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
! ierr, filename);
}
#endif /* MS_WINDOWS */

--- 441,467 ----
const char *filename)
{
! PyObject *name = filename ? PyString_FromString(filename) : NULL;
! PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
! PyExc_WindowsError,
! ierr, name);
! Py_XDECREF(result);
! return result;
}
+
+ #ifdef Py_WIN_WIDE_FILENAMES
+ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
+ int ierr,
+ const Py_UNICODE *filename)
+ {
+ PyObject *name = filename ?
+ PyUnicode_FromUnicode(filename, wcslen(filename)) :
+ NULL;
+ PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
+ PyExc_WindowsError,
+ ierr, name);
+ Py_XDECREF(result);
+ return result;
+ }
+ #endif /* Py_WIN_WIDE_FILENAMES */
#endif /* MS_WINDOWS */
Re: python/dist/src/Python errors.c,2.71,2.72 [ In reply to ]
On Wed, Oct 02, 2002 at 10:10:41PM -0700, mhammond@users.sourceforge.net wrote:
>
> PyObject *
> + PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
> + {
> + PyObject *name = filename ? PyString_FromString(filename) : NULL;
> + PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
> + Py_DECREF(name);

Should be Py_XDECREF().

> --- 441,467 ----
> const char *filename)
> {
> ! PyObject *name = filename ? PyString_FromString(filename) : NULL;
> ! PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
> ! PyExc_WindowsError,
> ! ierr, name);
> ! Py_XDECREF(result);
> ! return result;

Should be DECREFing name, right?

> +
> + #ifdef Py_WIN_WIDE_FILENAMES
> + PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
> + int ierr,
> + const Py_UNICODE *filename)
> + {
> + PyObject *name = filename ?
> + PyUnicode_FromUnicode(filename, wcslen(filename)) :
> + NULL;
> + PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
> + PyExc_WindowsError,
> + ierr, name);
> + Py_XDECREF(result);
> + return result;

Should be DECREFing name here too?

Neal