Mercurial > cpython-lru_cache-weakref
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 { |
