goto exit;
}
- /* assume no change in size, first */
- n1 = n1 + 1;
- /* Yet another +1 is needed to work around a platform bug in wcsxfrm()
- * on macOS. See gh-130567. */
- buf = PyMem_New(wchar_t, n1+1);
+ errno = 0;
+ n2 = wcsxfrm(NULL, s, 0);
+ if (errno && errno != ERANGE) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ goto exit;
+ }
+ buf = PyMem_New(wchar_t, n2+1);
if (!buf) {
PyErr_NoMemory();
goto exit;
}
+
errno = 0;
- n2 = wcsxfrm(buf, s, n1);
- if (errno && errno != ERANGE) {
+ n2 = wcsxfrm(buf, s, n2+1);
+ if (errno) {
PyErr_SetFromErrno(PyExc_OSError);
goto exit;
}
- if (n2 >= (size_t)n1) {
- /* more space needed */
- wchar_t * new_buf = PyMem_Realloc(buf, (n2+1)*sizeof(wchar_t));
- if (!new_buf) {
- PyErr_NoMemory();
- goto exit;
- }
- buf = new_buf;
- errno = 0;
- n2 = wcsxfrm(buf, s, n2+1);
- if (errno) {
- PyErr_SetFromErrno(PyExc_OSError);
- goto exit;
- }
- }
/* The result is just a sequence of integers, they are not necessary
Unicode code points, so PyUnicode_FromWideChar() cannot be used
here. For example, 0xD83D 0xDC0D should not be larger than 0xFF41.