mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-06-27 15:43:18 +02:00
108 lines
2.8 KiB
Plaintext
108 lines
2.8 KiB
Plaintext
*** /fs2/chet/bash/bash-20110317/lib/glob/xmbsrtowcs.c 2011-03-14 14:29:02.000000000 -0400
|
|
--- xmbsrtowcs.c 2011-03-22 16:06:47.000000000 -0400
|
|
***************
|
|
*** 35,40 ****
|
|
--- 35,42 ----
|
|
|
|
#if HANDLE_MULTIBYTE
|
|
|
|
+ #define WSBUF_INC 32
|
|
+
|
|
#ifndef FREE
|
|
# define FREE(x) do { if (x) free (x); } while (0)
|
|
#endif
|
|
***************
|
|
*** 171,180 ****
|
|
/* Compute the number of produced wide-characters. */
|
|
tmp_p = p;
|
|
tmp_state = state;
|
|
! wcslength = mbsnrtowcs (NULL, &tmp_p, nms, 0, &tmp_state);
|
|
|
|
/* Conversion failed. */
|
|
! if (wcslength == 0 || wcslength == (size_t)-1)
|
|
{
|
|
free (wsbuf);
|
|
*destp = NULL;
|
|
--- 173,193 ----
|
|
/* Compute the number of produced wide-characters. */
|
|
tmp_p = p;
|
|
tmp_state = state;
|
|
!
|
|
! if (nms == 0 && *p == '\\') /* special initial case */
|
|
! nms = wcslength = 1;
|
|
! else
|
|
! wcslength = mbsnrtowcs (NULL, &tmp_p, nms, 0, &tmp_state);
|
|
!
|
|
! if (wcslength == 0)
|
|
! {
|
|
! tmp_p = p; /* will need below */
|
|
! tmp_state = state;
|
|
! wcslength = 1; /* take a single byte */
|
|
! }
|
|
|
|
/* Conversion failed. */
|
|
! if (wcslength == (size_t)-1)
|
|
{
|
|
free (wsbuf);
|
|
*destp = NULL;
|
|
***************
|
|
*** 186,192 ****
|
|
{
|
|
wchar_t *wstmp;
|
|
|
|
! wsbuf_size = wcnum+wcslength+1; /* 1 for the L'\0' or the potential L'\\' */
|
|
|
|
wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t));
|
|
if (wstmp == NULL)
|
|
--- 199,206 ----
|
|
{
|
|
wchar_t *wstmp;
|
|
|
|
! while (wsbuf_size < wcnum+wcslength+1) /* 1 for the L'\0' or the potential L'\\' */
|
|
! wsbuf_size += WSBUF_INC;
|
|
|
|
wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t));
|
|
if (wstmp == NULL)
|
|
***************
|
|
*** 199,208 ****
|
|
}
|
|
|
|
/* Perform the conversion. This is assumed to return 'wcslength'.
|
|
! * It may set 'p' to NULL. */
|
|
n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
|
|
|
|
! wcnum += wcslength;
|
|
|
|
if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
|
|
{
|
|
--- 213,230 ----
|
|
}
|
|
|
|
/* Perform the conversion. This is assumed to return 'wcslength'.
|
|
! It may set 'p' to NULL. */
|
|
n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
|
|
|
|
! /* Compensate for taking single byte on wcs conversion failure above. */
|
|
! if (wcslength == 1 && (n == 0 || n == (size_t)-1))
|
|
! {
|
|
! state = tmp_state;
|
|
! p = tmp_p;
|
|
! wsbuf[wcnum++] = *p++;
|
|
! }
|
|
! else
|
|
! wcnum += wcslength;
|
|
|
|
if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
|
|
{
|
|
***************
|
|
*** 230,237 ****
|
|
If conversion is failed, the return value is (size_t)-1 and the values
|
|
of DESTP and INDICESP are NULL. */
|
|
|
|
- #define WSBUF_INC 32
|
|
-
|
|
size_t
|
|
xdupmbstowcs (destp, indicesp, src)
|
|
wchar_t **destp; /* Store the pointer to the wide character string */
|
|
--- 252,257 ----
|