zend_string *key;
pcre_cache_entry *ret;
- if (locale_aware && BG(ctype_string) &&
- (ZSTR_LEN(BG(ctype_string)) != 1 && ZSTR_VAL(BG(ctype_string))[0] != 'C')) {
+ if (locale_aware && BG(ctype_string)) {
key = zend_string_concat2(
ZSTR_VAL(BG(ctype_string)), ZSTR_LEN(BG(ctype_string)),
ZSTR_VAL(regex), ZSTR_LEN(regex));
unsigned char *c;
const unsigned char *e;
- if (EXPECTED(!BG(locale_changed))) {
+ if (EXPECTED(!BG(ctype_string))) {
return zend_string_tolower(s);
} else {
c = (unsigned char *)ZSTR_VAL(s);
if (BG(ctype_string)) {
zend_string_release_ex(BG(ctype_string), 0);
}
- if (len == ZSTR_LEN(loc) && !memcmp(ZSTR_VAL(loc), retval, len)) {
+ if (len == 1 && *retval == 'C') {
+ /* C locale is represented as NULL. */
+ BG(ctype_string) = NULL;
+ zend_string_release_ex(loc, 0);
+ RETURN_INTERNED_STR(ZSTR_CHAR('C'));
+ } else if (len == ZSTR_LEN(loc) && !memcmp(ZSTR_VAL(loc), retval, len)) {
BG(ctype_string) = zend_string_copy(loc);
RETURN_STR(BG(ctype_string));
} else {