17db96d56Sopenharmony_ci#ifndef Py_CODECREGISTRY_H 27db96d56Sopenharmony_ci#define Py_CODECREGISTRY_H 37db96d56Sopenharmony_ci#ifdef __cplusplus 47db96d56Sopenharmony_ciextern "C" { 57db96d56Sopenharmony_ci#endif 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci/* ------------------------------------------------------------------------ 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci Python Codec Registry and support functions 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ciWritten by Marc-Andre Lemburg (mal@lemburg.com). 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciCopyright (c) Corporation for National Research Initiatives. 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci ------------------------------------------------------------------------ */ 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci/* Register a new codec search function. 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci As side effect, this tries to load the encodings package, if not 217db96d56Sopenharmony_ci yet done, to make sure that it is always first in the list of 227db96d56Sopenharmony_ci search functions. 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci The search_function's refcount is incremented by this function. */ 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ciPyAPI_FUNC(int) PyCodec_Register( 277db96d56Sopenharmony_ci PyObject *search_function 287db96d56Sopenharmony_ci ); 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci/* Unregister a codec search function and clear the registry's cache. 317db96d56Sopenharmony_ci If the search function is not registered, do nothing. 327db96d56Sopenharmony_ci Return 0 on success. Raise an exception and return -1 on error. */ 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ciPyAPI_FUNC(int) PyCodec_Unregister( 357db96d56Sopenharmony_ci PyObject *search_function 367db96d56Sopenharmony_ci ); 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci/* Codec registry lookup API. 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci Looks up the given encoding and returns a CodecInfo object with 417db96d56Sopenharmony_ci function attributes which implement the different aspects of 427db96d56Sopenharmony_ci processing the encoding. 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci The encoding string is looked up converted to all lower-case 457db96d56Sopenharmony_ci characters. This makes encodings looked up through this mechanism 467db96d56Sopenharmony_ci effectively case-insensitive. 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci If no codec is found, a KeyError is set and NULL returned. 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci As side effect, this tries to load the encodings package, if not 517db96d56Sopenharmony_ci yet done. This is part of the lazy load strategy for the encodings 527db96d56Sopenharmony_ci package. 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci */ 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci#ifndef Py_LIMITED_API 577db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyCodec_Lookup( 587db96d56Sopenharmony_ci const char *encoding 597db96d56Sopenharmony_ci ); 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyCodec_Forget( 627db96d56Sopenharmony_ci const char *encoding 637db96d56Sopenharmony_ci ); 647db96d56Sopenharmony_ci#endif 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci/* Codec registry encoding check API. 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci Returns 1/0 depending on whether there is a registered codec for 697db96d56Sopenharmony_ci the given encoding. 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci*/ 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ciPyAPI_FUNC(int) PyCodec_KnownEncoding( 747db96d56Sopenharmony_ci const char *encoding 757db96d56Sopenharmony_ci ); 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci/* Generic codec based encoding API. 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ci object is passed through the encoder function found for the given 807db96d56Sopenharmony_ci encoding using the error handling method defined by errors. errors 817db96d56Sopenharmony_ci may be NULL to use the default method defined for the codec. 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci Raises a LookupError in case no encoder can be found. 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci */ 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_Encode( 887db96d56Sopenharmony_ci PyObject *object, 897db96d56Sopenharmony_ci const char *encoding, 907db96d56Sopenharmony_ci const char *errors 917db96d56Sopenharmony_ci ); 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci/* Generic codec based decoding API. 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci object is passed through the decoder function found for the given 967db96d56Sopenharmony_ci encoding using the error handling method defined by errors. errors 977db96d56Sopenharmony_ci may be NULL to use the default method defined for the codec. 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci Raises a LookupError in case no encoder can be found. 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci */ 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_Decode( 1047db96d56Sopenharmony_ci PyObject *object, 1057db96d56Sopenharmony_ci const char *encoding, 1067db96d56Sopenharmony_ci const char *errors 1077db96d56Sopenharmony_ci ); 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci#ifndef Py_LIMITED_API 1107db96d56Sopenharmony_ci/* Text codec specific encoding and decoding API. 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci Checks the encoding against a list of codecs which do not 1137db96d56Sopenharmony_ci implement a str<->bytes encoding before attempting the 1147db96d56Sopenharmony_ci operation. 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci Please note that these APIs are internal and should not 1177db96d56Sopenharmony_ci be used in Python C extensions. 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci XXX (ncoghlan): should we make these, or something like them, public 1207db96d56Sopenharmony_ci in Python 3.5+? 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci */ 1237db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyCodec_LookupTextEncoding( 1247db96d56Sopenharmony_ci const char *encoding, 1257db96d56Sopenharmony_ci const char *alternate_command 1267db96d56Sopenharmony_ci ); 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyCodec_EncodeText( 1297db96d56Sopenharmony_ci PyObject *object, 1307db96d56Sopenharmony_ci const char *encoding, 1317db96d56Sopenharmony_ci const char *errors 1327db96d56Sopenharmony_ci ); 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyCodec_DecodeText( 1357db96d56Sopenharmony_ci PyObject *object, 1367db96d56Sopenharmony_ci const char *encoding, 1377db96d56Sopenharmony_ci const char *errors 1387db96d56Sopenharmony_ci ); 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ci/* These two aren't actually text encoding specific, but _io.TextIOWrapper 1417db96d56Sopenharmony_ci * is the only current API consumer. 1427db96d56Sopenharmony_ci */ 1437db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalDecoder( 1447db96d56Sopenharmony_ci PyObject *codec_info, 1457db96d56Sopenharmony_ci const char *errors 1467db96d56Sopenharmony_ci ); 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) _PyCodecInfo_GetIncrementalEncoder( 1497db96d56Sopenharmony_ci PyObject *codec_info, 1507db96d56Sopenharmony_ci const char *errors 1517db96d56Sopenharmony_ci ); 1527db96d56Sopenharmony_ci#endif 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci/* --- Codec Lookup APIs -------------------------------------------------- 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci All APIs return a codec object with incremented refcount and are 1597db96d56Sopenharmony_ci based on _PyCodec_Lookup(). The same comments w/r to the encoding 1607db96d56Sopenharmony_ci name also apply to these APIs. 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci*/ 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci/* Get an encoder function for the given encoding. */ 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_Encoder( 1677db96d56Sopenharmony_ci const char *encoding 1687db96d56Sopenharmony_ci ); 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ci/* Get a decoder function for the given encoding. */ 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_Decoder( 1737db96d56Sopenharmony_ci const char *encoding 1747db96d56Sopenharmony_ci ); 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci/* Get an IncrementalEncoder object for the given encoding. */ 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder( 1797db96d56Sopenharmony_ci const char *encoding, 1807db96d56Sopenharmony_ci const char *errors 1817db96d56Sopenharmony_ci ); 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci/* Get an IncrementalDecoder object function for the given encoding. */ 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder( 1867db96d56Sopenharmony_ci const char *encoding, 1877db96d56Sopenharmony_ci const char *errors 1887db96d56Sopenharmony_ci ); 1897db96d56Sopenharmony_ci 1907db96d56Sopenharmony_ci/* Get a StreamReader factory function for the given encoding. */ 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_StreamReader( 1937db96d56Sopenharmony_ci const char *encoding, 1947db96d56Sopenharmony_ci PyObject *stream, 1957db96d56Sopenharmony_ci const char *errors 1967db96d56Sopenharmony_ci ); 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci/* Get a StreamWriter factory function for the given encoding. */ 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_StreamWriter( 2017db96d56Sopenharmony_ci const char *encoding, 2027db96d56Sopenharmony_ci PyObject *stream, 2037db96d56Sopenharmony_ci const char *errors 2047db96d56Sopenharmony_ci ); 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci/* Unicode encoding error handling callback registry API */ 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci/* Register the error handling callback function error under the given 2097db96d56Sopenharmony_ci name. This function will be called by the codec when it encounters 2107db96d56Sopenharmony_ci unencodable characters/undecodable bytes and doesn't know the 2117db96d56Sopenharmony_ci callback name, when name is specified as the error parameter 2127db96d56Sopenharmony_ci in the call to the encode/decode function. 2137db96d56Sopenharmony_ci Return 0 on success, -1 on error */ 2147db96d56Sopenharmony_ciPyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error); 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci/* Lookup the error handling callback function registered under the given 2177db96d56Sopenharmony_ci name. As a special case NULL can be passed, in which case 2187db96d56Sopenharmony_ci the error handling callback for "strict" will be returned. */ 2197db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name); 2207db96d56Sopenharmony_ci 2217db96d56Sopenharmony_ci/* raise exc as an exception */ 2227db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc); 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci/* ignore the unicode error, skipping the faulty input */ 2257db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc); 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci/* replace the unicode encode error with ? or U+FFFD */ 2287db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc); 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci/* replace the unicode encode error with XML character references */ 2317db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc); 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci/* replace the unicode encode error with backslash escapes (\x, \u and \U) */ 2347db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 2377db96d56Sopenharmony_ci/* replace the unicode encode error with backslash escapes (\N, \x, \u and \U) */ 2387db96d56Sopenharmony_ciPyAPI_FUNC(PyObject *) PyCodec_NameReplaceErrors(PyObject *exc); 2397db96d56Sopenharmony_ci#endif 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci#ifndef Py_LIMITED_API 2427db96d56Sopenharmony_ciPyAPI_DATA(const char *) Py_hexdigits; 2437db96d56Sopenharmony_ci#endif 2447db96d56Sopenharmony_ci 2457db96d56Sopenharmony_ci#ifdef __cplusplus 2467db96d56Sopenharmony_ci} 2477db96d56Sopenharmony_ci#endif 2487db96d56Sopenharmony_ci#endif /* !Py_CODECREGISTRY_H */ 249