diff options
Diffstat (limited to 'posix/regex.c')
-rw-r--r-- | posix/regex.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/posix/regex.c b/posix/regex.c index ee38fdfd2e..5424f044b5 100644 --- a/posix/regex.c +++ b/posix/regex.c @@ -1284,7 +1284,11 @@ convert_mbs_to_wcs (dest, src, len, offset_buffer, is_binary) for( ; mb_remain > 0 ; ++wc_count, ++pdest, mb_remain -= consumed, psrc += consumed) { +#ifdef _LIBC + consumed = __mbrtowc (pdest, psrc, mb_remain, &mbs); +#else consumed = mbrtowc (pdest, psrc, mb_remain, &mbs); +#endif if (consumed <= 0) /* failed to convert. maybe src contains binary data. @@ -6333,8 +6337,13 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, & ~(uintptr_t)(__alignof__(wctype_t) - 1); wctype = *((wctype_t*)alignedp); workp += CHAR_CLASS_SIZE; +# ifdef _LIBC + if (__iswctype((wint_t)c, wctype)) + goto char_set_matched; +# else if (iswctype((wint_t)c, wctype)) goto char_set_matched; +# endif } /* match with collating_symbol? */ @@ -6370,12 +6379,16 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, for (workp2 = workp + coll_symbol_length ; workp < workp2 ;) { const CHAR_T *backup_d = d, *backup_dend = dend; - length = wcslen(workp); +# ifdef _LIBC + length = __wcslen (workp); +# else + length = wcslen (workp); +# endif /* If wcscoll(the collating symbol, whole string) > 0, any substring of the string never match with the collating symbol. */ - if (wcscoll(workp, d) > 0) + if (__wcscoll (workp, d) > 0) { workp += length + 1; continue; @@ -6400,7 +6413,11 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, str_buf[i] = TRANSLATE(*d); str_buf[i+1] = '\0'; - match = wcscoll(workp, str_buf); +# ifdef _LIBC + match = __wcscoll (workp, str_buf); +# else + match = wcscoll (workp, str_buf); +# endif if (match == 0) goto char_set_matched; @@ -6511,12 +6528,20 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, for (workp2 = workp + equiv_class_length ; workp < workp2 ;) { const CHAR_T *backup_d = d, *backup_dend = dend; - length = wcslen(workp); +# ifdef _LIBC + length = __wcslen (workp); +# else + length = wcslen (workp); +# endif /* If wcscoll(the collating symbol, whole string) > 0, any substring of the string never match with the collating symbol. */ - if (wcscoll(workp, d) > 0) +# ifdef _LIBC + if (__wcscoll (workp, d) > 0) +# else + if (wcscoll (workp, d) > 0) +# endif { workp += length + 1; break; @@ -6541,7 +6566,11 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, str_buf[i] = TRANSLATE(*d); str_buf[i+1] = '\0'; - match = wcscoll(workp, str_buf); +# ifdef _LIBC + match = __wcscoll (workp, str_buf); +# else + match = wcscoll (workp, str_buf); +# endif if (match == 0) goto char_set_matched; @@ -6564,7 +6593,7 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, } /* match with char_range? */ -#ifdef _LIBC +# ifdef _LIBC if (nrules != 0) { uint32_t collseqval; @@ -6587,7 +6616,7 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, } } else -#endif +# endif { /* We set range_start_char at str_buf[0], range_end_char at str_buf[4], and compared char at str_buf[2]. */ @@ -6623,9 +6652,13 @@ byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, range_end_char = str_buf + 4; } - if (wcscoll(range_start_char, str_buf+2) <= 0 && - wcscoll(str_buf+2, range_end_char) <= 0) - +# ifdef _LIBC + if (__wcscoll (range_start_char, str_buf+2) <= 0 + && __wcscoll (str_buf+2, range_end_char) <= 0) +# else + if (wcscoll (range_start_char, str_buf+2) <= 0 + && wcscoll (str_buf+2, range_end_char) <= 0) +# endif goto char_set_matched; } } |