mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
Issue #9979: Create function PyUnicode_AsWideCharString().
This commit is contained in:
parent
41a64a53a3
commit
137c34c027
4 changed files with 80 additions and 16 deletions
|
@ -462,6 +462,19 @@ wchar_t support for platforms which support it:
|
||||||
required by the application.
|
required by the application.
|
||||||
|
|
||||||
|
|
||||||
|
.. cfunction:: wchar_t* PyUnicode_AsWideCharString(PyUnicodeObject *unicode, Py_ssize_t *size)
|
||||||
|
|
||||||
|
Convert the Unicode object to a wide character string. The output string
|
||||||
|
always ends with a nul character. If *size* is not *NULL*, write the number
|
||||||
|
of wide characters (including the nul character) into *\*size*.
|
||||||
|
|
||||||
|
Returns a buffer allocated by :cfunc:`PyMem_Alloc` (use :cfunc:`PyMem_Free`
|
||||||
|
to free it) on success. On error, returns *NULL*, *\*size* is undefined and
|
||||||
|
raises a :exc:`MemoryError`.
|
||||||
|
|
||||||
|
.. versionadded:: 3.2
|
||||||
|
|
||||||
|
|
||||||
.. _builtincodecs:
|
.. _builtincodecs:
|
||||||
|
|
||||||
Built-in Codecs
|
Built-in Codecs
|
||||||
|
|
|
@ -99,8 +99,8 @@ Copyright (c) Corporation for National Research Initiatives.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If the compiler provides a wchar_t type we try to support it
|
/* If the compiler provides a wchar_t type we try to support it
|
||||||
through the interface functions PyUnicode_FromWideChar() and
|
through the interface functions PyUnicode_FromWideChar(),
|
||||||
PyUnicode_AsWideChar(). */
|
PyUnicode_AsWideChar() and PyUnicode_AsWideCharString(). */
|
||||||
|
|
||||||
#ifdef HAVE_USABLE_WCHAR_T
|
#ifdef HAVE_USABLE_WCHAR_T
|
||||||
# ifndef HAVE_WCHAR_H
|
# ifndef HAVE_WCHAR_H
|
||||||
|
@ -156,6 +156,7 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define PyUnicode_AsUnicode PyUnicodeUCS2_AsUnicode
|
# define PyUnicode_AsUnicode PyUnicodeUCS2_AsUnicode
|
||||||
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS2_AsUnicodeEscapeString
|
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS2_AsUnicodeEscapeString
|
||||||
# define PyUnicode_AsWideChar PyUnicodeUCS2_AsWideChar
|
# define PyUnicode_AsWideChar PyUnicodeUCS2_AsWideChar
|
||||||
|
# define PyUnicode_AsWideCharString PyUnicodeUCS2_AsWideCharString
|
||||||
# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist
|
# define PyUnicode_ClearFreeList PyUnicodeUCS2_ClearFreelist
|
||||||
# define PyUnicode_Compare PyUnicodeUCS2_Compare
|
# define PyUnicode_Compare PyUnicodeUCS2_Compare
|
||||||
# define PyUnicode_CompareWithASCII PyUnicodeUCS2_CompareASCII
|
# define PyUnicode_CompareWithASCII PyUnicodeUCS2_CompareASCII
|
||||||
|
@ -239,6 +240,7 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
|
||||||
# define PyUnicode_AsUnicode PyUnicodeUCS4_AsUnicode
|
# define PyUnicode_AsUnicode PyUnicodeUCS4_AsUnicode
|
||||||
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS4_AsUnicodeEscapeString
|
# define PyUnicode_AsUnicodeEscapeString PyUnicodeUCS4_AsUnicodeEscapeString
|
||||||
# define PyUnicode_AsWideChar PyUnicodeUCS4_AsWideChar
|
# define PyUnicode_AsWideChar PyUnicodeUCS4_AsWideChar
|
||||||
|
# define PyUnicode_AsWideCharString PyUnicodeUCS4_AsWideCharString
|
||||||
# define PyUnicode_ClearFreeList PyUnicodeUCS4_ClearFreelist
|
# define PyUnicode_ClearFreeList PyUnicodeUCS4_ClearFreelist
|
||||||
# define PyUnicode_Compare PyUnicodeUCS4_Compare
|
# define PyUnicode_Compare PyUnicodeUCS4_Compare
|
||||||
# define PyUnicode_CompareWithASCII PyUnicodeUCS4_CompareWithASCII
|
# define PyUnicode_CompareWithASCII PyUnicodeUCS4_CompareWithASCII
|
||||||
|
@ -570,6 +572,19 @@ PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar(
|
||||||
Py_ssize_t size /* size of buffer */
|
Py_ssize_t size /* size of buffer */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* Convert the Unicode object to a wide character string. The output string
|
||||||
|
always ends with a nul character. If size is not NULL, write the number of
|
||||||
|
wide characters (including the nul character) into *size.
|
||||||
|
|
||||||
|
Returns a buffer allocated by PyMem_Alloc() (use PyMem_Free() to free it)
|
||||||
|
on success. On error, returns NULL, *size is undefined and raises a
|
||||||
|
MemoryError. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString(
|
||||||
|
PyUnicodeObject *unicode, /* Unicode object */
|
||||||
|
Py_ssize_t *size /* number of characters of the result */
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* --- Unicode ordinals --------------------------------------------------- */
|
/* --- Unicode ordinals --------------------------------------------------- */
|
||||||
|
|
|
@ -10,6 +10,8 @@ What's New in Python 3.2 Alpha 3?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #9979: Create function PyUnicode_AsWideCharString().
|
||||||
|
|
||||||
- Issue #7397: Mention that importlib.import_module() is probably what someone
|
- Issue #7397: Mention that importlib.import_module() is probably what someone
|
||||||
really wants to be using in __import__'s docstring.
|
really wants to be using in __import__'s docstring.
|
||||||
|
|
||||||
|
|
|
@ -1153,7 +1153,24 @@ PyUnicode_FromFormat(const char *format, ...)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_ssize_t PyUnicode_AsWideChar(PyUnicodeObject *unicode,
|
static void
|
||||||
|
unicode_aswidechar(PyUnicodeObject *unicode,
|
||||||
|
wchar_t *w,
|
||||||
|
Py_ssize_t size)
|
||||||
|
{
|
||||||
|
#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
|
||||||
|
memcpy(w, unicode->str, size * sizeof(wchar_t));
|
||||||
|
#else
|
||||||
|
register Py_UNICODE *u;
|
||||||
|
register Py_ssize_t i;
|
||||||
|
u = PyUnicode_AS_UNICODE(unicode);
|
||||||
|
for (i = size; i > 0; i--)
|
||||||
|
*w++ = *u++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_ssize_t
|
||||||
|
PyUnicode_AsWideChar(PyUnicodeObject *unicode,
|
||||||
wchar_t *w,
|
wchar_t *w,
|
||||||
Py_ssize_t size)
|
Py_ssize_t size)
|
||||||
{
|
{
|
||||||
|
@ -1166,17 +1183,7 @@ Py_ssize_t PyUnicode_AsWideChar(PyUnicodeObject *unicode,
|
||||||
if (size > PyUnicode_GET_SIZE(unicode))
|
if (size > PyUnicode_GET_SIZE(unicode))
|
||||||
size = PyUnicode_GET_SIZE(unicode) + 1;
|
size = PyUnicode_GET_SIZE(unicode) + 1;
|
||||||
|
|
||||||
#if Py_UNICODE_SIZE == SIZEOF_WCHAR_T
|
unicode_aswidechar(unicode, w, size);
|
||||||
memcpy(w, unicode->str, size * sizeof(wchar_t));
|
|
||||||
#else
|
|
||||||
{
|
|
||||||
register Py_UNICODE *u;
|
|
||||||
register Py_ssize_t i;
|
|
||||||
u = PyUnicode_AS_UNICODE(unicode);
|
|
||||||
for (i = size; i > 0; i--)
|
|
||||||
*w++ = *u++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (size > PyUnicode_GET_SIZE(unicode))
|
if (size > PyUnicode_GET_SIZE(unicode))
|
||||||
return PyUnicode_GET_SIZE(unicode);
|
return PyUnicode_GET_SIZE(unicode);
|
||||||
|
@ -1184,6 +1191,33 @@ Py_ssize_t PyUnicode_AsWideChar(PyUnicodeObject *unicode,
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wchar_t*
|
||||||
|
PyUnicode_AsWideCharString(PyUnicodeObject *unicode,
|
||||||
|
Py_ssize_t *size)
|
||||||
|
{
|
||||||
|
wchar_t* buffer;
|
||||||
|
Py_ssize_t buflen;
|
||||||
|
|
||||||
|
if (unicode == NULL) {
|
||||||
|
PyErr_BadInternalCall();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((PY_SSIZE_T_MAX / sizeof(wchar_t) - 1) < PyUnicode_GET_SIZE(unicode)) {
|
||||||
|
PyErr_NoMemory();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
buflen = PyUnicode_GET_SIZE(unicode) + 1; /* copy L'\0' */
|
||||||
|
buffer = PyMem_MALLOC(buflen * sizeof(wchar_t));
|
||||||
|
if (buffer == NULL) {
|
||||||
|
PyErr_NoMemory();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
unicode_aswidechar(unicode, buffer, buflen);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PyObject *PyUnicode_FromOrdinal(int ordinal)
|
PyObject *PyUnicode_FromOrdinal(int ordinal)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue