@@ -3125,8 +3125,31 @@ wcstombs_errorpos(const wchar_t *wstr)
31253125 return 0 ;
31263126}
31273127
3128+ static int
3129+ locale_error_handler (const char * errors , int * surrogateescape )
3130+ {
3131+ if (errors == NULL ) {
3132+ * surrogateescape = 0 ;
3133+ return 0 ;
3134+ }
3135+
3136+ if (strcmp (errors , "strict" ) == 0 ) {
3137+ * surrogateescape = 0 ;
3138+ return 0 ;
3139+ }
3140+ if (strcmp (errors , "surrogateescape" ) == 0 ) {
3141+ * surrogateescape = 1 ;
3142+ return 0 ;
3143+ }
3144+ PyErr_Format (PyExc_ValueError ,
3145+ "only 'strict' and 'surrogateescape' error handlers "
3146+ "are supported, not '%s'" ,
3147+ errors );
3148+ return -1 ;
3149+ }
3150+
31283151PyObject *
3129- PyUnicode_EncodeLocale (PyObject * unicode , int surrogateescape )
3152+ PyUnicode_EncodeLocale (PyObject * unicode , const char * errors )
31303153{
31313154 Py_ssize_t wlen , wlen2 ;
31323155 wchar_t * wstr ;
@@ -3135,6 +3158,10 @@ PyUnicode_EncodeLocale(PyObject *unicode, int surrogateescape)
31353158 PyObject * reason ;
31363159 PyObject * exc ;
31373160 size_t error_pos ;
3161+ int surrogateescape ;
3162+
3163+ if (locale_error_handler (errors , & surrogateescape ) < 0 )
3164+ return NULL ;
31383165
31393166 wstr = PyUnicode_AsWideCharString (unicode , & wlen );
31403167 if (wstr == NULL )
@@ -3198,7 +3225,7 @@ PyUnicode_EncodeLocale(PyObject *unicode, int surrogateescape)
31983225 Py_XDECREF (bytes );
31993226
32003227 if (errmsg != NULL )
3201- reason = PyUnicode_DecodeLocale (errmsg , 1 );
3228+ reason = PyUnicode_DecodeLocale (errmsg , "surrogateescape" );
32023229 else
32033230 reason = PyUnicode_FromString (
32043231 "wcstombs() encountered an unencodable "
@@ -3243,7 +3270,7 @@ PyUnicode_EncodeFSDefault(PyObject *unicode)
32433270 "surrogateescape" );
32443271 }
32453272 else {
3246- return PyUnicode_EncodeLocale (unicode , 1 );
3273+ return PyUnicode_EncodeLocale (unicode , "surrogateescape" );
32473274 }
32483275#endif
32493276}
@@ -3351,13 +3378,17 @@ PyUnicode_AsEncodedUnicode(PyObject *unicode,
33513378
33523379PyObject *
33533380PyUnicode_DecodeLocaleAndSize (const char * str , Py_ssize_t len ,
3354- int surrogateescape )
3381+ const char * errors )
33553382{
33563383 wchar_t smallbuf [256 ];
33573384 size_t smallbuf_len = Py_ARRAY_LENGTH (smallbuf );
33583385 wchar_t * wstr ;
33593386 size_t wlen , wlen2 ;
33603387 PyObject * unicode ;
3388+ int surrogateescape ;
3389+
3390+ if (locale_error_handler (errors , & surrogateescape ) < 0 )
3391+ return NULL ;
33613392
33623393 if (str [len ] != '\0' || len != strlen (str )) {
33633394 PyErr_SetString (PyExc_TypeError , "embedded null character" );
@@ -3419,10 +3450,10 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len,
34193450}
34203451
34213452PyObject *
3422- PyUnicode_DecodeLocale (const char * str , int surrogateescape )
3453+ PyUnicode_DecodeLocale (const char * str , const char * errors )
34233454{
34243455 Py_ssize_t size = (Py_ssize_t )strlen (str );
3425- return PyUnicode_DecodeLocaleAndSize (str , size , surrogateescape );
3456+ return PyUnicode_DecodeLocaleAndSize (str , size , errors );
34263457}
34273458
34283459
@@ -3456,7 +3487,7 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size)
34563487 "surrogateescape" );
34573488 }
34583489 else {
3459- return PyUnicode_DecodeLocaleAndSize (s , size , 1 );
3490+ return PyUnicode_DecodeLocaleAndSize (s , size , "surrogateescape" );
34603491 }
34613492#endif
34623493}
0 commit comments