58static MUTEX_T locale_mutex =
NULL;
62static zend_string *php_bin2hex(
const unsigned char *old,
const size_t oldlen)
67 result = zend_string_safe_alloc(oldlen, 2 *
sizeof(
char), 0, 0);
69 for (i =
j = 0; i < oldlen; i++) {
80static zend_string *php_hex2bin(
const unsigned char *old,
const size_t oldlen)
82 size_t target_length = oldlen >> 1;
83 zend_string *str = zend_string_alloc(target_length, 0);
84 unsigned char *
ret = (
unsigned char *)
ZSTR_VAL(str);
87 for (i =
j = 0; i < target_length; i++) {
88 unsigned char c = old[
j++];
89 unsigned char l = c & ~0x20;
90 int is_letter = ((
unsigned int) ((l -
'A') ^ (l -
'F' - 1))) >> (8 *
sizeof(
unsigned int) - 1);
94 if (
EXPECTED((((c ^
'0') - 10) >> (8 *
sizeof(
unsigned int) - 1)) | is_letter)) {
95 d = (l - 0x10 - 0x27 * is_letter) << 4;
97 zend_string_efree(str);
102 is_letter = ((
unsigned int) ((l -
'A') ^ (l -
'F' - 1))) >> (8 *
sizeof(
unsigned int) - 1);
103 if (
EXPECTED((((c ^
'0') - 10) >> (8 *
sizeof(
unsigned int) - 1)) | is_letter)) {
104 d |= l - 0x10 - 0x27 * is_letter;
106 zend_string_efree(str);
123 tsrm_mutex_lock( locale_mutex );
129#if defined(PHP_WIN32) && _MSC_VER < 1900 && defined(ZTS)
133 _locale_t cur = _get_current_locale();
134 *
out = *cur->locinfo->lconv;
143 tsrm_mutex_unlock( locale_mutex );
154 locale_mutex = tsrm_mutex_alloc();
162 tsrm_mutex_free( locale_mutex );
214 bool len_is_null = 1;
230 }
else if ((
size_t)
start > remain_len) {
241 }
else if ((
size_t)
len > remain_len) {
280#ifdef HAVE_NL_LANGINFO
374#ifdef INT_CURR_SYMBOL
377#ifdef CURRENCY_SYMBOL
383#ifdef MON_DECIMAL_POINT
386#ifdef MON_THOUSANDS_SEP
398#ifdef INT_FRAC_DIGITS
424#elif defined(RADIXCHAR)
429#elif defined(THOUSEP)
487static inline zend_result php_charmask(
const unsigned char *input,
size_t len,
char *mask)
489 const unsigned char *
end;
494 for (
end = input+
len; input <
end; input++) {
496 if ((input+3 <
end) && input[1] ==
'.' && input[2] ==
'.'
498 memset(mask+c, 1, input[3] - c + 1);
500 }
else if ((input+1 <
end) && input[0] ==
'.' && input[1] ==
'.') {
508 if (input+2 >=
end) {
513 if (input[-1] > input[2]) {
564 php_charmask((
const unsigned char *) what, what_len, mask);
568 if (mask[(
unsigned char)*
start]) {
577 if (mask[(
unsigned char)*(
end-1)]) {
588 unsigned char c = (
unsigned char)*
start;
591 (c ==
' ' || c ==
'\n' || c ==
'\r' || c ==
'\t' || c ==
'\v' || c ==
'\0')) {
600 unsigned char c = (
unsigned char)*(
end-1);
603 (c ==
' ' || c ==
'\n' || c ==
'\r' || c ==
'\t' || c ==
'\v' || c ==
'\0')) {
613 return zend_string_copy(str);
630 return php_trim_int(str, what, what_len,
mode);
674 zval str_tmp, what_tmp;
705 char *breakchar =
"\n";
706 size_t newtextlen, chk, breakchar_len = 1;
725 if (breakchar_len == 0) {
730 if (linelength == 0 && docut) {
737 if (breakchar_len == 1 && !docut) {
740 laststart = lastspace = 0;
743 laststart = lastspace =
current + 1;
745 if (
current - laststart >= linelength) {
750 }
else if (
current - laststart >= linelength && laststart != lastspace) {
751 ZSTR_VAL(newtext)[lastspace] = breakchar[0];
752 laststart = lastspace + 1;
759 if (linelength > 0) {
761 newtext = zend_string_safe_alloc(chk, breakchar_len,
ZSTR_LEN(
text), 0);
766 newtext = zend_string_safe_alloc(
ZSTR_LEN(
text), breakchar_len + 1, 0, 0);
772 laststart = lastspace = 0;
776 newtext = zend_string_extend(newtext, alloced, 0);
785 newtextlen +=
current - laststart + breakchar_len;
787 laststart = lastspace =
current + 1;
793 if (
current - laststart >= linelength) {
795 newtextlen +=
current - laststart;
797 newtextlen += breakchar_len;
806 else if (
current - laststart >= linelength
807 && docut && laststart >= lastspace) {
809 newtextlen +=
current - laststart;
811 newtextlen += breakchar_len;
812 laststart = lastspace =
current;
818 else if (
current - laststart >= linelength
819 && laststart < lastspace) {
821 newtextlen += lastspace - laststart;
823 newtextlen += breakchar_len;
824 laststart = lastspace = lastspace + 1;
832 newtextlen +=
current - laststart;
835 ZSTR_VAL(newtext)[newtextlen] =
'\0';
837 newtext = zend_string_truncate(newtext, newtextlen, 0);
864 }
while (p2 !=
NULL && --limit > 1);
879#define EXPLODE_ALLOC_STEP 64
893 const char **positions =
emalloc(allocated *
sizeof(
char *));
895 positions[found++] = p1;
897 if (found >= allocated) {
901 positions[found++] = p1 = p2 +
ZSTR_LEN(delim);
903 }
while (p2 !=
NULL);
905 to_return = limit + found;
907 for (i = 0; i < to_return; i++) {
911 efree((
void *)positions);
913#undef EXPLODE_ALLOC_STEP
948 }
else if (limit < 0) {
971 numelems = zend_hash_num_elements(pieces);
975 }
else if (numelems == 1) {
982 ptr = strings =
do_alloca((
sizeof(*strings)) * numelems, use_heap);
1016 str = zend_string_safe_alloc(numelems - 1,
ZSTR_LEN(glue),
len, 0);
1030 char *oldPtr = cptr;
1031 char oldVal = *cptr;
1032 cptr = zend_print_long_to_buf(cptr,
ptr->lval);
1036 if (
ptr == strings) {
1062 if (pieces ==
NULL) {
1063 if (arg1_array ==
NULL) {
1065 "%s(): If argument #1 ($separator) is of type string, "
1066 "argument #2 ($array) must be of type array, null given",
1073 pieces = arg1_array;
1075 if (arg1_str ==
NULL) {
1090 if (!zend_parse_arg_array(
arg1, &pieces,
false,
false)) { \
1092 "%s(): If argument #1 ($separator) is of type string, "
1093 "argument #2 ($array) must be of type array, null given",
1117 "%s(): If argument #1 ($separator) is of type string, "
1118 "argument #2 ($array) must be of type array, null given",
1130#define STRTOK_TABLE(p) BG(strtok_table)[(unsigned char) *p]
1151 if (
BG(strtok_string)) {
1152 zend_string_release(
BG(strtok_string));
1154 BG(strtok_string) = zend_string_copy(str);
1159 if (!
BG(strtok_string)) {
1165 p =
BG(strtok_last);
1175 while (token < token_end) {
1195 if (
p -
BG(strtok_last)) {
1198 BG(strtok_last) =
p + 1;
1202 zend_string_release(
BG(strtok_string));
1203 BG(strtok_string) =
NULL;
1208 while (token < token_end) {
1262 char c =
ZSTR_VAL(incremented)[position];
1264 if (
EXPECTED( c !=
'z' && c !=
'Z' && c !=
'9' )) {
1270 ZSTR_VAL(incremented)[position] =
'0';
1272 ZSTR_VAL(incremented)[position] -= 25;
1275 }
while (carry && position-- > 0);
1281 switch (
ZSTR_VAL(incremented)[0]) {
1322 char c =
ZSTR_VAL(decremented)[position];
1324 if (
EXPECTED( c !=
'a' && c !=
'A' && c !=
'0' )) {
1330 ZSTR_VAL(decremented)[position] =
'9';
1332 ZSTR_VAL(decremented)[position] += 25;
1335 }
while (carry && position-- > 0);
1352#if defined(PHP_WIN32)
1353static bool _is_basename_start(
const char *
start,
const char *
pos)
1357 && *(
pos-1) !=
'\\') {
1360 }
else if (*(
pos-2) ==
'/' || *(
pos-2) ==
'\\') {
1362 }
else if (*(
pos-2) ==
':'
1363 && _is_basename_start(
start,
pos - 2)) {
1374 const char *basename_start;
1375 const char *basename_end;
1377 if (
CG(ascii_compatible_locale)) {
1378 basename_end =
s +
len - 1;
1381 while (basename_end >=
s
1383 && (*basename_end ==
'/'
1384 || *basename_end ==
'\\'
1385 || (*basename_end ==
':'
1386 && _is_basename_start(
s, basename_end)))) {
1388 && *basename_end ==
'/') {
1392 if (basename_end <
s) {
1397 basename_start = basename_end;
1399 while (basename_start >
s
1401 && *(basename_start-1) !=
'/'
1402 && *(basename_start-1) !=
'\\') {
1404 if (*(basename_start-1) ==
':' &&
1405 _is_basename_start(
s, basename_start - 1)) {
1409 && *(basename_start-1) !=
'/') {
1428 if (*
s ==
'/' || *
s ==
'\\') {
1440 }
else if ((*
s ==
':' && (
s - basename_start == 1))) {
1478 if (suffix !=
NULL && suffix_len < (
size_t)(basename_end - basename_start) &&
1479 memcmp(basename_end - suffix_len, suffix, suffix_len) == 0) {
1480 basename_end -= suffix_len;
1483 return zend_string_init(basename_start, basename_end - basename_start, 0);
1490 char *string, *suffix =
NULL;
1491 size_t string_len, suffix_len = 0;
1524 }
else if (levels < 1) {
1526 zend_string_efree(
ret);
1611 add_assoc_string(&tmp,
"dirname",
dirname);
1616 if (have_basename) {
1618 add_assoc_str(&tmp,
"basename", zend_string_copy(
ret));
1625 if (!have_basename) {
1642 if (!have_basename && !
ret) {
1649 add_assoc_stringl(&tmp,
"filename",
ZSTR_VAL(
ret), idx);
1660 if ((element = zend_hash_get_current_data(
Z_ARRVAL(tmp))) !=
NULL) {
1678static size_t php_strspn_strcspn_common(
const char *haystack,
const char *characters,
const char *haystack_end,
const char *characters_end,
bool must_match)
1684 if (characters_end - characters == 1) {
1685 const char *
ptr = haystack;
1686 while (
ptr < haystack_end && (*
ptr == *characters) == must_match) {
1689 return ptr - haystack;
1697 memset(table + 64, 0, 64);
1698 memset(table + 128, 0, 64);
1699 memset(table + 192, 0, 64);
1701 while (characters < characters_end) {
1702 table[(
unsigned char) *characters] =
true;
1706 const char *
ptr = haystack;
1707 while (
ptr < haystack_end && table[(
unsigned char) *
ptr] == must_match) {
1711 return ptr - haystack;
1715PHPAPI size_t php_strspn(
const char *haystack,
const char *characters,
const char *haystack_end,
const char *characters_end)
1717 return php_strspn_strcspn_common(haystack, characters, haystack_end, characters_end,
true);
1722PHPAPI size_t php_strcspn(
const char *haystack,
const char *characters,
const char *haystack_end,
const char *characters_end)
1724 return php_strspn_strcspn_common(haystack, characters, haystack_end, characters_end,
false);
1732 const char *found =
NULL;
1733 size_t found_offset;
1748 found_offset = found -
ZSTR_VAL(haystack);
1758 const char *found =
NULL;
1766 found_offset = found -
ZSTR_VAL(haystack);
1792 zval haystack_tmp, needle_tmp;
1807 zval haystack_tmp, needle_tmp;
1838 zval haystack_tmp, needle_tmp;
1861 RETURN_BOOL(zend_string_starts_with(haystack, needle));
1867 zval haystack_tmp, needle_tmp;
1873 RETVAL_BOOL(zend_string_starts_with(haystack, needle));
1902 const char *found =
NULL;
1941 zval haystack_tmp, needle_tmp;
1956 zval haystack_tmp, needle_tmp;
1974 const char *found =
NULL;
2009 const char *
p, *e, *found;
2054 const char *
p, *e, *found;
2093 haystack_dup = zend_string_tolower(haystack);
2117 needle_dup = zend_string_tolower(needle);
2118 if ((found = (
char *)zend_memnrstr(
p,
ZSTR_VAL(needle_dup),
ZSTR_LEN(needle_dup), e))) {
2134 const char *found =
NULL;
2149 found_offset = found -
ZSTR_VAL(haystack);
2158static zend_string *php_chunk_split(
const char *src,
size_t srclen,
const char *
end,
size_t endlen,
size_t chunklen)
2166 chunks = srclen / chunklen;
2167 restlen = srclen - chunks * chunklen;
2174 dest = zend_string_safe_alloc(chunks, endlen, srclen, 0);
2176 for (
p = src, q =
ZSTR_VAL(dest);
p < (src + srclen - chunklen + 1); ) {
2177 q = zend_mempcpy(q,
p, chunklen);
2178 q = zend_mempcpy(q,
end, endlen);
2183 q = zend_mempcpy(q,
p, restlen);
2184 q = zend_mempcpy(q,
end, endlen);
2210 if (chunklen <= 0) {
2215 if ((
size_t)chunklen >
ZSTR_LEN(str)) {
2245 }
else if ((
size_t)f >
ZSTR_LEN(str)) {
2254 if (-(
size_t)l >
ZSTR_LEN(str) - (
size_t)f) {
2259 }
else if ((
size_t)l >
ZSTR_LEN(str) - (
size_t)f) {
2278 bool len_is_null = 1;
2332 bool len_is_null = 1;
2351 }
else if (!len_ht) {
2375 }
else if ((
size_t)f >
ZSTR_LEN(str)) {
2400 while (repl_idx < repl_ht->nNumUsed) {
2401 tmp_repl = &repl_ht->
arPacked[repl_idx];
2408 while (repl_idx < repl_ht->nNumUsed) {
2409 tmp_repl = &repl_ht->
arData[repl_idx].
val;
2416 if (repl_idx < repl_ht->nNumUsed) {
2417 repl_str = zval_get_tmp_string(tmp_repl, &tmp_repl_str);
2431 zend_tmp_string_release(tmp_repl_str);
2449 from_idx = len_idx = repl_idx = 0;
2453 zend_string *orig_str = zval_get_tmp_string(tmp_str, &tmp_orig_str);
2457 while (from_idx < from_ht->nNumUsed) {
2458 tmp_from = &from_ht->
arPacked[from_idx];
2465 while (from_idx < from_ht->nNumUsed) {
2466 tmp_from = &from_ht->
arData[from_idx].
val;
2473 if (from_idx < from_ht->nNumUsed) {
2474 f = zval_get_long(tmp_from);
2502 while (len_idx < len_ht->nNumUsed) {
2503 tmp_len = &len_ht->
arPacked[len_idx];
2510 while (len_idx < len_ht->nNumUsed) {
2518 if (len_idx < len_ht->nNumUsed) {
2519 l = zval_get_long(tmp_len);
2524 }
else if (!len_is_null) {
2539 if (((
size_t) f + l) >
ZSTR_LEN(orig_str)) {
2543 result_len =
ZSTR_LEN(orig_str) - l;
2547 while (repl_idx < repl_ht->nNumUsed) {
2548 tmp_repl = &repl_ht->
arPacked[repl_idx];
2555 while (repl_idx < repl_ht->nNumUsed) {
2556 tmp_repl = &repl_ht->
arData[repl_idx].
val;
2563 if (repl_idx < repl_ht->nNumUsed) {
2565 zend_string *repl_str = zval_get_tmp_string(tmp_repl, &tmp_repl_str);
2569 result = zend_string_safe_alloc(1, result_len, 0, 0);
2574 zend_tmp_string_release(tmp_repl_str);
2576 result = zend_string_safe_alloc(1, result_len, 0, 0);
2584 result = zend_string_safe_alloc(1, result_len, 0, 0);
2602 zend_tmp_string_release(tmp_orig_str);
2612 const char *old_end, *
p;
2627 str = zend_string_safe_alloc(2,
ZSTR_LEN(old), 0, 0);
2692 return zend_string_copy(str);
2724 return zend_string_copy(str);
2754 char *delims =
" \t\r\n\f\v";
2757 size_t delims_len = 6;
2770 php_charmask((
const unsigned char *) delims, delims_len, mask);
2777 if (mask[(
unsigned char)*r++]) {
2791 }
else if (trlen == 1) {
2792 char ch_from = *str_from;
2793 char ch_to = *str_to;
2795 for (i = 0; i <
len; i++) {
2796 if (str[i] == ch_from) {
2801 unsigned char xlat[256];
2803 memset(xlat, 0,
sizeof(xlat));
2805 for (i = 0; i < trlen; i++) {
2806 xlat[(size_t)(
unsigned char) str_from[i]] = str_to[i] - str_from[i];
2809 for (i = 0; i <
len; i++) {
2810 str[i] += xlat[(size_t)(
unsigned char) str[i]];
2819static zend_string *php_strtr_ex(
zend_string *str,
const char *str_from,
const char *str_to,
size_t trlen)
2825 return zend_string_copy(str);
2826 }
else if (trlen == 1) {
2827 char ch_from = *str_from;
2828 char ch_to = *str_to;
2834 if (
ZSTR_LEN(str) >=
sizeof(__m128i)) {
2835 __m128i search = _mm_set1_epi8(ch_from);
2836 __m128i delta = _mm_set1_epi8(ch_to - ch_from);
2839 __m128i src = _mm_loadu_si128((__m128i*)(input));
2840 __m128i mask = _mm_cmpeq_epi8(src, search);
2841 if (_mm_movemask_epi8(mask)) {
2842 new_str = zend_string_alloc(
ZSTR_LEN(str), 0);
2845 _mm_storeu_si128((__m128i *)(output),
2847 _mm_and_si128(mask, delta)));
2848 input +=
sizeof(__m128i);
2849 output +=
sizeof(__m128i);
2850 len -=
sizeof(__m128i);
2851 for (;
len >=
sizeof(__m128i); input +=
sizeof(__m128i), output +=
sizeof(__m128i),
len -=
sizeof(__m128i)) {
2852 src = _mm_loadu_si128((__m128i*)(input));
2853 mask = _mm_cmpeq_epi8(src, search);
2854 _mm_storeu_si128((__m128i *)(output),
2856 _mm_and_si128(mask, delta)));
2858 for (;
len > 0; input++, output++,
len--) {
2859 *output = (*input == ch_from) ? ch_to : *input;
2864 input +=
sizeof(__m128i);
2865 len -=
sizeof(__m128i);
2866 }
while (
len >=
sizeof(__m128i));
2869 for (;
len > 0; input++,
len--) {
2870 if (*input == ch_from) {
2871 new_str = zend_string_alloc(
ZSTR_LEN(str), 0);
2878 for (;
len > 0; input++, output++,
len--) {
2879 *output = (*input == ch_from) ? ch_to : *input;
2886 unsigned char xlat[256];
2888 memset(xlat, 0,
sizeof(xlat));;
2890 for (i = 0; i < trlen; i++) {
2891 xlat[(size_t)(
unsigned char) str_from[i]] = str_to[i] - str_from[i];
2894 for (i = 0; i <
ZSTR_LEN(str); i++) {
2895 if (xlat[(
size_t)(
unsigned char)
ZSTR_VAL(str)[i]]) {
2896 new_str = zend_string_alloc(
ZSTR_LEN(str), 0);
2908 return zend_string_copy(str);
2918 size_t len,
pos, old_pos;
2919 bool has_num_keys =
false;
2920 size_t minlen = 128*1024;
2931 memset(bitset, 0,
sizeof(bitset));
2936 has_num_keys =
true;
2968 zend_string_release(key_used);
2998 if (pats == &str_hash) {
3006 while (
pos <= slen - minlen) {
3013 while (
len >= minlen) {
3016 if (entry !=
NULL) {
3019 smart_str_appendl(&
result, str + old_pos,
pos - old_pos);
3023 zend_tmp_string_release(tmp);
3034 smart_str_appendl(&
result, str + old_pos, slen - old_pos);
3041 if (pats == &str_hash) {
3054 if (length >=
sizeof(__m128i)) {
3055 __m128i search = _mm_set1_epi8(
ch);
3058 __m128i src = _mm_loadu_si128((__m128i*)(
p));
3059 uint32_t mask = _mm_movemask_epi8(_mm_cmpeq_epi8(src, search));
3064 mask = mask & (mask - 1);
3068 mask = mask - ((mask >> 1) & 0x5555);
3069 mask = (mask & 0x3333) + ((mask >> 2) & 0x3333);
3070 mask = (mask + (mask >> 4)) & 0x0F0F;
3071 mask = (mask + (mask >> 8)) & 0x00ff;
3075 p +=
sizeof(__m128i);
3076 length -=
sizeof(__m128i);
3077 }
while (length >=
sizeof(__m128i));
3086 while ((
p = memchr(
p,
ch, endp-
p))) {
3101 const char *source, *source_end;
3104 if (case_sensitivity) {
3110 for (source =
ZSTR_VAL(str); source < source_end; source++) {
3117 if (char_count == 0) {
3118 return zend_string_copy(str);
3121 if (replace_count) {
3122 *replace_count += char_count;
3126 result = zend_string_safe_alloc(char_count, to_len - 1,
ZSTR_LEN(str), 0);
3132 if (case_sensitivity) {
3135 while ((
p = memchr(
p, from, (e -
p)))) {
3136 target = zend_mempcpy(target,
s, (
p -
s));
3137 target = zend_mempcpy(target, to, to_len);
3140 if (--char_count == 0)
break;
3143 target = zend_mempcpy(target,
s, e -
s);
3147 for (source =
ZSTR_VAL(str); source < source_end; source++) {
3149 target = zend_mempcpy(target, to, to_len);
3163 const char *needle,
size_t needle_len,
const char *str,
size_t str_len,
zend_long *replace_count)
3166 if (needle_len <
ZSTR_LEN(haystack)) {
3172 if (needle_len == str_len) {
3188 const char *o =
ZSTR_VAL(haystack);
3189 const char *
n = needle;
3190 const char *endp = o +
ZSTR_LEN(haystack);
3192 while ((o = (
char*)
php_memnstr(o,
n, needle_len, endp))) {
3200 if (str_len > needle_len) {
3201 new_str = zend_string_safe_alloc(
count, str_len - needle_len,
ZSTR_LEN(haystack), 0);
3203 new_str = zend_string_alloc(
count * (str_len - needle_len) +
ZSTR_LEN(haystack), 0);
3209 e = zend_mempcpy(e,
p, r -
p);
3210 e = zend_mempcpy(e, str, str_len);
3215 e = zend_mempcpy(e,
p,
end -
p);
3223 return zend_string_copy(haystack);
3226 return zend_string_init_fast(str, str_len);
3244 lc_needle = zend_string_tolower(needle);
3261 const char *o = lc_haystack;
3263 const char *endp = o +
ZSTR_LEN(haystack);
3265 lc_needle = zend_string_tolower(needle);
3278 if (str_len >
ZSTR_LEN(lc_needle)) {
3288 e = zend_mempcpy(e,
ZSTR_VAL(haystack) + (
p - lc_haystack), r -
p);
3289 e = zend_mempcpy(e, str, str_len);
3294 e = zend_mempcpy(e,
ZSTR_VAL(haystack) + (
p - lc_haystack),
end -
p);
3304 return zend_string_copy(haystack);
3306 lc_needle = zend_string_tolower(needle);
3314 new_str = zend_string_init(str, str_len, 0);
3327 if (needle_len < length) {
3332 if (needle_len == str_len) {
3333 new_str = zend_string_init(haystack, length, 0);
3340 if (str_len < needle_len) {
3341 new_str = zend_string_alloc(length, 0);
3344 const char *o = haystack;
3345 const char *
n = needle;
3346 const char *endp = o + length;
3348 while ((o = (
char*)
php_memnstr(o,
n, needle_len, endp))) {
3354 new_str = zend_string_init(haystack, length, 0);
3357 if (str_len > needle_len) {
3358 new_str = zend_string_safe_alloc(
count, str_len - needle_len, length, 0);
3360 new_str = zend_string_alloc(
count * (str_len - needle_len) + length, 0);
3366 end = haystack + length;
3367 for (
p = haystack; (r = (
char*)
php_memnstr(
p, needle, needle_len,
end));
p = r + needle_len) {
3368 e = zend_mempcpy(e,
p, r -
p);
3369 e = zend_mempcpy(e, str, str_len);
3373 e = zend_mempcpy(e,
p,
end -
p);
3377 new_str = zend_string_truncate(new_str, e -
s, 0);
3380 }
else if (needle_len > length || memcmp(haystack, needle, length)) {
3381 new_str = zend_string_init(haystack, length, 0);
3384 new_str = zend_string_init(str, str_len, 0);
3393 if (zend_hash_num_elements(from_ht) < 1) {
3395 }
else if (zend_hash_num_elements(from_ht) == 1) {
3397 zend_string *str_key, *tmp_str, *replace, *tmp_replace;
3405 replace = zval_get_tmp_string(entry, &tmp_replace);
3409 }
else if (
ZSTR_LEN(str_key) == 1) {
3422 zend_tmp_string_release(tmp_str);
3423 zend_tmp_string_release(tmp_replace);
3490 zval str_tmp, from_tmp, to_tmp;
3511#ifdef ZEND_INTRIN_SSSE3_NATIVE
3512#include <tmmintrin.h>
3513#elif defined(__aarch64__) || defined(_M_ARM64)
3514#include <arm_neon.h>
3527 n = zend_string_alloc(
ZSTR_LEN(str), 0);
3533#ifdef ZEND_INTRIN_SSSE3_NATIVE
3535 const __m128i map = _mm_set_epi8(
3541 const __m128i str = _mm_loadu_si128((__m128i *)(e - 15));
3542 _mm_storeu_si128((__m128i *)
p, _mm_shuffle_epi8(str, map));
3545 }
while (e -
s > 15);
3547#elif defined(__aarch64__)
3550 const uint8x16_t str = vld1q_u8((uint8_t *)(e - 15));
3552 const uint8x16_t rev = vrev64q_u8(str);
3553 const uint8x16_t
ext = (uint8x16_t)
3554 vextq_u64((uint64x2_t)rev, (uint64x2_t)rev, 1);
3555 vst1q_u8((uint8_t *)
p,
ext);
3558 }
while (e -
s > 15);
3560#elif defined(_M_ARM64)
3563 const __n128 str = vld1q_u8((uint8_t *)(e - 15));
3566 const __n128 rev = vrev64q_u8(str);
3567 const __n128
ext = vextq_u64(rev, rev, 1);
3568 vst1q_u8((uint8_t *)
p,
ext);
3571 }
while (e -
s > 15);
3585static void php_similar_str(
const char *txt1,
size_t len1,
const char *txt2,
size_t len2,
size_t *pos1,
size_t *pos2,
size_t *
max,
size_t *
count)
3588 const char *end1 = (
char *) txt1 + len1;
3589 const char *end2 = (
char *) txt2 + len2;
3594 for (
p = (
char *) txt1;
p < end1;
p++) {
3595 for (q = (
char *) txt2; q < end2; q++) {
3596 for (l = 0; (
p + l < end1) && (q + l < end2) && (
p[l] == q[l]); l++);
3609static size_t php_similar_char(
const char *txt1,
size_t len1,
const char *txt2,
size_t len2)
3612 size_t pos1 = 0, pos2 = 0,
max,
count;
3614 php_similar_str(txt1, len1, txt2, len2, &pos1, &pos2, &
max, &
count);
3616 if (pos1 && pos2 &&
count > 1) {
3617 sum += php_similar_char(txt1, pos1,
3620 if ((pos1 +
max < len1) && (pos2 +
max < len2)) {
3621 sum += php_similar_char(txt1 + pos1 +
max, len1 - pos1 -
max,
3622 txt2 + pos2 +
max, len2 - pos2 -
max);
3646 if (compute_percentage) {
3655 if (compute_percentage) {
3733 const char *source, *
end;
3739 if (*source ==
'\\' && source + 1 <
end) {
3742 case 'n': *target++=
'\n'; nlen--;
break;
3743 case 'r': *target++=
'\r'; nlen--;
break;
3744 case 'a': *target++=
'\a'; nlen--;
break;
3745 case 't': *target++=
'\t'; nlen--;
break;
3746 case 'v': *target++=
'\v'; nlen--;
break;
3747 case 'b': *target++=
'\b'; nlen--;
break;
3748 case 'f': *target++=
'\f'; nlen--;
break;
3749 case '\\': *target++=
'\\'; nlen--;
break;
3751 if (source+1 <
end && isxdigit((
int)(*(source+1)))) {
3752 numtmp[0] = *++source;
3753 if (source+1 <
end && isxdigit((
int)(*(source+1)))) {
3754 numtmp[1] = *++source;
3761 *target++=(char)strtol(numtmp,
NULL, 16);
3767 while (source < end && *source >=
'0' && *source <=
'7' && i<3) {
3768 numtmp[i++] = *source++;
3772 *target++=(char)strtol(numtmp,
NULL, 8);
3798 const char *source, *
end;
3803 php_charmask((
const unsigned char *) what, wlength,
flags);
3805 for (source = str,
end = source +
len, target =
ZSTR_VAL(new_str); source <
end; source++) {
3807 if (
flags[(
unsigned char)c]) {
3808 if ((
unsigned char) c < 32 || (
unsigned char) c > 126) {
3811 case '\n': *target++ =
'n';
break;
3812 case '\t': *target++ =
't';
break;
3813 case '\r': *target++ =
'r';
break;
3814 case '\a': *target++ =
'a';
break;
3815 case '\v': *target++ =
'v';
break;
3816 case '\b': *target++ =
'b';
break;
3817 case '\f': *target++ =
'f';
break;
3818 default: target +=
snprintf(target, 4,
"%03o", (
unsigned char) c);
3827 newlen = target -
ZSTR_VAL(new_str);
3828 if (newlen <
len * 4) {
3829 new_str = zend_string_truncate(new_str, newlen, 0);
3844#ifdef ZEND_INTRIN_SSE4_2_NATIVE
3845# include <nmmintrin.h>
3847#elif defined(ZEND_INTRIN_SSE4_2_RESOLVER)
3848# include <nmmintrin.h>
3855# ifdef ZEND_INTRIN_SSE4_2_FUNC_PROTO
3862static php_addslashes_func_t resolve_addslashes(
void) {
3863 if (zend_cpu_supports_sse42()) {
3864 return php_addslashes_sse42;
3866 return php_addslashes_default;
3873 return php_addslashes_ptr(str);
3879 if (zend_cpu_supports_sse42()) {
3880 php_addslashes_ptr = php_addslashes_sse42;
3882 php_addslashes_ptr = php_addslashes_default;
3890#if defined(ZEND_INTRIN_SSE4_2_NATIVE) || defined(ZEND_INTRIN_SSE4_2_RESOLVER)
3891# ifdef ZEND_INTRIN_SSE4_2_NATIVE
3893# elif defined(ZEND_INTRIN_SSE4_2_RESOLVER)
3902 const char *source, *
end;
3914 w128 = _mm_load_si128((__m128i *)slashchars);
3916 s128 = _mm_loadu_si128((__m128i *)source);
3917 res = _mm_cvtsi128_si32(_mm_cmpestrm(w128, 4, s128, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK));
3922 }
while ((
end - source) > 15);
3925 while (source <
end) {
3938 return zend_string_copy(str);
3949 int i,
n = zend_ulong_ntz(
res);
3950 for (i = 0; i <
n; i++) {
3951 *target++ = source[
pos + i];
3955 if (source[
pos] ==
'\0') {
3958 *target++ = source[
pos];
3964 for (;
pos < 16;
pos++) {
3965 *target++ = source[
pos];
3968 }
else if (
end - source > 15) {
3969 w128 = _mm_load_si128((__m128i *)slashchars);
3972 for (;
end - source > 15; source += 16) {
3974 s128 = _mm_loadu_si128((__m128i *)source);
3975 res = _mm_cvtsi128_si32(_mm_cmpestrm(w128, 4, s128, 16, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK));
3978 int i,
n = zend_ulong_ntz(
res);
3979 for (i = 0; i <
n; i++) {
3980 *target++ = source[
pos + i];
3984 if (source[
pos] ==
'\0') {
3987 *target++ = source[
pos];
3992 for (;
pos < 16;
pos++) {
3993 *target++ = source[
pos];
3996 _mm_storeu_si128((__m128i*)target, s128);
4001 while (source <
end) {
4013 *target++ = *source;
4022 new_str = zend_string_truncate(new_str, target -
ZSTR_VAL(new_str), 0);
4032#if defined(__aarch64__) || defined(_M_ARM64)
4039 uint8x16_t s0 = vceqq_u8(x, vdupq_n_u8(
'\0'));
4040 uint8x16_t s1 = vceqq_u8(x, vdupq_n_u8(
'\''));
4041 uint8x16_t s2 = vceqq_u8(x, vdupq_n_u8(
'\"'));
4042 uint8x16_t s3 = vceqq_u8(x, vdupq_n_u8(
'\\'));
4043 uint8x16_t s01 = vorrq_u8(s0, s1);
4044 uint8x16_t s23 = vorrq_u8(s2, s3);
4045 uint8x16_t s0123 = vorrq_u8(s01, s23);
4047 vst1q_u8(qw.mem, s0123);
4053 for (
int i = 0; i < 16; i++) {
4055 if (
res.mem[i] == 0)
4069#ifndef ZEND_INTRIN_SSE4_2_NATIVE
4070# ifdef ZEND_INTRIN_SSE4_2_RESOLVER
4078 const char *source, *
end;
4089# if defined(__aarch64__) || defined(_M_ARM64)
4090 quad_word
res = {0};
4093 res = aarch64_contains_slash_chars(vld1q_u8((uint8_t *)source));
4094 if (
res.dw[0] |
res.dw[1])
4097 }
while ((
end - source) > 15);
4102 while (source <
end) {
4115 return zend_string_copy(str);
4123# if defined(__aarch64__) || defined(_M_ARM64)
4124 if (
res.dw[0] |
res.dw[1]) {
4125 target = aarch64_add_slashes(
res, source, target);
4128 for (;
end - source > 15; source += 16) {
4129 uint8x16_t x = vld1q_u8((uint8_t *)source);
4130 res = aarch64_contains_slash_chars(x);
4131 if (
res.dw[0] |
res.dw[1]) {
4132 target = aarch64_add_slashes(
res, source, target);
4134 vst1q_u8((uint8_t*)target, x);
4141 while (source <
end) {
4153 *target++ = *source;
4162 new_str = zend_string_truncate(new_str, target -
ZSTR_VAL(new_str), 0);
4178#if defined(__aarch64__) || defined(_M_ARM64)
4180 uint8x16_t x = vld1q_u8((uint8_t *)str);
4182 vst1q_u8(q.mem, vceqq_u8(x, vdupq_n_u8(
'\\')));
4183 if (q.dw[0] | q.dw[1]) {
4186 if (q.mem[i] == 0) {
4205 vst1q_u8((uint8_t*)
out, x);
4243 const __m128i slash = _mm_set1_epi8(
'\\');
4246 __m128i in = _mm_loadu_si128((__m128i *)
s);
4247 __m128i any_slash = _mm_cmpeq_epi8(in, slash);
4248 uint32_t
res = _mm_movemask_epi8(any_slash);
4251 int i,
n = zend_ulong_ntz(
res);
4252 const char *e =
s + 15;
4254 for (i = 0; i <
n; i++) {
4257 for (;
s < e;
s++) {
4273 _mm_storeu_si128((__m128i *)t, in);
4281 t = php_stripslashes_impl(
s, t, l);
4299#define _HEB_BLOCK_TYPE_ENG 1
4300#define _HEB_BLOCK_TYPE_HEB 2
4301#define isheb(c) (((((unsigned char) c) >= 224) && (((unsigned char) c) <= 250)) ? 1 : 0)
4302#define _isblank(c) (((((unsigned char) c) == ' ' || ((unsigned char) c) == '\t')) ? 1 : 0)
4303#define _isnewline(c) (((((unsigned char) c) == '\n' || ((unsigned char) c) == '\r')) ? 1 : 0)
4306static zend_long php_str_replace_in_subject(
4312 char *replace_value =
NULL;
4313 size_t replace_len = 0;
4316 uint32_t replace_idx;
4326 zend_string_addref(subject_str);
4332 replace_value =
ZSTR_VAL(replace_str);
4333 replace_len =
ZSTR_LEN(replace_str);
4340 zend_string *search_str = zval_get_tmp_string(search_entry, &tmp_search_str);
4348 while (replace_idx < replace_ht->nNumUsed) {
4349 replace_entry = &replace_ht->
arPacked[replace_idx];
4356 while (replace_idx < replace_ht->nNumUsed) {
4357 replace_entry = &replace_ht->
arData[replace_idx].
val;
4364 if (replace_idx < replace_ht->nNumUsed) {
4366 replace_entry_str = zval_get_tmp_string(replace_entry, &tmp_replace_entry_str);
4369 replace_value =
ZSTR_VAL(replace_entry_str);
4370 replace_len =
ZSTR_LEN(replace_entry_str);
4381 zend_long old_replace_count = replace_count;
4383 tmp_result = php_char_to_str_ex(subject_str,
4389 if (lc_subject_str && replace_count != old_replace_count) {
4391 lc_subject_str =
NULL;
4393 }
else if (
ZSTR_LEN(search_str) > 1) {
4394 if (case_sensitivity) {
4395 tmp_result = php_str_to_str_ex(subject_str,
4397 replace_value, replace_len, &replace_count);
4399 zend_long old_replace_count = replace_count;
4401 if (!lc_subject_str) {
4402 lc_subject_str = zend_string_tolower(subject_str);
4404 tmp_result = php_str_to_str_i_ex(subject_str,
ZSTR_VAL(lc_subject_str),
4405 search_str, replace_value, replace_len, &replace_count);
4406 if (replace_count != old_replace_count) {
4408 lc_subject_str =
NULL;
4412 zend_tmp_string_release(tmp_search_str);
4413 zend_tmp_string_release(tmp_replace_entry_str);
4417 zend_tmp_string_release(tmp_search_str);
4418 zend_tmp_string_release(tmp_replace_entry_str);
4420 if (subject_str == tmp_result) {
4421 zend_string_delref(subject_str);
4424 subject_str = tmp_result;
4428 if (lc_subject_str) {
4431 return replace_count;
4436 if (lc_subject_str) {
4443 php_char_to_str_ex(subject_str,
4449 }
else if (
ZSTR_LEN(search_str) > 1) {
4450 if (case_sensitivity) {
4455 lc_subject_str = zend_string_tolower(subject_str);
4457 search_str,
ZSTR_VAL(replace_str),
ZSTR_LEN(replace_str), &replace_count));
4464 return replace_count;
4468static void _php_str_replace_common(
4474 bool case_sensitivity
4476 zval *subject_entry;
4483 if (search_str && replace_ht) {
4497 subject_str = zval_get_tmp_string(subject_entry, &tmp_subject_str);
4498 count += php_str_replace_in_subject(search_str, search_ht, replace_str, replace_ht, subject_str, &
result, case_sensitivity);
4499 zend_tmp_string_release(tmp_subject_str);
4509 count = php_str_replace_in_subject(search_str, search_ht, replace_str, replace_ht, subject_str,
return_value, case_sensitivity);
4535 _php_str_replace_common(
return_value, search_ht, search_str, replace_ht, replace_str, subject_ht, subject_str, zcount, case_sensitivity);
4548 zend_string *search_str, *replace_str, *subject_str;
4549 HashTable *search_ht, *replace_ht, *subject_ht;
4550 zval search_tmp, replace_tmp, subject_tmp;
4556 _php_str_replace_common(
return_value, search_ht, search_str, replace_ht, replace_str, subject_ht, subject_str,
NULL,
true);
4574 char *str, *heb_str, *target;
4576 size_t block_start, block_end, block_type, i;
4593 block_start=block_end=0;
4595 heb_str = (
char *)
emalloc(str_len+1);
4596 target = heb_str+str_len;
4608 while ((
isheb((
int)*(tmp+1)) ||
_isblank((
int)*(tmp+1)) || ispunct((
int)*(tmp+1)) || (
int)*(tmp+1)==
'\n' ) && block_end<str_len-1) {
4612 for (i = block_start+1; i<= block_end+1; i++) {
4652 while (!
isheb(*(tmp+1)) && (
int)*(tmp+1)!=
'\n' && block_end < str_len-1) {
4656 while ((
_isblank((
int)*tmp) || ispunct((
int)*tmp)) && *tmp!=
'/' && *tmp!=
'-' && block_end > block_start) {
4660 for (i = block_end+1; i >= block_start+1; i--) {
4666 block_start=block_end+1;
4667 }
while (block_end < str_len-1);
4670 broken_str = zend_string_alloc(str_len, 0);
4676 while ((!max_chars || (max_chars > 0 && char_count < max_chars)) &&
begin > 0) {
4687 if (max_chars >= 0 && char_count == max_chars) {
4688 size_t new_char_count=char_count, new_begin=
begin;
4690 while (new_char_count > 0) {
4697 if (new_char_count > 0) {
4704 heb_str[
begin]=
'\n';
4710 *target = heb_str[i];
4713 for (i = orig_begin; i <=
end &&
_isnewline(heb_str[i]); i++) {
4714 *target = heb_str[i];
4736 const char *tmp, *
end;
4739 size_t repl_cnt = 0;
4756 if (*(tmp+1) ==
'\n') {
4760 }
else if (*tmp ==
'\n') {
4761 if (*(tmp+1) ==
'\r') {
4770 if (repl_cnt == 0) {
4775 size_t repl_len = is_xhtml ? (
sizeof(
"<br />") - 1) : (
sizeof(
"<br>") - 1);
4777 result = zend_string_safe_alloc(repl_cnt, repl_len,
ZSTR_LEN(str), 0);
4797 if ((*tmp ==
'\r' && *(tmp+1) ==
'\n') || (*tmp ==
'\n' && *(tmp+1) ==
'\r')) {
4821 const char *allowed_tags=
NULL;
4822 size_t allowed_tags_len=0;
4836 tag = zval_get_string(tmp);
4837 smart_str_appendc(&tags_ss,
'<');
4838 smart_str_append(&tags_ss, tag);
4839 smart_str_appendc(&tags_ss,
'>');
4840 zend_string_release(tag);
4843 smart_str_0(&tags_ss);
4847 }
else if (allow_str) {
4848 allowed_tags =
ZSTR_VAL(allow_str);
4849 allowed_tags_len =
ZSTR_LEN(allow_str);
4854 smart_str_free(&tags_ss);
4877 if (
ZSTR_LEN(loc) >= 5 && locp[2] ==
'_'
4878 && locp[0] >=
'a' && locp[0] <=
'z' && locp[1] >=
'a' && locp[1] <=
'z'
4879 && locp[3] >=
'A' && locp[3] <=
'Z' && locp[4] >=
'A' && locp[4] <=
'Z'
4880 && (locp[5] ==
'\0' || locp[5] ==
'.')
4881 && !(locp[0] ==
'u' && (locp[1] ==
'k' || locp[1] ==
's')
4882 && locp[3] ==
'U' && (locp[4] ==
'K' || locp[4] ==
'S')
4901 BG(locale_changed) = 1;
4904 if (
BG(ctype_string)) {
4911 }
else if (zend_string_equals_cstr(loc,
retval,
len)) {
4912 BG(ctype_string) = zend_string_copy(loc);
4913 return zend_string_copy(
BG(ctype_string));
4915 BG(ctype_string) = zend_string_init(
retval,
len, 0);
4916 return zend_string_copy(
BG(ctype_string));
4918 }
else if (zend_string_equals_cstr(loc,
retval,
len)) {
4919 return zend_string_copy(loc);
4927 zend_string *loc_str = zval_try_get_tmp_string(loc_zv, &tmp_loc_str);
4932 zend_tmp_string_release(tmp_loc_str);
4948 for (uint32_t i = 0; i <
num_args; i++) {
4988 arrayArg = zend_try_array_init(arrayArg);
4998#define PHP_TAG_BUF_SIZE 1023
5009static bool php_tag_find(
char *tag,
size_t len,
const char *set) {
5039 if (!isspace((
int)c)) {
5043 if (c !=
'/' || (*(t-1) !=
'<' && *(t+1) !=
'>')) {
5094 char *tbuf, *tp, *rp, c, lc;
5096 int br, depth=0, in_q = 0;
5099 char *allow_free =
NULL;
5110 allow = allow_free ? allow_free : allow;
5129 if (isspace(*(
p + 1)) && !allow_tag_spaces) {
5176 if (isspace(*(
p + 1)) && !allow_tag_spaces) {
5191 if (is_xml &&
p >=
buf + 1 && *(
p -1) ==
'-') {
5194 in_q =
state = is_xml = 0;
5203 if (php_tag_find(tbuf, tp-tbuf, allow)) {
5204 rp = zend_mempcpy(rp, tbuf, tp - tbuf);
5212 if (
p !=
buf && (!in_q || *
p == in_q)) {
5222 if (
p >=
buf + 1 && *(
p-1) ==
'<') {
5232 if (
p >=
buf + 1 && *(
p-1) ==
'<') {
5263 if (lc !=
'"' && lc !=
'\'') {
5269 if (lc !=
'"' && lc !=
'\'') {
5283 if (!br &&
p >=
buf + 1 && lc !=
'\"' && *(
p-1) ==
'?') {
5292 if (
p >=
buf + 1 && *(
p-1) !=
'\\') {
5295 }
else if (lc !=
'\\') {
5298 if (
p !=
buf && (!in_q || *
p == in_q)) {
5313 && (*(
p-1) ==
'm' || *(
p-1) ==
'M')
5314 && (*(
p-2) ==
'x' || *(
p-2) ==
'X')
5317 state = 1; is_xml=1;
5348 if (
p !=
buf && *(
p-1) !=
'\\' && (!in_q || *
p == in_q)) {
5357 if (
p >=
buf + 2 && *(
p-1) ==
'-' && *(
p-2) ==
'!') {
5367 && (*(
p-1) ==
'p' || *(
p-1) ==
'P')
5368 && (*(
p-2) ==
'y' || *(
p-2) ==
'Y')
5369 && (*(
p-3) ==
't' || *(
p-3) ==
'T')
5370 && (*(
p-4) ==
'c' || *(
p-4) ==
'C')
5371 && (*(
p-5) ==
'o' || *(
p-5) ==
'O')
5372 && (*(
p-6) ==
'd' || *(
p-6) ==
'D')) {
5387 if (c ==
'>' && !in_q) {
5388 if (
p >=
buf + 2 && *(
p-1) ==
'-' && *(
p-2) ==
'-') {
5399 if (rp < rbuf +
len) {
5410 return (
size_t)(rp - rbuf);
5418 char delimiter =
',', enclosure =
'"';
5419 char *delimiter_str =
NULL, *enclosure_str =
NULL;
5420 size_t delimiter_str_len = 0, enclosure_str_len = 0;
5431 if (delimiter_str !=
NULL) {
5433 if (delimiter_str_len != 1) {
5438 delimiter = delimiter_str[0];
5440 if (enclosure_str !=
NULL) {
5441 if (enclosure_str_len != 1) {
5446 enclosure = enclosure_str[0];
5455 if (values ==
NULL) {
5482 if (
ZSTR_LEN(input_str) == 0 || mult == 0)
5486 result = zend_string_safe_alloc(
ZSTR_LEN(input_str), mult, 0, 0);
5487 result_len =
ZSTR_LEN(input_str) * mult;
5503 l = (e-
s) < (ee-e) ? (e-
s) : (ee-e);
5521 const unsigned char *
buf;
5533 if (mymode < 0 || mymode > 4) {
5539 memset((
void*) chars, 0,
sizeof(chars));
5551 for (inx = 0; inx < 256; inx++) {
5557 if (chars[inx] != 0) {
5562 if (chars[inx] == 0) {
5567 if (chars[inx] != 0) {
5568 retstr[retlen++] = inx;
5572 if (chars[inx] == 0) {
5573 retstr[retlen++] = inx;
5579 if (mymode == 3 || mymode == 4) {
5597 is_case_insensitive));
5618 zval grouping, mon_grouping;
5628 struct lconv currlocdata;
5635 for (i = 0; i <
len; i++) {
5642 for (i = 0; i <
len; i++) {
5646 add_assoc_string(
return_value,
"decimal_point", currlocdata.decimal_point);
5647 add_assoc_string(
return_value,
"thousands_sep", currlocdata.thousands_sep);
5648 add_assoc_string(
return_value,
"int_curr_symbol", currlocdata.int_curr_symbol);
5649 add_assoc_string(
return_value,
"currency_symbol", currlocdata.currency_symbol);
5650 add_assoc_string(
return_value,
"mon_decimal_point", currlocdata.mon_decimal_point);
5651 add_assoc_string(
return_value,
"mon_thousands_sep", currlocdata.mon_thousands_sep);
5652 add_assoc_string(
return_value,
"positive_sign", currlocdata.positive_sign);
5653 add_assoc_string(
return_value,
"negative_sign", currlocdata.negative_sign);
5654 add_assoc_long(
return_value,
"int_frac_digits", currlocdata.int_frac_digits);
5655 add_assoc_long(
return_value,
"frac_digits", currlocdata.frac_digits);
5656 add_assoc_long(
return_value,
"p_cs_precedes", currlocdata.p_cs_precedes);
5657 add_assoc_long(
return_value,
"p_sep_by_space", currlocdata.p_sep_by_space);
5658 add_assoc_long(
return_value,
"n_cs_precedes", currlocdata.n_cs_precedes);
5659 add_assoc_long(
return_value,
"n_sep_by_space", currlocdata.n_sep_by_space);
5660 add_assoc_long(
return_value,
"p_sign_posn", currlocdata.p_sign_posn);
5661 add_assoc_long(
return_value,
"n_sign_posn", currlocdata.n_sign_posn);
5672 char *haystack, *needle;
5674 bool length_is_null = 1;
5676 size_t haystack_len, needle_len;
5677 const char *
p, *endp;
5687 if (needle_len == 0) {
5706 if (!length_is_null) {
5708 length += haystack_len;
5710 if (length < 0 || ((
size_t)length > haystack_len)) {
5715 length = haystack_len;
5718 if (needle_len == 1) {
5723 while ((
p = (
char*)
php_memnstr(
p, needle, needle_len, endp))) {
5741 size_t num_pad_chars;
5742 char *pad_str =
" ";
5743 size_t pad_str_len = 1;
5745 size_t i, left_pad=0, right_pad=0;
5758 if (pad_length < 0 || (
size_t)pad_length <=
ZSTR_LEN(input)) {
5762 if (pad_str_len == 0) {
5772 num_pad_chars = pad_length -
ZSTR_LEN(input);
5773 result = zend_string_safe_alloc(1,
ZSTR_LEN(input), num_pad_chars, 0);
5777 switch (pad_type_val) {
5780 right_pad = num_pad_chars;
5784 left_pad = num_pad_chars;
5789 left_pad = num_pad_chars / 2;
5790 right_pad = num_pad_chars - left_pad;
5795 for (i = 0; i < left_pad; i++)
5803 for (i = 0; i < right_pad; i++)
5817 size_t str_len, format_len;
5853 const __m128i a_minus_1 = _mm_set1_epi8(
'a' - 1);
5854 const __m128i m_plus_1 = _mm_set1_epi8(
'm' + 1);
5855 const __m128i n_minus_1 = _mm_set1_epi8(
'n' - 1);
5856 const __m128i z_plus_1 = _mm_set1_epi8(
'z' + 1);
5857 const __m128i A_minus_1 = _mm_set1_epi8(
'A' - 1);
5858 const __m128i M_plus_1 = _mm_set1_epi8(
'M' + 1);
5859 const __m128i N_minus_1 = _mm_set1_epi8(
'N' - 1);
5860 const __m128i Z_plus_1 = _mm_set1_epi8(
'Z' + 1);
5861 const __m128i
add = _mm_set1_epi8(13);
5862 const __m128i sub = _mm_set1_epi8(-13);
5865 __m128i in,
gt, lt, cmp, delta;
5867 delta = _mm_setzero_si128();
5868 in = _mm_loadu_si128((__m128i *)
p);
5870 gt = _mm_cmpgt_epi8(in, a_minus_1);
5871 lt = _mm_cmplt_epi8(in, m_plus_1);
5872 cmp = _mm_and_si128(lt,
gt);
5873 if (_mm_movemask_epi8(cmp)) {
5874 cmp = _mm_and_si128(cmp,
add);
5875 delta = _mm_or_si128(delta, cmp);
5878 gt = _mm_cmpgt_epi8(in, n_minus_1);
5879 lt = _mm_cmplt_epi8(in, z_plus_1);
5880 cmp = _mm_and_si128(lt,
gt);
5881 if (_mm_movemask_epi8(cmp)) {
5882 cmp = _mm_and_si128(cmp, sub);
5883 delta = _mm_or_si128(delta, cmp);
5886 gt = _mm_cmpgt_epi8(in, A_minus_1);
5887 lt = _mm_cmplt_epi8(in, M_plus_1);
5888 cmp = _mm_and_si128(lt,
gt);
5889 if (_mm_movemask_epi8(cmp)) {
5890 cmp = _mm_and_si128(cmp,
add);
5891 delta = _mm_or_si128(delta, cmp);
5894 gt = _mm_cmpgt_epi8(in, N_minus_1);
5895 lt = _mm_cmplt_epi8(in, Z_plus_1);
5896 cmp = _mm_and_si128(lt,
gt);
5897 if (_mm_movemask_epi8(cmp)) {
5898 cmp = _mm_and_si128(cmp, sub);
5899 delta = _mm_or_si128(delta, cmp);
5902 in = _mm_add_epi8(in, delta);
5903 _mm_storeu_si128((__m128i *)target, in);
5907 }
while (e -
p > 15);
5912 if (*
p >=
'a' && *
p <=
'z') {
5913 *target++ =
'a' + (((*
p++ -
'a') + 13) % 26);
5914 }
else if (*
p >=
'A' && *
p <=
'Z') {
5915 *target++ =
'A' + (((*
p++ -
'A') + 13) % 26);
5944 void *
state = engine.state;
5946 int64_t n_elems, rnd_idx, n_left;
5964 if (rnd_idx != n_left) {
5966 str[n_left] = str[rnd_idx];
5967 str[rnd_idx] = temp;
5987 php_random_default_engine(),
6007 char *char_list =
NULL,
ch[256];
6008 const char *
p, *e, *
s;
6009 size_t char_list_len = 0, word_count = 0;
6039 php_charmask((
const unsigned char *) char_list, char_list_len,
ch);
6046 if ((*
p ==
'\'' && (!char_list || !
ch[
'\''])) || (*
p ==
'-' && (!char_list || !
ch[
'-']))) {
6050 if (*(e - 1) ==
'-' && (!char_list || !
ch[
'-'])) {
6056 while (
p < e && (isalpha((
unsigned char)*
p) || (char_list &&
ch[(
unsigned char)*
p]) || *
p ==
'\'' || *
p ==
'-')) {
6089 size_t n_reg_segments;
6097 if (split_length <= 0) {
6102 if ((
size_t)split_length >=
ZSTR_LEN(str)) {
6114 n_reg_segments =
ZSTR_LEN(str) / split_length;
6117 while (n_reg_segments-- > 0) {
6162 bool len_is_default=1;
6175 if (!len_is_default &&
len <= 0) {
6211 str = zend_string_safe_alloc(
len, 2, 0, 0);
6216 c = (
unsigned char)(*
s);
6229 str = zend_string_truncate(str,
ZSTR_LEN(str), 0);
6241 str = zend_string_alloc(
len, 0);
6258 str = zend_string_truncate(str,
ZSTR_LEN(str), 0);
SAPI_API sapi_module_struct sapi_module
file_private const char ext[]
stristr(string $haystack, string $needle, bool $before_needle=false)
stripos(string $haystack, string $needle, int $offset=0)
str_split(string $string, int $length=1)
quotemeta(string $string)
str_increment(string $string)
str_repeat(string $string, int $times)
implode(string|array $separator, ?array $array=null)
str_getcsv(string $string, string $separator=",", string $enclosure="\"", string $escape="\\")
sscanf(string $string, string $format, mixed &... $vars)
str_rot13(string $string)
utf8_encode(string $string)
rtrim(string $string, string $characters=" \n\r\t\v\0")
str_contains(string $haystack, string $needle)
trim(string $string, string $characters=" \n\r\t\v\0")
substr_count(string $haystack, string $needle, int $offset=0, ?int $length=null)
str_ireplace(array|string $search, array|string $replace, string|array $subject, &$count=null)
strip_tags(string $string, array|string|null $allowed_tags=null)
str_decrement(string $string)
setlocale(int $category, $locales,... $rest)
wordwrap(string $string, int $width=75, string $break="\n", bool $cut_long_words=false)
strtoupper(string $string)
explode(string $separator, string $string, int $limit=PHP_INT_MAX)
ucwords(string $string, string $separators=" \t\r\n\f\v")
str_ends_with(string $haystack, string $needle)
substr_replace(array|string $string, array|string $replace, array|int $offset, array|int|null $length=null)
strtr(string $string, string|array $from, ?string $to=null)
strpos(string $haystack, string $needle, int $offset=0)
strtok(string $string, ?string $token=null)
str_replace(array|string $search, array|string $replace, string|array $subject, &$count=null)
strcoll(string $string1, string $string2)
strrchr(string $haystack, string $needle, bool $before_needle=false)
pathinfo(string $path, int $flags=PATHINFO_ALL)
str_word_count(string $string, int $format=0, ?string $characters=null)
utf8_decode(string $string)
addslashes(string $string)
stripcslashes(string $string)
dirname(string $path, int $levels=1)
strrpos(string $haystack, string $needle, int $offset=0)
str_starts_with(string $haystack, string $needle)
nl2br(string $string, bool $use_xhtml=true)
hebrev(string $string, int $max_chars_per_line=0)
substr_compare(string $haystack, string $needle, int $offset, ?int $length=null, bool $case_insensitive=false)
strspn(string $string, string $characters, int $offset=0, ?int $length=null)
strtolower(string $string)
str_pad(string $string, int $length, string $pad_string=" ", int $pad_type=STR_PAD_RIGHT)
ltrim(string $string, string $characters=" \n\r\t\v\0")
count_chars(string $string, int $mode=0)
strpbrk(string $string, string $characters)
count(Countable|array $value, int $mode=COUNT_NORMAL)
addcslashes(string $string, string $characters)
str_shuffle(string $string)
strstr(string $haystack, string $needle, bool $before_needle=false)
stripslashes(string $string)
basename(string $path, string $suffix="")
strcspn(string $string, string $characters, int $offset=0, ?int $length=null)
parse_str(string $string, &$result)
similar_text(string $string1, string $string2, &$percent=null)
substr(string $string, int $offset, ?int $length=null)
strripos(string $haystack, string $needle, int $offset=0)
chunk_split(string $string, int $length=76, string $separator="\r\n")
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI HashTable * php_bc_fgetcsv_empty_line(void)
PHPAPI HashTable * php_fgetcsv(php_stream *stream, char delimiter, char enclosure, int escape_char, size_t buf_len, char *buf)
PHPAPI int php_csv_handle_escape_argument(const zend_string *escape_str, uint32_t arg_num)
PHPAPI unsigned int php_next_utf8_char(const unsigned char *str, size_t str_len, size_t *cursor, zend_result *status)
foreach($dp as $el) foreach( $dp as $el) if( $pass2< 2) echo ""
PW32IO size_t php_win32_ioutil_dirname(char *path, size_t len)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
#define PHP_MSHUTDOWN_FUNCTION
#define PHP_MINIT_FUNCTION
unsigned const char * end
unsigned const char * pos
unsigned const char * text
struct _php_random_algo_with_state php_random_algo_with_state
struct _php_random_algo php_random_algo
unsigned char key[REFLECTION_KEY_LEN]
#define PHP_PATHINFO_FILENAME
#define PHP_STR_PAD_RIGHT
#define strnatcasecmp(a, b)
PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len, bool is_case_insensitive)
#define PHP_PATHINFO_BASENAME
#define php_mblen(ptr, len)
#define PHP_PATHINFO_DIRNAME
#define PHP_PATHINFO_EXTENSION
PHPAPI int php_sscanf_internal(char *string, char *format, int argCount, zval *args, int varStart, zval *return_value)
#define SCAN_ERROR_WRONG_PARAM_COUNT
#define PHP_CSV_ESCAPE_ERROR
PHPAPI char * php_stristr(const char *s, const char *t, size_t s_len, size_t t_len)
PHPAPI void php_stripcslashes(zend_string *str)
PHPAPI size_t php_strcspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
PHPAPI char * php_strtr(char *str, size_t len, const char *str_from, const char *str_to, size_t trlen)
PHPAPI zend_string * php_basename(const char *s, size_t len, const char *suffix, size_t suffix_len)
#define _HEB_BLOCK_TYPE_HEB
PHPAPI bool php_binary_string_shuffle(php_random_algo_with_state engine, char *str, zend_long len)
PHPAPI struct lconv * localeconv_r(struct lconv *out)
PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return_value)
#define EXPLODE_ALLOC_STEP
PHPAPI zend_string * php_str_to_str(const char *haystack, size_t length, const char *needle, size_t needle_len, const char *str, size_t str_len)
PHPAPI size_t php_strip_tags_ex(char *rbuf, size_t len, const char *allow, size_t allow_len, bool allow_tag_spaces)
PHPAPI size_t php_strip_tags(char *rbuf, size_t len, const char *allow, size_t allow_len)
PHPAPI zend_string * php_addcslashes(zend_string *str, const char *what, size_t wlength)
PHPAPI zend_string * php_addslashes(zend_string *str)
#define _HEB_BLOCK_TYPE_ENG
PHPAPI zend_string * php_addcslashes_str(const char *str, size_t len, const char *what, size_t wlength)
PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return_value, zend_long limit)
PHPAPI size_t php_strspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
PHPAPI void php_stripslashes(zend_string *str)
PHPAPI void php_explode_negative_limit(const zend_string *delim, zend_string *str, zval *return_value, zend_long limit)
PHPAPI size_t php_dirname(char *path, size_t len)
PHPAPI zend_string * php_trim(zend_string *str, const char *what, size_t what_len, int mode)
zend_long(* range)(void *state, zend_long min, zend_long max)
ZEND_API ZEND_COLD void zend_type_error(const char *format,...)
#define INTERNAL_FUNCTION_PARAMETERS
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length)
ZEND_API void add_index_stringl(zval *arg, zend_ulong index, const char *str, size_t length)
ZEND_API void add_index_str(zval *arg, zend_ulong index, zend_string *str)
ZEND_API ZEND_COLD void zend_argument_must_not_be_empty_error(uint32_t arg_num)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format,...)
ZEND_API void add_index_long(zval *arg, zend_ulong index, zend_long n)
#define Z_PARAM_ARRAY_HT_OR_STR_OR_NULL(dest_ht, dest_str)
#define RETVAL_COPY_DEREF(zv)
#define RETURN_STRINGL(s, l)
#define ZEND_PARSE_PARAMETERS_END()
#define Z_PARAM_ARRAY_HT_OR_NULL(dest)
#define Z_PARAM_STR_OR_NULL(dest)
#define ZEND_PARSE_PARAMETERS_NONE()
#define RETVAL_STR_COPY(s)
#define array_init_size(arg, size)
#define RETVAL_NEW_STR(s)
#define Z_PARAM_STRING(dest, dest_len)
#define Z_PARAM_STR(dest)
#define Z_PARAM_STRING_OR_NULL(dest, dest_len)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define RETVAL_EMPTY_STRING()
#define ZEND_TRY_ASSIGN_REF_LONG(zv, lval)
#define Z_PARAM_ARRAY_HT_OR_STR(dest_ht, dest_str)
#define Z_PARAM_LONG(dest)
#define Z_PARAM_VARIADIC(spec, dest, dest_num)
#define RETURN_NEW_STR(s)
#define Z_PARAM_ARRAY_HT_OR_LONG_OR_NULL(dest_ht, dest_long, is_null)
#define ZEND_TRY_ASSIGN_REF_DOUBLE(zv, dval)
#define Z_PARAM_ARRAY_HT(dest)
#define Z_PARAM_LONG_OR_NULL(dest, is_null)
#define RETURN_COPY_VALUE(zv)
#define RETURN_STRINGL_FAST(s, l)
#define Z_PARAM_BOOL(dest)
#define RETURN_EMPTY_ARRAY()
#define RETURN_EMPTY_STRING()
#define Z_PARAM_ZVAL(dest)
#define ZVAL_STRINGL(z, s, l)
#define WRONG_PARAM_COUNT
#define Z_PARAM_ARRAY_HT_OR_LONG(dest_ht, dest_long)
#define RETVAL_STRINGL(s, l)
#define RETURN_STR_COPY(s)
#define ZVAL_EMPTY_STRING(z)
#define estrndup(s, length)
#define ecalloc(nmemb, size)
#define erealloc(ptr, size)
strncmp(string $string1, string $string2, int $length)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API size_t zend_dirname(char *path, size_t len)
#define ZEND_NO_SANITIZE_ADDRESS
ZEND_API const char * get_active_function_name(void)
#define Z_FLF_PARAM_ARRAY(arg_num, dest)
#define Z_FLF_PARAM_LONG_OR_NULL(arg_num, is_null, dest)
#define Z_FLF_PARAM_ARRAY_OR_NULL(arg_num, dest)
#define Z_FLF_PARAM_BOOL(arg_num, dest)
#define Z_FLF_PARAM_STR(arg_num, dest, tmp)
#define ZEND_FRAMELESS_FUNCTION(name, arity)
#define Z_FLF_PARAM_ARRAY_HT_OR_STR(arg_num, dest_ht, dest_str, str_tmp)
#define Z_FLF_PARAM_FREE_STR(arg_num, tmp)
#define Z_FLF_PARAM_LONG(arg_num, dest)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API void ZEND_FASTCALL zend_hash_real_init_packed(HashTable *ht)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API zval *ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_add_new(HashTable *ht, zend_ulong h, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key, zval *pData)
#define ZEND_HASH_FILL_GROW()
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
#define ZEND_HASH_FILL_PACKED(ht)
#define ZEND_HASH_FILL_END()
#define ZEND_HASH_FILL_SET_STR(_val)
#define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val)
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_FILL_NEXT()
#define ZEND_HASH_FOREACH_STR_KEY(ht, _key)
#define ZEND_HASH_FOREACH_VAL(ht, _val)
struct _zend_string zend_string
ZEND_API zend_string *ZEND_FASTCALL zend_long_to_str(zend_long num)
ZEND_API int ZEND_FASTCALL zend_binary_strncmp(const char *s1, size_t len1, const char *s2, size_t len2, size_t length)
ZEND_API bool zend_string_only_has_ascii_alphanumeric(const zend_string *str)
ZEND_API char *ZEND_FASTCALL zend_str_tolower_dup_ex(const char *source, size_t length)
ZEND_API int ZEND_FASTCALL zend_binary_strncasecmp_l(const char *s1, size_t len1, const char *s2, size_t len2, size_t length)
ZEND_API void zend_update_current_locale(void)
ZEND_API zend_string *ZEND_FASTCALL zval_get_string_func(zval *op)
#define zend_toupper_ascii(c)
#define zend_tolower_ascii(c)
#define ALLOCA_FLAG(name)
#define ZEND_ATTRIBUTE_UNUSED
#define EXPECTED(condition)
#define do_alloca(p, use_heap)
#define zend_always_inline
#define ZEND_SET_ALIGNED(alignment, decl)
#define free_alloca(p, use_heap)
#define ZEND_INTRIN_SSE4_2_FUNC_DECL(func)
#define UNEXPECTED(condition)
struct _zend_array zend_array
#define ZSTR_COPY_CONCAT_PROPERTIES(out, in)
#define zend_string_equals_literal(str, literal)
#define ZSTR_EMPTY_ALLOC()
#define STR_EMPTY_ALLOC()
#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
#define ZVAL_STR_COPY(z, s)
struct _zend_array HashTable
#define Z_STRLEN_P(zval_p)
#define ZVAL_NEW_STR(z, s)
ZEND_RESULT_CODE zend_result
#define GC_ADD_FLAGS(p, flags)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)