#ifndef Py_INTERNAL_FILEUTILS_H #define Py_INTERNAL_FILEUTILS_H #ifdef __cplusplus extern "C" { #endif #ifndef Py_BUILD_CORE # error "Py_BUILD_CORE must be defined to include this header" #endif #include /* struct lconv */ // This is used after getting NULL back from Py_DecodeLocale(). #define DECODE_LOCALE_ERR(NAME, LEN) \ ((LEN) == (size_t)-2) \ ? _PyStatus_ERR("cannot decode " NAME) \ : _PyStatus_NO_MEMORY() PyAPI_DATA(int) _Py_HasFileSystemDefaultEncodeErrors; PyAPI_FUNC(int) _Py_DecodeUTF8Ex( const char *arg, Py_ssize_t arglen, wchar_t **wstr, size_t *wlen, const char **reason, _Py_error_handler errors); PyAPI_FUNC(int) _Py_EncodeUTF8Ex( const wchar_t *text, char **str, size_t *error_pos, const char **reason, int raw_malloc, _Py_error_handler errors); PyAPI_FUNC(wchar_t*) _Py_DecodeUTF8_surrogateescape( const char *arg, Py_ssize_t arglen, size_t *wlen); extern int _Py_wstat(const wchar_t *, struct stat *); PyAPI_FUNC(int) _Py_GetForceASCII(void); /* Reset "force ASCII" mode (if it was initialized). This function should be called when Python changes the LC_CTYPE locale, so the "force ASCII" mode can be detected again on the new locale encoding. */ PyAPI_FUNC(void) _Py_ResetForceASCII(void); PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( struct lconv *lc, PyObject **decimal_point, PyObject **thousands_sep); PyAPI_FUNC(void) _Py_closerange(int first, int last); PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(void); PyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void); #ifdef HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION extern int _Py_LocaleUsesNonUnicodeWchar(void); extern wchar_t* _Py_DecodeNonUnicodeWchar( const wchar_t* native, Py_ssize_t size); extern int _Py_EncodeNonUnicodeWchar_InPlace( wchar_t* unicode, Py_ssize_t size); #endif extern int _Py_isabs(const wchar_t *path); extern int _Py_abspath(const wchar_t *path, wchar_t **abspath_p); extern wchar_t * _Py_join_relfile(const wchar_t *dirname, const wchar_t *relfile); extern int _Py_add_relfile(wchar_t *dirname, const wchar_t *relfile, size_t bufsize); extern size_t _Py_find_basename(const wchar_t *filename); PyAPI_FUNC(wchar_t *) _Py_normpath(wchar_t *path, Py_ssize_t size); // Macros to protect CRT calls against instant termination when passed an // invalid parameter (bpo-23524). IPH stands for Invalid Parameter Handler. // Usage: // // _Py_BEGIN_SUPPRESS_IPH // ... // _Py_END_SUPPRESS_IPH #if defined _MSC_VER && _MSC_VER >= 1900 # include // _set_thread_local_invalid_parameter_handler() extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; # define _Py_BEGIN_SUPPRESS_IPH \ { _invalid_parameter_handler _Py_old_handler = \ _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler); # define _Py_END_SUPPRESS_IPH \ _set_thread_local_invalid_parameter_handler(_Py_old_handler); } #else # define _Py_BEGIN_SUPPRESS_IPH # define _Py_END_SUPPRESS_IPH #endif /* _MSC_VER >= 1900 */ #ifdef __cplusplus } #endif #endif /* !Py_INTERNAL_FILEUTILS_H */