mirror of https://github.com/python/cpython
Merged revisions 86561-86562,86564-86565,86705,86708,86713 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r86561 | georg.brandl | 2010-11-20 12:47:10 +0100 (Sa, 20 Nov 2010) | 1 line #10460: Update indent.pro to match PEP 7 better. ........ r86562 | georg.brandl | 2010-11-20 14:44:41 +0100 (Sa, 20 Nov 2010) | 1 line #10439: document PyCodec C APIs. ........ r86564 | georg.brandl | 2010-11-20 15:08:53 +0100 (Sa, 20 Nov 2010) | 1 line #10460: an even better indent.pro. ........ r86565 | georg.brandl | 2010-11-20 15:16:17 +0100 (Sa, 20 Nov 2010) | 1 line socket.gethostbyname(socket.gethostname()) can fail when host name resolution is not set up correctly; do not fail test_socket if this is the case. ........ r86705 | georg.brandl | 2010-11-23 08:54:19 +0100 (Di, 23 Nov 2010) | 1 line #10468: document Unicode exception creation and access functions. ........ r86708 | georg.brandl | 2010-11-23 09:37:54 +0100 (Di, 23 Nov 2010) | 2 lines #10511: clarification of what heaps are; suggested by Johannes Hoff. ........ r86713 | georg.brandl | 2010-11-23 19:14:57 +0100 (Di, 23 Nov 2010) | 1 line assert.h is also included. Thanks to Savio Sena. ........
This commit is contained in:
parent
0a8e5626ad
commit
b727650e0c
|
@ -0,0 +1,118 @@
|
||||||
|
.. _codec-registry:
|
||||||
|
|
||||||
|
Codec registry and support functions
|
||||||
|
====================================
|
||||||
|
|
||||||
|
.. cfunction:: int PyCodec_Register(PyObject *search_function)
|
||||||
|
|
||||||
|
Register a new codec search function.
|
||||||
|
|
||||||
|
As side effect, this tries to load the :mod:`encodings` package, if not yet
|
||||||
|
done, to make sure that it is always first in the list of search functions.
|
||||||
|
|
||||||
|
.. cfunction:: int PyCodec_KnownEncoding(const char *encoding)
|
||||||
|
|
||||||
|
Return ``1`` or ``0`` depending on whether there is a registered codec for
|
||||||
|
the given *encoding*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_Encode(PyObject *object, const char *encoding, const char *errors)
|
||||||
|
|
||||||
|
Generic codec based encoding API.
|
||||||
|
|
||||||
|
*object* is passed through the encoder function found for the given
|
||||||
|
*encoding* using the error handling method defined by *errors*. *errors* may
|
||||||
|
be *NULL* to use the default method defined for the codec. Raises a
|
||||||
|
:exc:`LookupError` if no encoder can be found.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_Decode(PyObject *object, const char *encoding, const char *errors)
|
||||||
|
|
||||||
|
Generic codec based decoding API.
|
||||||
|
|
||||||
|
*object* is passed through the decoder function found for the given
|
||||||
|
*encoding* using the error handling method defined by *errors*. *errors* may
|
||||||
|
be *NULL* to use the default method defined for the codec. Raises a
|
||||||
|
:exc:`LookupError` if no encoder can be found.
|
||||||
|
|
||||||
|
|
||||||
|
Codec lookup API
|
||||||
|
----------------
|
||||||
|
|
||||||
|
In the following functions, the *encoding* string is looked up converted to all
|
||||||
|
lower-case characters, which makes encodings looked up through this mechanism
|
||||||
|
effectively case-insensitive. If no codec is found, a :exc:`KeyError` is set
|
||||||
|
and *NULL* returned.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_Encoder(const char *encoding)
|
||||||
|
|
||||||
|
Get an encoder function for the given *encoding*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_Decoder(const char *encoding)
|
||||||
|
|
||||||
|
Get a decoder function for the given *encoding*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_IncrementalEncoder(const char *encoding, const char *errors)
|
||||||
|
|
||||||
|
Get an :class:`IncrementalEncoder` object for the given *encoding*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_IncrementalDecoder(const char *encoding, const char *errors)
|
||||||
|
|
||||||
|
Get an :class:`IncrementalDecoder` object for the given *encoding*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_StreamReader(const char *encoding, PyObject *stream, const char *errors)
|
||||||
|
|
||||||
|
Get a :class:`StreamReader` factory function for the given *encoding*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_StreamWriter(const char *encoding, PyObject *stream, const char *errors)
|
||||||
|
|
||||||
|
Get a :class:`StreamWriter` factory function for the given *encoding*.
|
||||||
|
|
||||||
|
|
||||||
|
Registry API for Unicode encoding error handlers
|
||||||
|
------------------------------------------------
|
||||||
|
|
||||||
|
.. cfunction:: int PyCodec_RegisterError(const char *name, PyObject *error)
|
||||||
|
|
||||||
|
Register the error handling callback function *error* under the given *name*.
|
||||||
|
This callback function will be called by a codec when it encounters
|
||||||
|
unencodable characters/undecodable bytes and *name* is specified as the error
|
||||||
|
parameter in the call to the encode/decode function.
|
||||||
|
|
||||||
|
The callback gets a single argument, an instance of
|
||||||
|
:exc:`UnicodeEncodeError`, :exc:`UnicodeDecodeError` or
|
||||||
|
:exc:`UnicodeTranslateError` that holds information about the problematic
|
||||||
|
sequence of characters or bytes and their offset in the original string (see
|
||||||
|
:ref:`unicodeexceptions` for functions to extract this information). The
|
||||||
|
callback must either raise the given exception, or return a two-item tuple
|
||||||
|
containing the replacement for the problematic sequence, and an integer
|
||||||
|
giving the offset in the original string at which encoding/decoding should be
|
||||||
|
resumed.
|
||||||
|
|
||||||
|
Return ``0`` on success, ``-1`` on error.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_LookupError(const char *name)
|
||||||
|
|
||||||
|
Lookup the error handling callback function registered under *name*. As a
|
||||||
|
special case *NULL* can be passed, in which case the error handling callback
|
||||||
|
for "strict" will be returned.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_StrictErrors(PyObject *exc)
|
||||||
|
|
||||||
|
Raise *exc* as an exception.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_IgnoreErrors(PyObject *exc)
|
||||||
|
|
||||||
|
Ignore the unicode error, skipping the faulty input.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_ReplaceErrors(PyObject *exc)
|
||||||
|
|
||||||
|
Replace the unicode encode error with ``?`` or ``U+FFFD``.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
|
||||||
|
|
||||||
|
Replace the unicode encode error with XML character references.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyCodec_BackslashReplaceErrors(PyObject *exc)
|
||||||
|
|
||||||
|
Replace the unicode encode error with backslash escapes (``\x``, ``\u`` and
|
||||||
|
``\U``).
|
||||||
|
|
|
@ -454,6 +454,83 @@ is a separate error indicator for each thread.
|
||||||
the warning message.
|
the warning message.
|
||||||
|
|
||||||
|
|
||||||
|
.. _unicodeexceptions:
|
||||||
|
|
||||||
|
Unicode Exception Objects
|
||||||
|
=========================
|
||||||
|
|
||||||
|
The following functions are used to create and modify Unicode exceptions from C.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyUnicodeDecodeError_Create(const char *encoding, const char *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)
|
||||||
|
|
||||||
|
Create a :class:`UnicodeDecodeError` object with the attributes *encoding*,
|
||||||
|
*object*, *length*, *start*, *end* and *reason*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyUnicodeEncodeError_Create(const char *encoding, const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)
|
||||||
|
|
||||||
|
Create a :class:`UnicodeEncodeError` object with the attributes *encoding*,
|
||||||
|
*object*, *length*, *start*, *end* and *reason*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyUnicodeTranslateError_Create(const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason)
|
||||||
|
|
||||||
|
Create a :class:`UnicodeTranslateError` object with the attributes *object*,
|
||||||
|
*length*, *start*, *end* and *reason*.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyUnicodeDecodeError_GetEncoding(PyObject *exc)
|
||||||
|
PyObject* PyUnicodeEncodeError_GetEncoding(PyObject *exc)
|
||||||
|
|
||||||
|
Return the *encoding* attribute of the given exception object.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyUnicodeDecodeError_GetObject(PyObject *exc)
|
||||||
|
PyObject* PyUnicodeEncodeError_GetObject(PyObject *exc)
|
||||||
|
PyObject* PyUnicodeTranslateError_GetObject(PyObject *exc)
|
||||||
|
|
||||||
|
Return the *object* attribute of the given exception object.
|
||||||
|
|
||||||
|
.. cfunction:: int PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
|
||||||
|
int PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
|
||||||
|
int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
|
||||||
|
|
||||||
|
Get the *start* attribute of the given exception object and place it into
|
||||||
|
*\*start*. *start* must not be *NULL*. Return ``0`` on success, ``-1`` on
|
||||||
|
failure.
|
||||||
|
|
||||||
|
.. cfunction:: int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
|
||||||
|
int PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
|
||||||
|
int PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
|
||||||
|
|
||||||
|
Set the *start* attribute of the given exception object to *start*. Return
|
||||||
|
``0`` on success, ``-1`` on failure.
|
||||||
|
|
||||||
|
.. cfunction:: int PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
|
||||||
|
int PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
|
||||||
|
int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)
|
||||||
|
|
||||||
|
Get the *end* attribute of the given exception object and place it into
|
||||||
|
*\*end*. *end* must not be *NULL*. Return ``0`` on success, ``-1`` on
|
||||||
|
failure.
|
||||||
|
|
||||||
|
.. cfunction:: int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
|
||||||
|
int PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
|
||||||
|
int PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
|
||||||
|
|
||||||
|
Set the *end* attribute of the given exception object to *end*. Return ``0``
|
||||||
|
on success, ``-1`` on failure.
|
||||||
|
|
||||||
|
.. cfunction:: PyObject* PyUnicodeDecodeError_GetReason(PyObject *exc)
|
||||||
|
PyObject* PyUnicodeEncodeError_GetReason(PyObject *exc)
|
||||||
|
PyObject* PyUnicodeTranslateError_GetReason(PyObject *exc)
|
||||||
|
|
||||||
|
Return the *reason* attribute of the given exception object.
|
||||||
|
|
||||||
|
.. cfunction:: int PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
|
||||||
|
int PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
|
||||||
|
int PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
|
||||||
|
|
||||||
|
Set the *reason* attribute of the given exception object to *reason*. Return
|
||||||
|
``0`` on success, ``-1`` on failure.
|
||||||
|
|
||||||
|
|
||||||
Recursion Control
|
Recursion Control
|
||||||
=================
|
=================
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,8 @@ included in your code by the following line::
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
|
||||||
This implies inclusion of the following standard headers: ``<stdio.h>``,
|
This implies inclusion of the following standard headers: ``<stdio.h>``,
|
||||||
``<string.h>``, ``<errno.h>``, ``<limits.h>``, and ``<stdlib.h>`` (if
|
``<string.h>``, ``<errno.h>``, ``<limits.h>``, ``<assert.h>`` and ``<stdlib.h>``
|
||||||
available).
|
(if available).
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
|
|
@ -19,3 +19,4 @@ and parsing function arguments and constructing Python values from C values.
|
||||||
arg.rst
|
arg.rst
|
||||||
conversion.rst
|
conversion.rst
|
||||||
reflection.rst
|
reflection.rst
|
||||||
|
codec.rst
|
||||||
|
|
|
@ -18,11 +18,12 @@ as the priority queue algorithm.
|
||||||
Latest version of the `heapq Python source code
|
Latest version of the `heapq Python source code
|
||||||
<http://svn.python.org/view/python/branches/release27-maint/Lib/heapq.py?view=markup>`_
|
<http://svn.python.org/view/python/branches/release27-maint/Lib/heapq.py?view=markup>`_
|
||||||
|
|
||||||
Heaps are arrays for which ``heap[k] <= heap[2*k+1]`` and ``heap[k] <=
|
Heaps are binary trees for which every parent node has a value less than or
|
||||||
heap[2*k+2]`` for all *k*, counting elements from zero. For the sake of
|
equal to any of its children. This implementation uses arrays for which
|
||||||
comparison, non-existing elements are considered to be infinite. The
|
``heap[k] <= heap[2*k+1]`` and ``heap[k] <= heap[2*k+2]`` for all *k*, counting
|
||||||
interesting property of a heap is that ``heap[0]`` is always its smallest
|
elements from zero. For the sake of comparison, non-existing elements are
|
||||||
element.
|
considered to be infinite. The interesting property of a heap is that its
|
||||||
|
smallest element is always the root, ``heap[0]``.
|
||||||
|
|
||||||
The API below differs from textbook heap algorithms in two aspects: (a) We use
|
The API below differs from textbook heap algorithms in two aspects: (a) We use
|
||||||
zero-based indexing. This makes the relationship between the index for a node
|
zero-based indexing. This makes the relationship between the index for a node
|
||||||
|
|
|
@ -133,7 +133,7 @@ PyAPI_FUNC(PyObject *) PyCodec_StreamWriter(
|
||||||
|
|
||||||
/* Unicode encoding error handling callback registry API */
|
/* Unicode encoding error handling callback registry API */
|
||||||
|
|
||||||
/* Register the error handling callback function error under the name
|
/* Register the error handling callback function error under the given
|
||||||
name. This function will be called by the codec when it encounters
|
name. This function will be called by the codec when it encounters
|
||||||
unencodable characters/undecodable bytes and doesn't know the
|
unencodable characters/undecodable bytes and doesn't know the
|
||||||
callback name, when name is specified as the error parameter
|
callback name, when name is specified as the error parameter
|
||||||
|
@ -141,8 +141,8 @@ PyAPI_FUNC(PyObject *) PyCodec_StreamWriter(
|
||||||
Return 0 on success, -1 on error */
|
Return 0 on success, -1 on error */
|
||||||
PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error);
|
PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error);
|
||||||
|
|
||||||
/* Lookup the error handling callback function registered under the
|
/* Lookup the error handling callback function registered under the given
|
||||||
name error. As a special case NULL can be passed, in which case
|
name. As a special case NULL can be passed, in which case
|
||||||
the error handling callback for "strict" will be returned. */
|
the error handling callback for "strict" will be returned. */
|
||||||
PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name);
|
PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name);
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ PyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc);
|
||||||
/* ignore the unicode error, skipping the faulty input */
|
/* ignore the unicode error, skipping the faulty input */
|
||||||
PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc);
|
PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc);
|
||||||
|
|
||||||
/* replace the unicode error with ? or U+FFFD */
|
/* replace the unicode encode error with ? or U+FFFD */
|
||||||
PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc);
|
PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc);
|
||||||
|
|
||||||
/* replace the unicode encode error with XML character references */
|
/* replace the unicode encode error with XML character references */
|
||||||
|
|
|
@ -523,7 +523,11 @@ class GeneralModuleTests(unittest.TestCase):
|
||||||
# XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
|
# XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
|
||||||
# it reasonable to get the host's addr in addition to 0.0.0.0.
|
# it reasonable to get the host's addr in addition to 0.0.0.0.
|
||||||
# At least for eCos. This is required for the S/390 to pass.
|
# At least for eCos. This is required for the S/390 to pass.
|
||||||
|
try:
|
||||||
my_ip_addr = socket.gethostbyname(socket.gethostname())
|
my_ip_addr = socket.gethostbyname(socket.gethostname())
|
||||||
|
except socket.error:
|
||||||
|
# Probably name lookup wasn't set up right; skip this test
|
||||||
|
return
|
||||||
self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
|
self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
|
||||||
self.assertEqual(name[1], port)
|
self.assertEqual(name[1], port)
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,24 @@
|
||||||
-sob
|
--blank-lines-after-declarations
|
||||||
-nbad
|
--blank-lines-after-procedures
|
||||||
-bap
|
--braces-after-func-def-line
|
||||||
-br
|
--braces-on-if-line
|
||||||
-nce
|
--braces-on-struct-decl-line
|
||||||
-ncs
|
--break-after-boolean-operator
|
||||||
-npcs
|
--comment-indentation25
|
||||||
-i8
|
--comment-line-length79
|
||||||
-ip8
|
--continue-at-parentheses
|
||||||
-c25
|
--dont-cuddle-do-while
|
||||||
|
--dont-cuddle-else
|
||||||
|
--indent-level4
|
||||||
|
--line-length79
|
||||||
|
--no-space-after-casts
|
||||||
|
--no-space-after-function-call-names
|
||||||
|
--no-space-after-parentheses
|
||||||
|
--no-tabs
|
||||||
|
--procnames-start-lines
|
||||||
|
--space-after-for
|
||||||
|
--space-after-if
|
||||||
|
--space-after-while
|
||||||
|
--swallow-optional-blank-lines
|
||||||
|
-T PyCFunction
|
||||||
-T PyObject
|
-T PyObject
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue