| 207 | Note that this function assumes PSTR->VALID_LEN elements are already |
| 208 | built and starts from PSTR->VALID_LEN. */ |
| 209 | |
| 210 | static void |
| 211 | internal_function |
| 212 | build_wcs_buffer (re_string_t *pstr) |
| 213 | { |
| 214 | #ifdef _LIBC |
| 215 | unsigned char buf[MB_LEN_MAX]; |
| 216 | assert (MB_LEN_MAX >= pstr->mb_cur_max); |
| 217 | #else |
| 218 | unsigned char buf[64]; |
| 219 | #endif |
| 220 | mbstate_t prev_st; |
| 221 | int byte_idx, end_idx, remain_len; |
| 222 | size_t mbclen; |
| 223 | |
| 224 | /* Build the buffers from pstr->valid_len to either pstr->len or |
| 225 | pstr->bufs_len. */ |
| 226 | end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len; |
| 227 | for (byte_idx = pstr->valid_len; byte_idx < end_idx;) |
| 228 | { |
| 229 | wchar_t wc; |
| 230 | const char *p; |
| 231 | |
| 232 | remain_len = end_idx - byte_idx; |
| 233 | prev_st = pstr->cur_state; |
| 234 | /* Apply the translation if we need. */ |
| 235 | if (BE (pstr->trans != NULL, 0)) |
| 236 | { |
| 237 | int i, ch; |
| 238 | |
| 239 | for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) |
| 240 | { |
| 241 | ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i]; |
| 242 | buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch]; |
| 243 | } |
| 244 | p = (const char *) buf; |
| 245 | } |
| 246 | else |
| 247 | p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx; |
| 248 | mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state); |
| 249 | if (BE (mbclen == (size_t) -2, 0)) |
| 250 | { |
| 251 | /* The buffer doesn't have enough space, finish to build. */ |
| 252 | pstr->cur_state = prev_st; |
| 253 | break; |
| 254 | } |
| 255 | else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0)) |
| 256 | { |
| 257 | /* We treat these cases as a singlebyte character. */ |
| 258 | mbclen = 1; |
| 259 | wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]; |
| 260 | if (BE (pstr->trans != NULL, 0)) |
| 261 | wc = pstr->trans[wc]; |
| 262 | pstr->cur_state = prev_st; |
| 263 | } |
| 264 | |
| 265 | /* Write wide character and padding. */ |
| 266 | pstr->wcs[byte_idx++] = wc; |
nothing calls this directly
no test coverage detected