Home | History | Annotate | Download | only in Include
      1 #ifndef Py_ERRORS_H
      2 #define Py_ERRORS_H
      3 #ifdef __cplusplus
      4 extern "C" {
      5 #endif
      6 
      7 /* Error objects */
      8 
      9 #ifndef Py_LIMITED_API
     10 /* PyException_HEAD defines the initial segment of every exception class. */
     11 #define PyException_HEAD PyObject_HEAD PyObject *dict;\
     12              PyObject *args; PyObject *traceback;\
     13              PyObject *context; PyObject *cause;\
     14              char suppress_context;
     15 
     16 typedef struct {
     17     PyException_HEAD
     18 } PyBaseExceptionObject;
     19 
     20 typedef struct {
     21     PyException_HEAD
     22     PyObject *msg;
     23     PyObject *filename;
     24     PyObject *lineno;
     25     PyObject *offset;
     26     PyObject *text;
     27     PyObject *print_file_and_line;
     28 } PySyntaxErrorObject;
     29 
     30 typedef struct {
     31     PyException_HEAD
     32     PyObject *msg;
     33     PyObject *name;
     34     PyObject *path;
     35 } PyImportErrorObject;
     36 
     37 typedef struct {
     38     PyException_HEAD
     39     PyObject *encoding;
     40     PyObject *object;
     41     Py_ssize_t start;
     42     Py_ssize_t end;
     43     PyObject *reason;
     44 } PyUnicodeErrorObject;
     45 
     46 typedef struct {
     47     PyException_HEAD
     48     PyObject *code;
     49 } PySystemExitObject;
     50 
     51 typedef struct {
     52     PyException_HEAD
     53     PyObject *myerrno;
     54     PyObject *strerror;
     55     PyObject *filename;
     56     PyObject *filename2;
     57 #ifdef MS_WINDOWS
     58     PyObject *winerror;
     59 #endif
     60     Py_ssize_t written;   /* only for BlockingIOError, -1 otherwise */
     61 } PyOSErrorObject;
     62 
     63 typedef struct {
     64     PyException_HEAD
     65     PyObject *value;
     66 } PyStopIterationObject;
     67 
     68 /* Compatibility typedefs */
     69 typedef PyOSErrorObject PyEnvironmentErrorObject;
     70 #ifdef MS_WINDOWS
     71 typedef PyOSErrorObject PyWindowsErrorObject;
     72 #endif
     73 #endif /* !Py_LIMITED_API */
     74 
     75 /* Error handling definitions */
     76 
     77 PyAPI_FUNC(void) PyErr_SetNone(PyObject *);
     78 PyAPI_FUNC(void) PyErr_SetObject(PyObject *, PyObject *);
     79 #ifndef Py_LIMITED_API
     80 PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *);
     81 _PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate);
     82 #endif
     83 PyAPI_FUNC(void) PyErr_SetString(
     84     PyObject *exception,
     85     const char *string   /* decoded from utf-8 */
     86     );
     87 PyAPI_FUNC(PyObject *) PyErr_Occurred(void);
     88 PyAPI_FUNC(void) PyErr_Clear(void);
     89 PyAPI_FUNC(void) PyErr_Fetch(PyObject **, PyObject **, PyObject **);
     90 PyAPI_FUNC(void) PyErr_Restore(PyObject *, PyObject *, PyObject *);
     91 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
     92 PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **);
     93 PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *);
     94 #endif
     95 
     96 #if defined(__clang__) || \
     97     (defined(__GNUC__) && \
     98      ((__GNUC__ >= 3) || \
     99       (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5)))
    100 #define _Py_NO_RETURN __attribute__((__noreturn__))
    101 #else
    102 #define _Py_NO_RETURN
    103 #endif
    104 
    105 /* Defined in Python/pylifecycle.c */
    106 PyAPI_FUNC(void) Py_FatalError(const char *message) _Py_NO_RETURN;
    107 
    108 #if defined(Py_DEBUG) || defined(Py_LIMITED_API)
    109 #define _PyErr_OCCURRED() PyErr_Occurred()
    110 #else
    111 #define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type)
    112 #endif
    113 
    114 /* Error testing and normalization */
    115 PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *);
    116 PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *);
    117 PyAPI_FUNC(void) PyErr_NormalizeException(PyObject**, PyObject**, PyObject**);
    118 
    119 /* Traceback manipulation (PEP 3134) */
    120 PyAPI_FUNC(int) PyException_SetTraceback(PyObject *, PyObject *);
    121 PyAPI_FUNC(PyObject *) PyException_GetTraceback(PyObject *);
    122 
    123 /* Cause manipulation (PEP 3134) */
    124 PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *);
    125 PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *);
    126 
    127 /* Context manipulation (PEP 3134) */
    128 PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *);
    129 PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *);
    130 #ifndef Py_LIMITED_API
    131 PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *);
    132 #endif
    133 
    134 /* */
    135 
    136 #define PyExceptionClass_Check(x)                                       \
    137     (PyType_Check((x)) &&                                               \
    138      PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
    139 
    140 #define PyExceptionInstance_Check(x)                    \
    141     PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS)
    142 
    143 #define PyExceptionClass_Name(x) \
    144      ((char *)(((PyTypeObject*)(x))->tp_name))
    145 
    146 #define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type))
    147 
    148 
    149 /* Predefined exceptions */
    150 
    151 PyAPI_DATA(PyObject *) PyExc_BaseException;
    152 PyAPI_DATA(PyObject *) PyExc_Exception;
    153 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
    154 PyAPI_DATA(PyObject *) PyExc_StopAsyncIteration;
    155 #endif
    156 PyAPI_DATA(PyObject *) PyExc_StopIteration;
    157 PyAPI_DATA(PyObject *) PyExc_GeneratorExit;
    158 PyAPI_DATA(PyObject *) PyExc_ArithmeticError;
    159 PyAPI_DATA(PyObject *) PyExc_LookupError;
    160 
    161 PyAPI_DATA(PyObject *) PyExc_AssertionError;
    162 PyAPI_DATA(PyObject *) PyExc_AttributeError;
    163 PyAPI_DATA(PyObject *) PyExc_BufferError;
    164 PyAPI_DATA(PyObject *) PyExc_EOFError;
    165 PyAPI_DATA(PyObject *) PyExc_FloatingPointError;
    166 PyAPI_DATA(PyObject *) PyExc_OSError;
    167 PyAPI_DATA(PyObject *) PyExc_ImportError;
    168 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
    169 PyAPI_DATA(PyObject *) PyExc_ModuleNotFoundError;
    170 #endif
    171 PyAPI_DATA(PyObject *) PyExc_IndexError;
    172 PyAPI_DATA(PyObject *) PyExc_KeyError;
    173 PyAPI_DATA(PyObject *) PyExc_KeyboardInterrupt;
    174 PyAPI_DATA(PyObject *) PyExc_MemoryError;
    175 PyAPI_DATA(PyObject *) PyExc_NameError;
    176 PyAPI_DATA(PyObject *) PyExc_OverflowError;
    177 PyAPI_DATA(PyObject *) PyExc_RuntimeError;
    178 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
    179 PyAPI_DATA(PyObject *) PyExc_RecursionError;
    180 #endif
    181 PyAPI_DATA(PyObject *) PyExc_NotImplementedError;
    182 PyAPI_DATA(PyObject *) PyExc_SyntaxError;
    183 PyAPI_DATA(PyObject *) PyExc_IndentationError;
    184 PyAPI_DATA(PyObject *) PyExc_TabError;
    185 PyAPI_DATA(PyObject *) PyExc_ReferenceError;
    186 PyAPI_DATA(PyObject *) PyExc_SystemError;
    187 PyAPI_DATA(PyObject *) PyExc_SystemExit;
    188 PyAPI_DATA(PyObject *) PyExc_TypeError;
    189 PyAPI_DATA(PyObject *) PyExc_UnboundLocalError;
    190 PyAPI_DATA(PyObject *) PyExc_UnicodeError;
    191 PyAPI_DATA(PyObject *) PyExc_UnicodeEncodeError;
    192 PyAPI_DATA(PyObject *) PyExc_UnicodeDecodeError;
    193 PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError;
    194 PyAPI_DATA(PyObject *) PyExc_ValueError;
    195 PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError;
    196 
    197 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
    198 PyAPI_DATA(PyObject *) PyExc_BlockingIOError;
    199 PyAPI_DATA(PyObject *) PyExc_BrokenPipeError;
    200 PyAPI_DATA(PyObject *) PyExc_ChildProcessError;
    201 PyAPI_DATA(PyObject *) PyExc_ConnectionError;
    202 PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError;
    203 PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError;
    204 PyAPI_DATA(PyObject *) PyExc_ConnectionResetError;
    205 PyAPI_DATA(PyObject *) PyExc_FileExistsError;
    206 PyAPI_DATA(PyObject *) PyExc_FileNotFoundError;
    207 PyAPI_DATA(PyObject *) PyExc_InterruptedError;
    208 PyAPI_DATA(PyObject *) PyExc_IsADirectoryError;
    209 PyAPI_DATA(PyObject *) PyExc_NotADirectoryError;
    210 PyAPI_DATA(PyObject *) PyExc_PermissionError;
    211 PyAPI_DATA(PyObject *) PyExc_ProcessLookupError;
    212 PyAPI_DATA(PyObject *) PyExc_TimeoutError;
    213 #endif
    214 
    215 
    216 /* Compatibility aliases */
    217 PyAPI_DATA(PyObject *) PyExc_EnvironmentError;
    218 PyAPI_DATA(PyObject *) PyExc_IOError;
    219 #ifdef MS_WINDOWS
    220 PyAPI_DATA(PyObject *) PyExc_WindowsError;
    221 #endif
    222 
    223 /* Predefined warning categories */
    224 PyAPI_DATA(PyObject *) PyExc_Warning;
    225 PyAPI_DATA(PyObject *) PyExc_UserWarning;
    226 PyAPI_DATA(PyObject *) PyExc_DeprecationWarning;
    227 PyAPI_DATA(PyObject *) PyExc_PendingDeprecationWarning;
    228 PyAPI_DATA(PyObject *) PyExc_SyntaxWarning;
    229 PyAPI_DATA(PyObject *) PyExc_RuntimeWarning;
    230 PyAPI_DATA(PyObject *) PyExc_FutureWarning;
    231 PyAPI_DATA(PyObject *) PyExc_ImportWarning;
    232 PyAPI_DATA(PyObject *) PyExc_UnicodeWarning;
    233 PyAPI_DATA(PyObject *) PyExc_BytesWarning;
    234 PyAPI_DATA(PyObject *) PyExc_ResourceWarning;
    235 
    236 
    237 /* Convenience functions */
    238 
    239 PyAPI_FUNC(int) PyErr_BadArgument(void);
    240 PyAPI_FUNC(PyObject *) PyErr_NoMemory(void);
    241 PyAPI_FUNC(PyObject *) PyErr_SetFromErrno(PyObject *);
    242 PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObject(
    243     PyObject *, PyObject *);
    244 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
    245 PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilenameObjects(
    246     PyObject *, PyObject *, PyObject *);
    247 #endif
    248 PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithFilename(
    249     PyObject *exc,
    250     const char *filename   /* decoded from the filesystem encoding */
    251     );
    252 #if defined(MS_WINDOWS) && !defined(Py_LIMITED_API)
    253 PyAPI_FUNC(PyObject *) PyErr_SetFromErrnoWithUnicodeFilename(
    254     PyObject *, const Py_UNICODE *) Py_DEPRECATED(3.3);
    255 #endif /* MS_WINDOWS */
    256 
    257 PyAPI_FUNC(PyObject *) PyErr_Format(
    258     PyObject *exception,
    259     const char *format,   /* ASCII-encoded string  */
    260     ...
    261     );
    262 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
    263 PyAPI_FUNC(PyObject *) PyErr_FormatV(
    264     PyObject *exception,
    265     const char *format,
    266     va_list vargs);
    267 #endif
    268 
    269 #ifndef Py_LIMITED_API
    270 /* Like PyErr_Format(), but saves current exception as __context__ and
    271    __cause__.
    272  */
    273 PyAPI_FUNC(PyObject *) _PyErr_FormatFromCause(
    274     PyObject *exception,
    275     const char *format,   /* ASCII-encoded string  */
    276     ...
    277     );
    278 #endif
    279 
    280 #ifdef MS_WINDOWS
    281 PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename(
    282     int ierr,
    283     const char *filename        /* decoded from the filesystem encoding */
    284     );
    285 #ifndef Py_LIMITED_API
    286 /* XXX redeclare to use WSTRING */
    287 PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithUnicodeFilename(
    288     int, const Py_UNICODE *) Py_DEPRECATED(3.3);
    289 #endif
    290 PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErr(int);
    291 PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObject(
    292     PyObject *,int, PyObject *);
    293 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000
    294 PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilenameObjects(
    295     PyObject *,int, PyObject *, PyObject *);
    296 #endif
    297 PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithFilename(
    298     PyObject *exc,
    299     int ierr,
    300     const char *filename        /* decoded from the filesystem encoding */
    301     );
    302 #ifndef Py_LIMITED_API
    303 PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErrWithUnicodeFilename(
    304     PyObject *,int, const Py_UNICODE *) Py_DEPRECATED(3.3);
    305 #endif
    306 PyAPI_FUNC(PyObject *) PyErr_SetExcFromWindowsErr(PyObject *, int);
    307 #endif /* MS_WINDOWS */
    308 
    309 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
    310 PyAPI_FUNC(PyObject *) PyErr_SetImportErrorSubclass(PyObject *, PyObject *,
    311     PyObject *, PyObject *);
    312 #endif
    313 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
    314 PyAPI_FUNC(PyObject *) PyErr_SetImportError(PyObject *, PyObject *,
    315     PyObject *);
    316 #endif
    317 
    318 /* Export the old function so that the existing API remains available: */
    319 PyAPI_FUNC(void) PyErr_BadInternalCall(void);
    320 PyAPI_FUNC(void) _PyErr_BadInternalCall(const char *filename, int lineno);
    321 /* Mask the old API with a call to the new API for code compiled under
    322    Python 2.0: */
    323 #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
    324 
    325 /* Function to create a new exception */
    326 PyAPI_FUNC(PyObject *) PyErr_NewException(
    327     const char *name, PyObject *base, PyObject *dict);
    328 PyAPI_FUNC(PyObject *) PyErr_NewExceptionWithDoc(
    329     const char *name, const char *doc, PyObject *base, PyObject *dict);
    330 PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *);
    331 
    332 /* In exceptions.c */
    333 #ifndef Py_LIMITED_API
    334 /* Helper that attempts to replace the current exception with one of the
    335  * same type but with a prefix added to the exception text. The resulting
    336  * exception description looks like:
    337  *
    338  *     prefix (exc_type: original_exc_str)
    339  *
    340  * Only some exceptions can be safely replaced. If the function determines
    341  * it isn't safe to perform the replacement, it will leave the original
    342  * unmodified exception in place.
    343  *
    344  * Returns a borrowed reference to the new exception (if any), NULL if the
    345  * existing exception was left in place.
    346  */
    347 PyAPI_FUNC(PyObject *) _PyErr_TrySetFromCause(
    348     const char *prefix_format,   /* ASCII-encoded string  */
    349     ...
    350     );
    351 #endif
    352 
    353 
    354 /* In signalmodule.c */
    355 PyAPI_FUNC(int) PyErr_CheckSignals(void);
    356 PyAPI_FUNC(void) PyErr_SetInterrupt(void);
    357 
    358 /* In signalmodule.c */
    359 #ifndef Py_LIMITED_API
    360 int PySignal_SetWakeupFd(int fd);
    361 #endif
    362 
    363 /* Support for adding program text to SyntaxErrors */
    364 PyAPI_FUNC(void) PyErr_SyntaxLocation(
    365     const char *filename,       /* decoded from the filesystem encoding */
    366     int lineno);
    367 PyAPI_FUNC(void) PyErr_SyntaxLocationEx(
    368     const char *filename,       /* decoded from the filesystem encoding */
    369     int lineno,
    370     int col_offset);
    371 #ifndef Py_LIMITED_API
    372 PyAPI_FUNC(void) PyErr_SyntaxLocationObject(
    373     PyObject *filename,
    374     int lineno,
    375     int col_offset);
    376 #endif
    377 PyAPI_FUNC(PyObject *) PyErr_ProgramText(
    378     const char *filename,       /* decoded from the filesystem encoding */
    379     int lineno);
    380 #ifndef Py_LIMITED_API
    381 PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject(
    382     PyObject *filename,
    383     int lineno);
    384 #endif
    385 
    386 /* The following functions are used to create and modify unicode
    387    exceptions from C */
    388 
    389 /* create a UnicodeDecodeError object */
    390 PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_Create(
    391     const char *encoding,       /* UTF-8 encoded string */
    392     const char *object,
    393     Py_ssize_t length,
    394     Py_ssize_t start,
    395     Py_ssize_t end,
    396     const char *reason          /* UTF-8 encoded string */
    397     );
    398 
    399 /* create a UnicodeEncodeError object */
    400 #ifndef Py_LIMITED_API
    401 PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create(
    402     const char *encoding,       /* UTF-8 encoded string */
    403     const Py_UNICODE *object,
    404     Py_ssize_t length,
    405     Py_ssize_t start,
    406     Py_ssize_t end,
    407     const char *reason          /* UTF-8 encoded string */
    408     ) Py_DEPRECATED(3.3);
    409 #endif
    410 
    411 /* create a UnicodeTranslateError object */
    412 #ifndef Py_LIMITED_API
    413 PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create(
    414     const Py_UNICODE *object,
    415     Py_ssize_t length,
    416     Py_ssize_t start,
    417     Py_ssize_t end,
    418     const char *reason          /* UTF-8 encoded string */
    419     ) Py_DEPRECATED(3.3);
    420 PyAPI_FUNC(PyObject *) _PyUnicodeTranslateError_Create(
    421     PyObject *object,
    422     Py_ssize_t start,
    423     Py_ssize_t end,
    424     const char *reason          /* UTF-8 encoded string */
    425     );
    426 #endif
    427 
    428 /* get the encoding attribute */
    429 PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetEncoding(PyObject *);
    430 PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetEncoding(PyObject *);
    431 
    432 /* get the object attribute */
    433 PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetObject(PyObject *);
    434 PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetObject(PyObject *);
    435 PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetObject(PyObject *);
    436 
    437 /* get the value of the start attribute (the int * may not be NULL)
    438    return 0 on success, -1 on failure */
    439 PyAPI_FUNC(int) PyUnicodeEncodeError_GetStart(PyObject *, Py_ssize_t *);
    440 PyAPI_FUNC(int) PyUnicodeDecodeError_GetStart(PyObject *, Py_ssize_t *);
    441 PyAPI_FUNC(int) PyUnicodeTranslateError_GetStart(PyObject *, Py_ssize_t *);
    442 
    443 /* assign a new value to the start attribute
    444    return 0 on success, -1 on failure */
    445 PyAPI_FUNC(int) PyUnicodeEncodeError_SetStart(PyObject *, Py_ssize_t);
    446 PyAPI_FUNC(int) PyUnicodeDecodeError_SetStart(PyObject *, Py_ssize_t);
    447 PyAPI_FUNC(int) PyUnicodeTranslateError_SetStart(PyObject *, Py_ssize_t);
    448 
    449 /* get the value of the end attribute (the int *may not be NULL)
    450  return 0 on success, -1 on failure */
    451 PyAPI_FUNC(int) PyUnicodeEncodeError_GetEnd(PyObject *, Py_ssize_t *);
    452 PyAPI_FUNC(int) PyUnicodeDecodeError_GetEnd(PyObject *, Py_ssize_t *);
    453 PyAPI_FUNC(int) PyUnicodeTranslateError_GetEnd(PyObject *, Py_ssize_t *);
    454 
    455 /* assign a new value to the end attribute
    456    return 0 on success, -1 on failure */
    457 PyAPI_FUNC(int) PyUnicodeEncodeError_SetEnd(PyObject *, Py_ssize_t);
    458 PyAPI_FUNC(int) PyUnicodeDecodeError_SetEnd(PyObject *, Py_ssize_t);
    459 PyAPI_FUNC(int) PyUnicodeTranslateError_SetEnd(PyObject *, Py_ssize_t);
    460 
    461 /* get the value of the reason attribute */
    462 PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_GetReason(PyObject *);
    463 PyAPI_FUNC(PyObject *) PyUnicodeDecodeError_GetReason(PyObject *);
    464 PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_GetReason(PyObject *);
    465 
    466 /* assign a new value to the reason attribute
    467    return 0 on success, -1 on failure */
    468 PyAPI_FUNC(int) PyUnicodeEncodeError_SetReason(
    469     PyObject *exc,
    470     const char *reason          /* UTF-8 encoded string */
    471     );
    472 PyAPI_FUNC(int) PyUnicodeDecodeError_SetReason(
    473     PyObject *exc,
    474     const char *reason          /* UTF-8 encoded string */
    475     );
    476 PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason(
    477     PyObject *exc,
    478     const char *reason          /* UTF-8 encoded string */
    479     );
    480 
    481 /* These APIs aren't really part of the error implementation, but
    482    often needed to format error messages; the native C lib APIs are
    483    not available on all platforms, which is why we provide emulations
    484    for those platforms in Python/mysnprintf.c,
    485    WARNING:  The return value of snprintf varies across platforms; do
    486    not rely on any particular behavior; eventually the C99 defn may
    487    be reliable.
    488 */
    489 #if defined(MS_WIN32) && !defined(HAVE_SNPRINTF)
    490 # define HAVE_SNPRINTF
    491 # define snprintf _snprintf
    492 # define vsnprintf _vsnprintf
    493 #endif
    494 
    495 #include <stdarg.h>
    496 PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char  *format, ...)
    497                         Py_GCC_ATTRIBUTE((format(printf, 3, 4)));
    498 PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
    499                         Py_GCC_ATTRIBUTE((format(printf, 3, 0)));
    500 
    501 #ifdef __cplusplus
    502 }
    503 #endif
    504 #endif /* !Py_ERRORS_H */
    505