Chris@87: #ifndef Py_ERRORS_H Chris@87: #define Py_ERRORS_H Chris@87: #ifdef __cplusplus Chris@87: extern "C" { Chris@87: #endif Chris@87: Chris@87: /* Error objects */ Chris@87: Chris@87: typedef struct { Chris@87: PyObject_HEAD Chris@87: PyObject *dict; Chris@87: PyObject *args; Chris@87: PyObject *message; Chris@87: } PyBaseExceptionObject; Chris@87: Chris@87: typedef struct { Chris@87: PyObject_HEAD Chris@87: PyObject *dict; Chris@87: PyObject *args; Chris@87: PyObject *message; Chris@87: PyObject *msg; Chris@87: PyObject *filename; Chris@87: PyObject *lineno; Chris@87: PyObject *offset; Chris@87: PyObject *text; Chris@87: PyObject *print_file_and_line; Chris@87: } PySyntaxErrorObject; Chris@87: Chris@87: #ifdef Py_USING_UNICODE Chris@87: typedef struct { Chris@87: PyObject_HEAD Chris@87: PyObject *dict; Chris@87: PyObject *args; Chris@87: PyObject *message; Chris@87: PyObject *encoding; Chris@87: PyObject *object; Chris@87: Py_ssize_t start; Chris@87: Py_ssize_t end; Chris@87: PyObject *reason; Chris@87: } PyUnicodeErrorObject; Chris@87: #endif Chris@87: Chris@87: typedef struct { Chris@87: PyObject_HEAD Chris@87: PyObject *dict; Chris@87: PyObject *args; Chris@87: PyObject *message; Chris@87: PyObject *code; Chris@87: } PySystemExitObject; Chris@87: Chris@87: typedef struct { Chris@87: PyObject_HEAD Chris@87: PyObject *dict; Chris@87: PyObject *args; Chris@87: PyObject *message; Chris@87: PyObject *myerrno; Chris@87: PyObject *strerror; Chris@87: PyObject *filename; Chris@87: } PyEnvironmentErrorObject; Chris@87: Chris@87: #ifdef MS_WINDOWS Chris@87: typedef struct { Chris@87: PyObject_HEAD Chris@87: PyObject *dict; Chris@87: PyObject *args; Chris@87: PyObject *message; Chris@87: PyObject *myerrno; Chris@87: PyObject *strerror; Chris@87: PyObject *filename; Chris@87: PyObject *winerror; Chris@87: } PyWindowsErrorObject; Chris@87: #endif Chris@87: Chris@87: /* Error handling definitions */ Chris@87: Chris@87: PyAPI_FUNC(void) PyErr_SetNone(PyObject *); Chris@87: PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *); Chris@87: PyAPI_FUNC(void) PyErr_SetString(PyObject *, const char *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_Occurred(void); Chris@87: PyAPI_FUNC(void) PyErr_Clear(void); Chris@87: PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **); Chris@87: PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *); Chris@87: Chris@87: #ifdef Py_DEBUG Chris@87: #define _PyErr_OCCURRED() PyErr_Occurred() Chris@87: #else Chris@87: #define _PyErr_OCCURRED() (_PyThreadState_Current->curexc_type) Chris@87: #endif Chris@87: Chris@87: /* Error testing and normalization */ Chris@87: PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); Chris@87: PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); Chris@87: PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**); Chris@87: Chris@87: /* */ Chris@87: Chris@87: #define PyExceptionClass_Check(x) \ Chris@87: (PyClass_Check((x)) || (PyType_Check((x)) && \ Chris@87: PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))) Chris@87: Chris@87: #define PyExceptionInstance_Check(x) \ Chris@87: (PyInstance_Check((x)) || \ Chris@87: PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)) Chris@87: Chris@87: #define PyExceptionClass_Name(x) \ Chris@87: (PyClass_Check((x)) \ Chris@87: ? PyString_AS_STRING(((PyClassObject*)(x))->cl_name) \ Chris@87: : (char *)(((PyTypeObject*)(x))->tp_name)) Chris@87: Chris@87: #define PyExceptionInstance_Class(x) \ Chris@87: ((PyInstance_Check((x)) \ Chris@87: ? (PyObject*)((PyInstanceObject*)(x))->in_class \ Chris@87: : (PyObject*)((x)->ob_type))) Chris@87: Chris@87: Chris@87: /* Predefined exceptions */ Chris@87: Chris@87: PyAPI_DATA(PyObject *) PyExc_BaseException; Chris@87: PyAPI_DATA(PyObject *) PyExc_Exception; Chris@87: PyAPI_DATA(PyObject *) PyExc_StopIteration; Chris@87: PyAPI_DATA(PyObject *) PyExc_GeneratorExit; Chris@87: PyAPI_DATA(PyObject *) PyExc_StandardError; Chris@87: PyAPI_DATA(PyObject *) PyExc_ArithmeticError; Chris@87: PyAPI_DATA(PyObject *) PyExc_LookupError; Chris@87: Chris@87: PyAPI_DATA(PyObject *) PyExc_AssertionError; Chris@87: PyAPI_DATA(PyObject *) PyExc_AttributeError; Chris@87: PyAPI_DATA(PyObject *) PyExc_EOFError; Chris@87: PyAPI_DATA(PyObject *) PyExc_FloatingPointError; Chris@87: PyAPI_DATA(PyObject *) PyExc_EnvironmentError; Chris@87: PyAPI_DATA(PyObject *) PyExc_IOError; Chris@87: PyAPI_DATA(PyObject *) PyExc_OSError; Chris@87: PyAPI_DATA(PyObject *) PyExc_ImportError; Chris@87: PyAPI_DATA(PyObject *) PyExc_IndexError; Chris@87: PyAPI_DATA(PyObject *) PyExc_KeyError; Chris@87: PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt; Chris@87: PyAPI_DATA(PyObject *) PyExc_MemoryError; Chris@87: PyAPI_DATA(PyObject *) PyExc_NameError; Chris@87: PyAPI_DATA(PyObject *) PyExc_OverflowError; Chris@87: PyAPI_DATA(PyObject *) PyExc_RuntimeError; Chris@87: PyAPI_DATA(PyObject *) PyExc_NotImplementedError; Chris@87: PyAPI_DATA(PyObject *) PyExc_SyntaxError; Chris@87: PyAPI_DATA(PyObject *) PyExc_IndentationError; Chris@87: PyAPI_DATA(PyObject *) PyExc_TabError; Chris@87: PyAPI_DATA(PyObject *) PyExc_ReferenceError; Chris@87: PyAPI_DATA(PyObject *) PyExc_SystemError; Chris@87: PyAPI_DATA(PyObject *) PyExc_SystemExit; Chris@87: PyAPI_DATA(PyObject *) PyExc_TypeError; Chris@87: PyAPI_DATA(PyObject *) PyExc_UnboundLocalError; Chris@87: PyAPI_DATA(PyObject *) PyExc_UnicodeError; Chris@87: PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError; Chris@87: PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError; Chris@87: PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; Chris@87: PyAPI_DATA(PyObject *) PyExc_ValueError; Chris@87: PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; Chris@87: #ifdef MS_WINDOWS Chris@87: PyAPI_DATA(PyObject *) PyExc_WindowsError; Chris@87: #endif Chris@87: #ifdef __VMS Chris@87: PyAPI_DATA(PyObject *) PyExc_VMSError; Chris@87: #endif Chris@87: Chris@87: PyAPI_DATA(PyObject *) PyExc_BufferError; Chris@87: Chris@87: PyAPI_DATA(PyObject *) PyExc_MemoryErrorInst; Chris@87: PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst; Chris@87: Chris@87: /* Predefined warning categories */ Chris@87: PyAPI_DATA(PyObject *) PyExc_Warning; Chris@87: PyAPI_DATA(PyObject *) PyExc_UserWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_DeprecationWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_SyntaxWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_RuntimeWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_FutureWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_ImportWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; Chris@87: PyAPI_DATA(PyObject *) PyExc_BytesWarning; Chris@87: Chris@87: Chris@87: /* Convenience functions */ Chris@87: Chris@87: PyAPI_FUNC(int) PyErr_BadArgument(void); Chris@87: PyAPI_FUNC(PyObject *) PyErr_NoMemory(void); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject( Chris@87: PyObject *, PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename( Chris@87: PyObject *, const char *); Chris@87: #ifdef MS_WINDOWS Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename( Chris@87: PyObject *, const Py_UNICODE *); Chris@87: #endif /* MS_WINDOWS */ Chris@87: Chris@87: PyAPI_FUNC(PyObject *) PyErr_Format(PyObject *, const char *, ...) Chris@87: Py_GCC_ATTRIBUTE((format(printf, 2, 3))); Chris@87: Chris@87: #ifdef MS_WINDOWS Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilenameObject( Chris@87: int, const char *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( Chris@87: int, const char *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename( Chris@87: int, const Py_UNICODE *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject( Chris@87: PyObject *,int, PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename( Chris@87: PyObject *,int, const char *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename( Chris@87: PyObject *,int, const Py_UNICODE *); Chris@87: PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int); Chris@87: #endif /* MS_WINDOWS */ Chris@87: Chris@87: /* Export the old function so that the existing API remains available: */ Chris@87: PyAPI_FUNC(void) PyErr_BadInternalCall(void); Chris@87: PyAPI_FUNC(void) _PyErr_BadInternalCall(char *filename, int lineno); Chris@87: /* Mask the old API with a call to the new API for code compiled under Chris@87: Python 2.0: */ Chris@87: #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) Chris@87: Chris@87: /* Function to create a new exception */ Chris@87: PyAPI_FUNC(PyObject *) PyErr_NewException( Chris@87: char *name, PyObject *base, PyObject *dict); Chris@87: PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc( Chris@87: char *name, char *doc, PyObject *base, PyObject *dict); Chris@87: PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); Chris@87: Chris@87: /* In sigcheck.c or signalmodule.c */ Chris@87: PyAPI_FUNC(int) PyErr_CheckSignals(void); Chris@87: PyAPI_FUNC(void) PyErr_SetInterrupt(void); Chris@87: Chris@87: /* In signalmodule.c */ Chris@87: int PySignal_SetWakeupFd(int fd); Chris@87: Chris@87: /* Support for adding program text to SyntaxErrors */ Chris@87: PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int); Chris@87: PyAPI_FUNC(PyObject *) PyErr_ProgramText(const char *, int); Chris@87: Chris@87: #ifdef Py_USING_UNICODE Chris@87: /* The following functions are used to create and modify unicode Chris@87: exceptions from C */ Chris@87: Chris@87: /* create a UnicodeDecodeError object */ Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create( Chris@87: const char *, const char *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); Chris@87: Chris@87: /* create a UnicodeEncodeError object */ Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( Chris@87: const char *, const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); Chris@87: Chris@87: /* create a UnicodeTranslateError object */ Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( Chris@87: const Py_UNICODE *, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char *); Chris@87: Chris@87: /* get the encoding attribute */ Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *); Chris@87: Chris@87: /* get the object attribute */ Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *); Chris@87: Chris@87: /* get the value of the start attribute (the int * may not be NULL) Chris@87: return 0 on success, -1 on failure */ Chris@87: PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *); Chris@87: PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *); Chris@87: PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *); Chris@87: Chris@87: /* assign a new value to the start attribute Chris@87: return 0 on success, -1 on failure */ Chris@87: PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t); Chris@87: PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t); Chris@87: PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t); Chris@87: Chris@87: /* get the value of the end attribute (the int *may not be NULL) Chris@87: return 0 on success, -1 on failure */ Chris@87: PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *); Chris@87: PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *); Chris@87: PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *); Chris@87: Chris@87: /* assign a new value to the end attribute Chris@87: return 0 on success, -1 on failure */ Chris@87: PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t); Chris@87: PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t); Chris@87: PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t); Chris@87: Chris@87: /* get the value of the reason attribute */ Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *); Chris@87: PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *); Chris@87: Chris@87: /* assign a new value to the reason attribute Chris@87: return 0 on success, -1 on failure */ Chris@87: PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason( Chris@87: PyObject *, const char *); Chris@87: PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason( Chris@87: PyObject *, const char *); Chris@87: PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( Chris@87: PyObject *, const char *); Chris@87: #endif Chris@87: Chris@87: Chris@87: /* These APIs aren't really part of the error implementation, but Chris@87: often needed to format error messages; the native C lib APIs are Chris@87: not available on all platforms, which is why we provide emulations Chris@87: for those platforms in Python/mysnprintf.c, Chris@87: WARNING: The return value of snprintf varies across platforms; do Chris@87: not rely on any particular behavior; eventually the C99 defn may Chris@87: be reliable. Chris@87: */ Chris@87: #if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) Chris@87: # define HAVE_SNPRINTF Chris@87: # define snprintf _snprintf Chris@87: # define vsnprintf _vsnprintf Chris@87: #endif Chris@87: Chris@87: #include Chris@87: PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) Chris@87: Py_GCC_ATTRIBUTE((format(printf, 3, 4))); Chris@87: PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) Chris@87: Py_GCC_ATTRIBUTE((format(printf, 3, 0))); Chris@87: Chris@87: #ifdef __cplusplus Chris@87: } Chris@87: #endif Chris@87: #endif /* !Py_ERRORS_H */