comparison Python/errors.c @ 25535:861065256487 legacy-trunk

Patch 594001: PEP 277 - Unicode file name support for Windows NT.
author Mark Hammond <mhammond@skippinet.com.au>
date Thu, 03 Oct 2002 05:10:39 +0000
parents 3db261a93a5b
children dfeec3b34fae
comparison
equal deleted inserted replaced
25534:08148e916d38 25535:861065256487
257 257
258 return NULL; 258 return NULL;
259 } 259 }
260 260
261 PyObject * 261 PyObject *
262 PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename) 262 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
263 { 263 {
264 PyObject *v; 264 PyObject *v;
265 char *s; 265 char *s;
266 int i = errno; 266 int i = errno;
267 #ifdef PLAN9 267 #ifdef PLAN9
312 s[--len] = '\0'; 312 s[--len] = '\0';
313 } 313 }
314 } 314 }
315 #endif /* Unix/Windows */ 315 #endif /* Unix/Windows */
316 #endif /* PLAN 9*/ 316 #endif /* PLAN 9*/
317 if (filename != NULL) 317 if (filenameObject != NULL)
318 v = Py_BuildValue("(iss)", i, s, filename); 318 v = Py_BuildValue("(isO)", i, s, filenameObject);
319 else 319 else
320 v = Py_BuildValue("(is)", i, s); 320 v = Py_BuildValue("(is)", i, s);
321 if (v != NULL) { 321 if (v != NULL) {
322 PyErr_SetObject(exc, v); 322 PyErr_SetObject(exc, v);
323 Py_DECREF(v); 323 Py_DECREF(v);
328 return NULL; 328 return NULL;
329 } 329 }
330 330
331 331
332 PyObject * 332 PyObject *
333 PyErr_SetFromErrnoWithFilename(PyObject *exc, char *filename)
334 {
335 PyObject *name = filename ? PyString_FromString(filename) : NULL;
336 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
337 Py_DECREF(name);
338 return result;
339 }
340
341 #ifdef Py_WIN_WIDE_FILENAMES
342 PyObject *
343 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, Py_UNICODE *filename)
344 {
345 PyObject *name = filename ?
346 PyUnicode_FromUnicode(filename, wcslen(filename)) :
347 NULL;
348 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
349 Py_XDECREF(name);
350 return result;
351 }
352 #endif /* Py_WIN_WIDE_FILENAMES */
353
354 PyObject *
333 PyErr_SetFromErrno(PyObject *exc) 355 PyErr_SetFromErrno(PyObject *exc)
334 { 356 {
335 return PyErr_SetFromErrnoWithFilename(exc, NULL); 357 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
336 } 358 }
337 359
338 #ifdef MS_WINDOWS 360 #ifdef MS_WINDOWS
339 /* Windows specific error code handling */ 361 /* Windows specific error code handling */
340 PyObject *PyErr_SetExcFromWindowsErrWithFilename( 362 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
341 PyObject *exc, 363 PyObject *exc,
342 int ierr, 364 int ierr,
343 const char *filename) 365 PyObject *filenameObject)
344 { 366 {
345 int len; 367 int len;
346 char *s; 368 char *s;
347 PyObject *v; 369 PyObject *v;
348 DWORD err = (DWORD)ierr; 370 DWORD err = (DWORD)ierr;
360 0, /* size not used */ 382 0, /* size not used */
361 NULL); /* no args */ 383 NULL); /* no args */
362 /* remove trailing cr/lf and dots */ 384 /* remove trailing cr/lf and dots */
363 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) 385 while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.'))
364 s[--len] = '\0'; 386 s[--len] = '\0';
365 if (filename != NULL) 387 if (filenameObject != NULL)
366 v = Py_BuildValue("(iss)", err, s, filename); 388 v = Py_BuildValue("(isO)", err, s, filenameObject);
367 else 389 else
368 v = Py_BuildValue("(is)", err, s); 390 v = Py_BuildValue("(is)", err, s);
369 if (v != NULL) { 391 if (v != NULL) {
370 PyErr_SetObject(exc, v); 392 PyErr_SetObject(exc, v);
371 Py_DECREF(v); 393 Py_DECREF(v);
372 } 394 }
373 LocalFree(s); 395 LocalFree(s);
374 return NULL; 396 return NULL;
375 } 397 }
376 398
399 PyObject *PyErr_SetExcFromWindowsErrWithFilename(
400 PyObject *exc,
401 int ierr,
402 const char *filename)
403 {
404 PyObject *name = filename ? PyString_FromString(filename) : NULL;
405 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
406 ierr,
407 name);
408 Py_XDECREF(name);
409 return ret;
410 }
411
412 #ifdef Py_WIN_WIDE_FILENAMES
413 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
414 PyObject *exc,
415 int ierr,
416 const Py_UNICODE *filename)
417 {
418 PyObject *name = filename ?
419 PyUnicode_FromUnicode(filename, wcslen(filename)) :
420 NULL;
421 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
422 ierr,
423 name);
424 Py_XDECREF(name);
425 return ret;
426 }
427 #endif /* Py_WIN_WIDE_FILENAMES */
428
377 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr) 429 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
378 { 430 {
379 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL); 431 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
380 } 432 }
381 433
386 } 438 }
387 PyObject *PyErr_SetFromWindowsErrWithFilename( 439 PyObject *PyErr_SetFromWindowsErrWithFilename(
388 int ierr, 440 int ierr,
389 const char *filename) 441 const char *filename)
390 { 442 {
391 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, 443 PyObject *name = filename ? PyString_FromString(filename) : NULL;
392 ierr, filename); 444 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
393 } 445 PyExc_WindowsError,
446 ierr, name);
447 Py_XDECREF(result);
448 return result;
449 }
450
451 #ifdef Py_WIN_WIDE_FILENAMES
452 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
453 int ierr,
454 const Py_UNICODE *filename)
455 {
456 PyObject *name = filename ?
457 PyUnicode_FromUnicode(filename, wcslen(filename)) :
458 NULL;
459 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
460 PyExc_WindowsError,
461 ierr, name);
462 Py_XDECREF(result);
463 return result;
464 }
465 #endif /* Py_WIN_WIDE_FILENAMES */
394 #endif /* MS_WINDOWS */ 466 #endif /* MS_WINDOWS */
395 467
396 void 468 void
397 _PyErr_BadInternalCall(char *filename, int lineno) 469 _PyErr_BadInternalCall(char *filename, int lineno)
398 { 470 {