| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/bash/src/lib/glob/xmbsrtowcs.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* xmbsrtowcs.c -- replacement function for mbsrtowcs */ | - | ||||||||||||||||||
| 2 | - | |||||||||||||||||||
| 3 | /* Copyright (C) 2002-2013 Free Software Foundation, Inc. | - | ||||||||||||||||||
| 4 | - | |||||||||||||||||||
| 5 | This file is part of GNU Bash, the Bourne Again SHell. | - | ||||||||||||||||||
| 6 | - | |||||||||||||||||||
| 7 | Bash is free software: you can redistribute it and/or modify | - | ||||||||||||||||||
| 8 | it under the terms of the GNU General Public License as published by | - | ||||||||||||||||||
| 9 | the Free Software Foundation, either version 3 of the License, or | - | ||||||||||||||||||
| 10 | (at your option) any later version. | - | ||||||||||||||||||
| 11 | - | |||||||||||||||||||
| 12 | Bash is distributed in the hope that it will be useful, | - | ||||||||||||||||||
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||||||||||||||
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||||||||||||||
| 15 | GNU General Public License for more details. | - | ||||||||||||||||||
| 16 | - | |||||||||||||||||||
| 17 | You should have received a copy of the GNU General Public License | - | ||||||||||||||||||
| 18 | along with Bash. If not, see <http://www.gnu.org/licenses/>. | - | ||||||||||||||||||
| 19 | */ | - | ||||||||||||||||||
| 20 | - | |||||||||||||||||||
| 21 | /* Ask for GNU extensions to get extern declaration for mbsnrtowcs if | - | ||||||||||||||||||
| 22 | available via glibc. */ | - | ||||||||||||||||||
| 23 | #ifndef _GNU_SOURCE | - | ||||||||||||||||||
| 24 | # define _GNU_SOURCE 1 | - | ||||||||||||||||||
| 25 | #endif | - | ||||||||||||||||||
| 26 | - | |||||||||||||||||||
| 27 | #include <config.h> | - | ||||||||||||||||||
| 28 | - | |||||||||||||||||||
| 29 | #include <bashansi.h> | - | ||||||||||||||||||
| 30 | - | |||||||||||||||||||
| 31 | /* <wchar.h>, <wctype.h> and <stdlib.h> are included in "shmbutil.h". | - | ||||||||||||||||||
| 32 | If <wchar.h>, <wctype.h>, mbsrtowcs(), exist, HANDLE_MULTIBYTE | - | ||||||||||||||||||
| 33 | is defined as 1. */ | - | ||||||||||||||||||
| 34 | #include <shmbutil.h> | - | ||||||||||||||||||
| 35 | - | |||||||||||||||||||
| 36 | #if HANDLE_MULTIBYTE | - | ||||||||||||||||||
| 37 | - | |||||||||||||||||||
| 38 | #define WSBUF_INC 32 | - | ||||||||||||||||||
| 39 | - | |||||||||||||||||||
| 40 | #ifndef FREE | - | ||||||||||||||||||
| 41 | # define FREE(x) do { if (x) free (x); } while (0) | - | ||||||||||||||||||
| 42 | #endif | - | ||||||||||||||||||
| 43 | - | |||||||||||||||||||
| 44 | #if ! HAVE_STRCHRNUL | - | ||||||||||||||||||
| 45 | extern char *strchrnul __P((const char *, int)); | - | ||||||||||||||||||
| 46 | #endif | - | ||||||||||||||||||
| 47 | - | |||||||||||||||||||
| 48 | /* On some locales (ex. ja_JP.sjis), mbsrtowc doesn't convert 0x5c to U<0x5c>. | - | ||||||||||||||||||
| 49 | So, this function is made for converting 0x5c to U<0x5c>. */ | - | ||||||||||||||||||
| 50 | - | |||||||||||||||||||
| 51 | static mbstate_t local_state; | - | ||||||||||||||||||
| 52 | static int local_state_use = 0; | - | ||||||||||||||||||
| 53 | - | |||||||||||||||||||
| 54 | size_t | - | ||||||||||||||||||
| 55 | xmbsrtowcs (dest, src, len, pstate) | - | ||||||||||||||||||
| 56 | wchar_t *dest; | - | ||||||||||||||||||
| 57 | const char **src; | - | ||||||||||||||||||
| 58 | size_t len; | - | ||||||||||||||||||
| 59 | mbstate_t *pstate; | - | ||||||||||||||||||
| 60 | { | - | ||||||||||||||||||
| 61 | mbstate_t *ps; | - | ||||||||||||||||||
| 62 | size_t mblength, wclength, n; | - | ||||||||||||||||||
| 63 | - | |||||||||||||||||||
| 64 | ps = pstate; | - | ||||||||||||||||||
| 65 | if (pstate == NULL)
| 0 | ||||||||||||||||||
| 66 | { | - | ||||||||||||||||||
| 67 | if (!local_state_use)
| 0 | ||||||||||||||||||
| 68 | { | - | ||||||||||||||||||
| 69 | memset (&local_state, '\0', sizeof(mbstate_t)); | - | ||||||||||||||||||
| 70 | local_state_use = 1; | - | ||||||||||||||||||
| 71 | } never executed: end of block | 0 | ||||||||||||||||||
| 72 | ps = &local_state; | - | ||||||||||||||||||
| 73 | } never executed: end of block | 0 | ||||||||||||||||||
| 74 | - | |||||||||||||||||||
| 75 | n = strlen (*src); | - | ||||||||||||||||||
| 76 | - | |||||||||||||||||||
| 77 | if (dest == NULL)
| 0 | ||||||||||||||||||
| 78 | { | - | ||||||||||||||||||
| 79 | wchar_t *wsbuf; | - | ||||||||||||||||||
| 80 | const char *mbs; | - | ||||||||||||||||||
| 81 | mbstate_t psbuf; | - | ||||||||||||||||||
| 82 | - | |||||||||||||||||||
| 83 | /* It doesn't matter if malloc fails here, since mbsrtowcs should do | - | ||||||||||||||||||
| 84 | the right thing with a NULL first argument. */ | - | ||||||||||||||||||
| 85 | wsbuf = (wchar_t *) malloc ((n + 1) * sizeof(wchar_t)); | - | ||||||||||||||||||
| 86 | mbs = *src; | - | ||||||||||||||||||
| 87 | psbuf = *ps; | - | ||||||||||||||||||
| 88 | - | |||||||||||||||||||
| 89 | wclength = mbsrtowcs (wsbuf, &mbs, n, &psbuf); | - | ||||||||||||||||||
| 90 | - | |||||||||||||||||||
| 91 | if (wsbuf)
| 0 | ||||||||||||||||||
| 92 | free (wsbuf); never executed: free (wsbuf); | 0 | ||||||||||||||||||
| 93 | return wclength; never executed: return wclength; | 0 | ||||||||||||||||||
| 94 | } | - | ||||||||||||||||||
| 95 | - | |||||||||||||||||||
| 96 | for (wclength = 0; wclength < len; wclength++, dest++)
| 0 | ||||||||||||||||||
| 97 | { | - | ||||||||||||||||||
| 98 | if (mbsinit(ps))
| 0 | ||||||||||||||||||
| 99 | { | - | ||||||||||||||||||
| 100 | if (**src == '\0')
| 0 | ||||||||||||||||||
| 101 | { | - | ||||||||||||||||||
| 102 | *dest = L'\0'; | - | ||||||||||||||||||
| 103 | *src = NULL; | - | ||||||||||||||||||
| 104 | return (wclength); never executed: return (wclength); | 0 | ||||||||||||||||||
| 105 | } | - | ||||||||||||||||||
| 106 | else if (**src == '\\')
| 0 | ||||||||||||||||||
| 107 | { | - | ||||||||||||||||||
| 108 | *dest = L'\\'; | - | ||||||||||||||||||
| 109 | mblength = 1; | - | ||||||||||||||||||
| 110 | } never executed: end of block | 0 | ||||||||||||||||||
| 111 | else | - | ||||||||||||||||||
| 112 | mblength = mbrtowc(dest, *src, n, ps); never executed: mblength = mbrtowc(dest, *src, n, ps); | 0 | ||||||||||||||||||
| 113 | } | - | ||||||||||||||||||
| 114 | else | - | ||||||||||||||||||
| 115 | mblength = mbrtowc(dest, *src, n, ps); never executed: mblength = mbrtowc(dest, *src, n, ps); | 0 | ||||||||||||||||||
| 116 | - | |||||||||||||||||||
| 117 | /* Cannot convert multibyte character to wide character. */ | - | ||||||||||||||||||
| 118 | if (mblength == (size_t)-1 || mblength == (size_t)-2)
| 0 | ||||||||||||||||||
| 119 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 120 | - | |||||||||||||||||||
| 121 | *src += mblength; | - | ||||||||||||||||||
| 122 | n -= mblength; | - | ||||||||||||||||||
| 123 | - | |||||||||||||||||||
| 124 | /* The multibyte string has been completely converted, | - | ||||||||||||||||||
| 125 | including the terminating '\0'. */ | - | ||||||||||||||||||
| 126 | if (*dest == L'\0')
| 0 | ||||||||||||||||||
| 127 | { | - | ||||||||||||||||||
| 128 | *src = NULL; | - | ||||||||||||||||||
| 129 | break; never executed: break; | 0 | ||||||||||||||||||
| 130 | } | - | ||||||||||||||||||
| 131 | } never executed: end of block | 0 | ||||||||||||||||||
| 132 | - | |||||||||||||||||||
| 133 | return (wclength); never executed: return (wclength); | 0 | ||||||||||||||||||
| 134 | } | - | ||||||||||||||||||
| 135 | - | |||||||||||||||||||
| 136 | #if HAVE_MBSNRTOWCS | - | ||||||||||||||||||
| 137 | /* Convert a multibyte string to a wide character string. Memory for the | - | ||||||||||||||||||
| 138 | new wide character string is obtained with malloc. | - | ||||||||||||||||||
| 139 | - | |||||||||||||||||||
| 140 | Fast multiple-character version of xdupmbstowcs used when the indices are | - | ||||||||||||||||||
| 141 | not required and mbsnrtowcs is available. */ | - | ||||||||||||||||||
| 142 | - | |||||||||||||||||||
| 143 | static size_t | - | ||||||||||||||||||
| 144 | xdupmbstowcs2 (destp, src) | - | ||||||||||||||||||
| 145 | wchar_t **destp; /* Store the pointer to the wide character string */ | - | ||||||||||||||||||
| 146 | const char *src; /* Multibyte character string */ | - | ||||||||||||||||||
| 147 | { | - | ||||||||||||||||||
| 148 | const char *p; /* Conversion start position of src */ | - | ||||||||||||||||||
| 149 | wchar_t *wsbuf; /* Buffer for wide characters. */ | - | ||||||||||||||||||
| 150 | size_t wsbuf_size; /* Size of WSBUF */ | - | ||||||||||||||||||
| 151 | size_t wcnum; /* Number of wide characters in WSBUF */ | - | ||||||||||||||||||
| 152 | mbstate_t state; /* Conversion State */ | - | ||||||||||||||||||
| 153 | size_t n, wcslength; /* Number of wide characters produced by the conversion. */ | - | ||||||||||||||||||
| 154 | const char *end_or_backslash; | - | ||||||||||||||||||
| 155 | size_t nms; /* Number of multibyte characters to convert at one time. */ | - | ||||||||||||||||||
| 156 | mbstate_t tmp_state; | - | ||||||||||||||||||
| 157 | const char *tmp_p; | - | ||||||||||||||||||
| 158 | - | |||||||||||||||||||
| 159 | memset (&state, '\0', sizeof(mbstate_t)); | - | ||||||||||||||||||
| 160 | - | |||||||||||||||||||
| 161 | wsbuf_size = 0; | - | ||||||||||||||||||
| 162 | wsbuf = NULL; | - | ||||||||||||||||||
| 163 | - | |||||||||||||||||||
| 164 | p = src; | - | ||||||||||||||||||
| 165 | wcnum = 0; | - | ||||||||||||||||||
| 166 | do | - | ||||||||||||||||||
| 167 | { | - | ||||||||||||||||||
| 168 | end_or_backslash = strchrnul(p, '\\'); | - | ||||||||||||||||||
| 169 | nms = end_or_backslash - p; | - | ||||||||||||||||||
| 170 | if (*end_or_backslash == '\0')
| 2315529-4634220 | ||||||||||||||||||
| 171 | nms++; executed 4634220 times by 1 test: nms++;Executed by:
| 4634220 | ||||||||||||||||||
| 172 | - | |||||||||||||||||||
| 173 | /* Compute the number of produced wide-characters. */ | - | ||||||||||||||||||
| 174 | tmp_p = p; | - | ||||||||||||||||||
| 175 | tmp_state = state; | - | ||||||||||||||||||
| 176 | - | |||||||||||||||||||
| 177 | if (nms == 0 && *p == '\\') /* special initial case */
| 0-4634363 | ||||||||||||||||||
| 178 | nms = wcslength = 1; executed 2315386 times by 1 test: nms = wcslength = 1;Executed by:
| 2315386 | ||||||||||||||||||
| 179 | else | - | ||||||||||||||||||
| 180 | wcslength = mbsnrtowcs (NULL, &tmp_p, nms, 0, &tmp_state); executed 4634363 times by 1 test: wcslength = mbsnrtowcs ( ((void *)0) , &tmp_p, nms, 0, &tmp_state);Executed by:
| 4634363 | ||||||||||||||||||
| 181 | - | |||||||||||||||||||
| 182 | if (wcslength == 0)
| 0-6949749 | ||||||||||||||||||
| 183 | { | - | ||||||||||||||||||
| 184 | tmp_p = p; /* will need below */ | - | ||||||||||||||||||
| 185 | tmp_state = state; | - | ||||||||||||||||||
| 186 | wcslength = 1; /* take a single byte */ | - | ||||||||||||||||||
| 187 | } never executed: end of block | 0 | ||||||||||||||||||
| 188 | - | |||||||||||||||||||
| 189 | /* Conversion failed. */ | - | ||||||||||||||||||
| 190 | if (wcslength == (size_t)-1)
| 6-6949743 | ||||||||||||||||||
| 191 | { | - | ||||||||||||||||||
| 192 | free (wsbuf); | - | ||||||||||||||||||
| 193 | *destp = NULL; | - | ||||||||||||||||||
| 194 | return (size_t)-1; executed 6 times by 1 test: return (size_t)-1;Executed by:
| 6 | ||||||||||||||||||
| 195 | } | - | ||||||||||||||||||
| 196 | - | |||||||||||||||||||
| 197 | /* Resize the buffer if it is not large enough. */ | - | ||||||||||||||||||
| 198 | if (wsbuf_size < wcnum+wcslength+1) /* 1 for the L'\0' or the potential L'\\' */
| 2315526-4634217 | ||||||||||||||||||
| 199 | { | - | ||||||||||||||||||
| 200 | wchar_t *wstmp; | - | ||||||||||||||||||
| 201 | - | |||||||||||||||||||
| 202 | while (wsbuf_size < wcnum+wcslength+1) /* 1 for the L'\0' or the potential L'\\' */
| 4634217-4634228 | ||||||||||||||||||
| 203 | wsbuf_size += WSBUF_INC; executed 4634228 times by 1 test: wsbuf_size += 32;Executed by:
| 4634228 | ||||||||||||||||||
| 204 | - | |||||||||||||||||||
| 205 | wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t)); | - | ||||||||||||||||||
| 206 | if (wstmp == NULL)
| 0-4634217 | ||||||||||||||||||
| 207 | { | - | ||||||||||||||||||
| 208 | free (wsbuf); | - | ||||||||||||||||||
| 209 | *destp = NULL; | - | ||||||||||||||||||
| 210 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 211 | } | - | ||||||||||||||||||
| 212 | wsbuf = wstmp; | - | ||||||||||||||||||
| 213 | } executed 4634217 times by 1 test: end of blockExecuted by:
| 4634217 | ||||||||||||||||||
| 214 | - | |||||||||||||||||||
| 215 | /* Perform the conversion. This is assumed to return 'wcslength'. | - | ||||||||||||||||||
| 216 | It may set 'p' to NULL. */ | - | ||||||||||||||||||
| 217 | n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state); | - | ||||||||||||||||||
| 218 | - | |||||||||||||||||||
| 219 | if (n == 0 && p == 0)
| 0-6949743 | ||||||||||||||||||
| 220 | { | - | ||||||||||||||||||
| 221 | wsbuf[wcnum] = L'\0'; | - | ||||||||||||||||||
| 222 | break; never executed: break; | 0 | ||||||||||||||||||
| 223 | } | - | ||||||||||||||||||
| 224 | - | |||||||||||||||||||
| 225 | /* Compensate for taking single byte on wcs conversion failure above. */ | - | ||||||||||||||||||
| 226 | if (wcslength == 1 && (n == 0 || n == (size_t)-1))
| 0-4631702 | ||||||||||||||||||
| 227 | { | - | ||||||||||||||||||
| 228 | state = tmp_state; | - | ||||||||||||||||||
| 229 | p = tmp_p; | - | ||||||||||||||||||
| 230 | wsbuf[wcnum] = *p; | - | ||||||||||||||||||
| 231 | if (*p == 0)
| 0 | ||||||||||||||||||
| 232 | break; never executed: break; | 0 | ||||||||||||||||||
| 233 | else | - | ||||||||||||||||||
| 234 | { | - | ||||||||||||||||||
| 235 | wcnum++; p++; | - | ||||||||||||||||||
| 236 | } never executed: end of block | 0 | ||||||||||||||||||
| 237 | } | - | ||||||||||||||||||
| 238 | else | - | ||||||||||||||||||
| 239 | wcnum += wcslength; executed 6949743 times by 1 test: wcnum += wcslength;Executed by:
| 6949743 | ||||||||||||||||||
| 240 | - | |||||||||||||||||||
| 241 | if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
| 0-6949743 | ||||||||||||||||||
| 242 | { | - | ||||||||||||||||||
| 243 | wsbuf[wcnum++] = L'\\'; | - | ||||||||||||||||||
| 244 | p++; | - | ||||||||||||||||||
| 245 | } executed 143 times by 1 test: end of blockExecuted by:
| 143 | ||||||||||||||||||
| 246 | } executed 6949743 times by 1 test: end of blockExecuted by:
| 6949743 | ||||||||||||||||||
| 247 | while (p != NULL);
| 2315529-4634214 | ||||||||||||||||||
| 248 | - | |||||||||||||||||||
| 249 | *destp = wsbuf; | - | ||||||||||||||||||
| 250 | - | |||||||||||||||||||
| 251 | /* Return the length of the wide character string, not including `\0'. */ | - | ||||||||||||||||||
| 252 | return wcnum; executed 4634214 times by 1 test: return wcnum;Executed by:
| 4634214 | ||||||||||||||||||
| 253 | } | - | ||||||||||||||||||
| 254 | #endif /* HAVE_MBSNRTOWCS */ | - | ||||||||||||||||||
| 255 | - | |||||||||||||||||||
| 256 | /* Convert a multibyte string to a wide character string. Memory for the | - | ||||||||||||||||||
| 257 | new wide character string is obtained with malloc. | - | ||||||||||||||||||
| 258 | - | |||||||||||||||||||
| 259 | The return value is the length of the wide character string. Returns a | - | ||||||||||||||||||
| 260 | pointer to the wide character string in DESTP. If INDICESP is not NULL, | - | ||||||||||||||||||
| 261 | INDICESP stores the pointer to the pointer array. Each pointer is to | - | ||||||||||||||||||
| 262 | the first byte of each multibyte character. Memory for the pointer array | - | ||||||||||||||||||
| 263 | is obtained with malloc, too. | - | ||||||||||||||||||
| 264 | If conversion is failed, the return value is (size_t)-1 and the values | - | ||||||||||||||||||
| 265 | of DESTP and INDICESP are NULL. */ | - | ||||||||||||||||||
| 266 | - | |||||||||||||||||||
| 267 | size_t | - | ||||||||||||||||||
| 268 | xdupmbstowcs (destp, indicesp, src) | - | ||||||||||||||||||
| 269 | wchar_t **destp; /* Store the pointer to the wide character string */ | - | ||||||||||||||||||
| 270 | char ***indicesp; /* Store the pointer to the pointer array. */ | - | ||||||||||||||||||
| 271 | const char *src; /* Multibyte character string */ | - | ||||||||||||||||||
| 272 | { | - | ||||||||||||||||||
| 273 | const char *p; /* Conversion start position of src */ | - | ||||||||||||||||||
| 274 | wchar_t wc; /* Created wide character by conversion */ | - | ||||||||||||||||||
| 275 | wchar_t *wsbuf; /* Buffer for wide characters. */ | - | ||||||||||||||||||
| 276 | char **indices; /* Buffer for indices. */ | - | ||||||||||||||||||
| 277 | size_t wsbuf_size; /* Size of WSBUF */ | - | ||||||||||||||||||
| 278 | size_t wcnum; /* Number of wide characters in WSBUF */ | - | ||||||||||||||||||
| 279 | mbstate_t state; /* Conversion State */ | - | ||||||||||||||||||
| 280 | - | |||||||||||||||||||
| 281 | /* In case SRC or DESP is NULL, conversion doesn't take place. */ | - | ||||||||||||||||||
| 282 | if (src == NULL || destp == NULL)
| 0-4634230 | ||||||||||||||||||
| 283 | { | - | ||||||||||||||||||
| 284 | if (destp)
| 0 | ||||||||||||||||||
| 285 | *destp = NULL; never executed: *destp = ((void *)0) ; | 0 | ||||||||||||||||||
| 286 | if (indicesp)
| 0 | ||||||||||||||||||
| 287 | *indicesp = NULL; never executed: *indicesp = ((void *)0) ; | 0 | ||||||||||||||||||
| 288 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 289 | } | - | ||||||||||||||||||
| 290 | - | |||||||||||||||||||
| 291 | #if HAVE_MBSNRTOWCS | - | ||||||||||||||||||
| 292 | if (indicesp == NULL)
| 10-4634220 | ||||||||||||||||||
| 293 | return (xdupmbstowcs2 (destp, src)); executed 4634220 times by 1 test: return (xdupmbstowcs2 (destp, src));Executed by:
| 4634220 | ||||||||||||||||||
| 294 | #endif | - | ||||||||||||||||||
| 295 | - | |||||||||||||||||||
| 296 | memset (&state, '\0', sizeof(mbstate_t)); | - | ||||||||||||||||||
| 297 | wsbuf_size = WSBUF_INC; | - | ||||||||||||||||||
| 298 | - | |||||||||||||||||||
| 299 | wsbuf = (wchar_t *) malloc (wsbuf_size * sizeof(wchar_t)); | - | ||||||||||||||||||
| 300 | if (wsbuf == NULL)
| 0-10 | ||||||||||||||||||
| 301 | { | - | ||||||||||||||||||
| 302 | *destp = NULL; | - | ||||||||||||||||||
| 303 | if (indicesp)
| 0 | ||||||||||||||||||
| 304 | *indicesp = NULL; never executed: *indicesp = ((void *)0) ; | 0 | ||||||||||||||||||
| 305 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 306 | } | - | ||||||||||||||||||
| 307 | - | |||||||||||||||||||
| 308 | indices = NULL; | - | ||||||||||||||||||
| 309 | if (indicesp)
| 0-10 | ||||||||||||||||||
| 310 | { | - | ||||||||||||||||||
| 311 | indices = (char **) malloc (wsbuf_size * sizeof(char *)); | - | ||||||||||||||||||
| 312 | if (indices == NULL)
| 0-10 | ||||||||||||||||||
| 313 | { | - | ||||||||||||||||||
| 314 | free (wsbuf); | - | ||||||||||||||||||
| 315 | *destp = NULL; | - | ||||||||||||||||||
| 316 | *indicesp = NULL; | - | ||||||||||||||||||
| 317 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 318 | } | - | ||||||||||||||||||
| 319 | } executed 10 times by 1 test: end of blockExecuted by:
| 10 | ||||||||||||||||||
| 320 | - | |||||||||||||||||||
| 321 | p = src; | - | ||||||||||||||||||
| 322 | wcnum = 0; | - | ||||||||||||||||||
| 323 | do | - | ||||||||||||||||||
| 324 | { | - | ||||||||||||||||||
| 325 | size_t mblength; /* Byte length of one multibyte character. */ | - | ||||||||||||||||||
| 326 | - | |||||||||||||||||||
| 327 | if (mbsinit (&state))
| 0-50 | ||||||||||||||||||
| 328 | { | - | ||||||||||||||||||
| 329 | if (*p == '\0')
| 10-40 | ||||||||||||||||||
| 330 | { | - | ||||||||||||||||||
| 331 | wc = L'\0'; | - | ||||||||||||||||||
| 332 | mblength = 1; | - | ||||||||||||||||||
| 333 | } executed 10 times by 1 test: end of blockExecuted by:
| 10 | ||||||||||||||||||
| 334 | else if (*p == '\\')
| 0-40 | ||||||||||||||||||
| 335 | { | - | ||||||||||||||||||
| 336 | wc = L'\\'; | - | ||||||||||||||||||
| 337 | mblength = 1; | - | ||||||||||||||||||
| 338 | } never executed: end of block | 0 | ||||||||||||||||||
| 339 | else | - | ||||||||||||||||||
| 340 | mblength = mbrtowc(&wc, p, MB_LEN_MAX, &state); executed 40 times by 1 test: mblength = mbrtowc(&wc, p, 16 , &state);Executed by:
| 40 | ||||||||||||||||||
| 341 | } | - | ||||||||||||||||||
| 342 | else | - | ||||||||||||||||||
| 343 | mblength = mbrtowc(&wc, p, MB_LEN_MAX, &state); never executed: mblength = mbrtowc(&wc, p, 16 , &state); | 0 | ||||||||||||||||||
| 344 | - | |||||||||||||||||||
| 345 | /* Conversion failed. */ | - | ||||||||||||||||||
| 346 | if (MB_INVALIDCH (mblength))
| 0-50 | ||||||||||||||||||
| 347 | { | - | ||||||||||||||||||
| 348 | free (wsbuf); | - | ||||||||||||||||||
| 349 | FREE (indices); never executed: free (indices);
| 0 | ||||||||||||||||||
| 350 | *destp = NULL; | - | ||||||||||||||||||
| 351 | if (indicesp)
| 0 | ||||||||||||||||||
| 352 | *indicesp = NULL; never executed: *indicesp = ((void *)0) ; | 0 | ||||||||||||||||||
| 353 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 354 | } | - | ||||||||||||||||||
| 355 | - | |||||||||||||||||||
| 356 | ++wcnum; | - | ||||||||||||||||||
| 357 | - | |||||||||||||||||||
| 358 | /* Resize buffers when they are not large enough. */ | - | ||||||||||||||||||
| 359 | if (wsbuf_size < wcnum)
| 0-50 | ||||||||||||||||||
| 360 | { | - | ||||||||||||||||||
| 361 | wchar_t *wstmp; | - | ||||||||||||||||||
| 362 | char **idxtmp; | - | ||||||||||||||||||
| 363 | - | |||||||||||||||||||
| 364 | wsbuf_size += WSBUF_INC; | - | ||||||||||||||||||
| 365 | - | |||||||||||||||||||
| 366 | wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t)); | - | ||||||||||||||||||
| 367 | if (wstmp == NULL)
| 0 | ||||||||||||||||||
| 368 | { | - | ||||||||||||||||||
| 369 | free (wsbuf); | - | ||||||||||||||||||
| 370 | FREE (indices); never executed: free (indices);
| 0 | ||||||||||||||||||
| 371 | *destp = NULL; | - | ||||||||||||||||||
| 372 | if (indicesp)
| 0 | ||||||||||||||||||
| 373 | *indicesp = NULL; never executed: *indicesp = ((void *)0) ; | 0 | ||||||||||||||||||
| 374 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 375 | } | - | ||||||||||||||||||
| 376 | wsbuf = wstmp; | - | ||||||||||||||||||
| 377 | - | |||||||||||||||||||
| 378 | if (indicesp)
| 0 | ||||||||||||||||||
| 379 | { | - | ||||||||||||||||||
| 380 | idxtmp = (char **) realloc (indices, wsbuf_size * sizeof (char *)); | - | ||||||||||||||||||
| 381 | if (idxtmp == NULL)
| 0 | ||||||||||||||||||
| 382 | { | - | ||||||||||||||||||
| 383 | free (wsbuf); | - | ||||||||||||||||||
| 384 | free (indices); | - | ||||||||||||||||||
| 385 | *destp = NULL; | - | ||||||||||||||||||
| 386 | if (indicesp)
| 0 | ||||||||||||||||||
| 387 | *indicesp = NULL; never executed: *indicesp = ((void *)0) ; | 0 | ||||||||||||||||||
| 388 | return (size_t)-1; never executed: return (size_t)-1; | 0 | ||||||||||||||||||
| 389 | } | - | ||||||||||||||||||
| 390 | indices = idxtmp; | - | ||||||||||||||||||
| 391 | } never executed: end of block | 0 | ||||||||||||||||||
| 392 | } never executed: end of block | 0 | ||||||||||||||||||
| 393 | - | |||||||||||||||||||
| 394 | wsbuf[wcnum - 1] = wc; | - | ||||||||||||||||||
| 395 | if (indices)
| 0-50 | ||||||||||||||||||
| 396 | indices[wcnum - 1] = (char *)p; executed 50 times by 1 test: indices[wcnum - 1] = (char *)p;Executed by:
| 50 | ||||||||||||||||||
| 397 | p += mblength; | - | ||||||||||||||||||
| 398 | } executed 50 times by 1 test: end of blockExecuted by:
| 50 | ||||||||||||||||||
| 399 | while (MB_NULLWCH (wc) == 0);
| 10-40 | ||||||||||||||||||
| 400 | - | |||||||||||||||||||
| 401 | /* Return the length of the wide character string, not including `\0'. */ | - | ||||||||||||||||||
| 402 | *destp = wsbuf; | - | ||||||||||||||||||
| 403 | if (indicesp != NULL)
| 0-10 | ||||||||||||||||||
| 404 | *indicesp = indices; executed 10 times by 1 test: *indicesp = indices;Executed by:
| 10 | ||||||||||||||||||
| 405 | - | |||||||||||||||||||
| 406 | return (wcnum - 1); executed 10 times by 1 test: return (wcnum - 1);Executed by:
| 10 | ||||||||||||||||||
| 407 | } | - | ||||||||||||||||||
| 408 | - | |||||||||||||||||||
| 409 | #endif /* HANDLE_MULTIBYTE */ | - | ||||||||||||||||||
| Source code | Switch to Preprocessed file |