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