if (SUCCESS == zend_hash_get_current_data_ex(Z_ARRVAL_PP(repl), (void **) &tmp_repl, &pos_repl)) {
convert_to_string_ex(tmp_repl);
repl_len = Z_STRLEN_PP(tmp_repl);
- }
- result_len = Z_STRLEN_PP(str) - l + repl_len;
- result = ecalloc(result_len + 1, sizeof(char *));
-
- memcpy(result, Z_STRVAL_PP(str), f);
- if (repl_len) {
- memcpy(&result[f], Z_STRVAL_PP(tmp_repl), repl_len);
}
} else {
repl_len = Z_STRLEN_PP(repl);
- result_len = Z_STRLEN_PP(str) - l + repl_len;
- result = ecalloc(result_len + 1, sizeof(char *));
+ }
+ result_len = Z_STRLEN_PP(str) - l + repl_len;
+ result = emalloc(result_len + 1);
- memcpy(result, Z_STRVAL_PP(str), f);
- memcpy(&result[f], Z_STRVAL_PP(repl), repl_len);
+ memcpy(result, Z_STRVAL_PP(str), f);
+ if (repl_len) {
+ memcpy((result + f), (Z_TYPE_PP(repl) == IS_ARRAY ? Z_STRVAL_PP(tmp_repl) : Z_STRVAL_PP(repl)), repl_len);
}
- memcpy(&result[f + repl_len], Z_STRVAL_PP(str) + f + l, Z_STRLEN_PP(str) - f - l);
+ memcpy((result + f + repl_len), Z_STRVAL_PP(str) + f + l, Z_STRLEN_PP(str) - f - l);
+ result[result_len] = '\0';
RETURN_STRINGL(result, result_len, 0);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Functionality of 'from' and 'len' as arrays is not implemented.");
RETURN_STRINGL(Z_STRVAL_PP(str), Z_STRLEN_PP(str), 1);
}
} else { /* str is array of strings */
-
array_init(return_value);
if (Z_TYPE_PP(from) == IS_ARRAY) {
if (argc > 3 && Z_TYPE_PP(len) == IS_ARRAY) {
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(len), &pos_len);
}
-
+
if (Z_TYPE_PP(repl) == IS_ARRAY) {
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(repl), &pos_repl);
}
-
-
+
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(str), &pos_str);
while (zend_hash_get_current_data_ex(Z_ARRVAL_PP(str), (void **) &tmp_str, &pos_str) == SUCCESS) {
convert_to_string_ex(tmp_str);
-
+
if (Z_TYPE_PP(from) == IS_ARRAY) {
if (SUCCESS == zend_hash_get_current_data_ex(Z_ARRVAL_PP(from), (void **) &tmp_from, &pos_from)) {
convert_to_long_ex(tmp_from);
-
+
f = Z_LVAL_PP(tmp_from);
if (f < 0) {
f = Z_STRLEN_PP(tmp_str) + f;
zend_hash_move_forward_ex(Z_ARRVAL_PP(from), &pos_from);
} else {
f = 0;
- }
+ }
} else {
f = Z_LVAL_PP(from);
if (f < 0) {
}
} else if (f > Z_STRLEN_PP(tmp_str)) {
f = Z_STRLEN_PP(tmp_str);
- }
+ }
}
-
if (argc > 3 && Z_TYPE_PP(len) == IS_ARRAY) {
if (SUCCESS == zend_hash_get_current_data_ex(Z_ARRVAL_PP(len), (void **) &tmp_len, &pos_len)) {
convert_to_long_ex(tmp_len);
-
+
l = Z_LVAL_PP(tmp_len);
zend_hash_move_forward_ex(Z_ARRVAL_PP(len), &pos_len);
} else {
} else {
l = Z_STRLEN_PP(tmp_str);
}
-
+
if (l < 0) {
l = (Z_STRLEN_PP(tmp_str) - f) + l;
if (l < 0) {
l = 0;
}
- }
-
+ }
if ((f + l) > Z_STRLEN_PP(tmp_str)) {
l = Z_STRLEN_PP(tmp_str) - f;
}
-
+
result_len = Z_STRLEN_PP(tmp_str) - l;
-
+
if (Z_TYPE_PP(repl) == IS_ARRAY) {
if (SUCCESS == zend_hash_get_current_data_ex(Z_ARRVAL_PP(repl), (void **) &tmp_repl, &pos_repl)) {
convert_to_string_ex(tmp_repl);
result_len += Z_STRLEN_PP(tmp_repl);
zend_hash_move_forward_ex(Z_ARRVAL_PP(repl), &pos_repl);
- result = ecalloc(result_len + 1, sizeof(char *));
+ result = emalloc(result_len + 1);
memcpy(result, Z_STRVAL_PP(tmp_str), f);
- memcpy(&result[f], Z_STRVAL_PP(tmp_repl), Z_STRLEN_PP(tmp_repl));
- memcpy(&result[f + Z_STRLEN_PP(tmp_repl)], Z_STRVAL_PP(tmp_str) + f + l, Z_STRLEN_PP(tmp_str) - f - l);
+ memcpy((result + f), Z_STRVAL_PP(tmp_repl), Z_STRLEN_PP(tmp_repl));
+ memcpy((result + f + Z_STRLEN_PP(tmp_repl)), Z_STRVAL_PP(tmp_str) + f + l, Z_STRLEN_PP(tmp_str) - f - l);
} else {
- result = ecalloc(result_len + 1, sizeof(char *));
+ result = emalloc(result_len + 1);
memcpy(result, Z_STRVAL_PP(tmp_str), f);
- memcpy(&result[f], Z_STRVAL_PP(tmp_str) + f + l, Z_STRLEN_PP(tmp_str) - f - l);
+ memcpy((result + f), Z_STRVAL_PP(tmp_str) + f + l, Z_STRLEN_PP(tmp_str) - f - l);
}
-
} else {
result_len += Z_STRLEN_PP(repl);
- result = ecalloc(result_len + 1, sizeof(char *));
-
+ result = emalloc(result_len + 1);
memcpy(result, Z_STRVAL_PP(tmp_str), f);
- memcpy(&result[f], Z_STRVAL_PP(repl), Z_STRLEN_PP(repl));
- memcpy(&result[f + Z_STRLEN_PP(repl)], Z_STRVAL_PP(tmp_str) + f + l, Z_STRLEN_PP(tmp_str) - f - l);
+ memcpy((result + f), Z_STRVAL_PP(repl), Z_STRLEN_PP(repl));
+ memcpy((result + f + Z_STRLEN_PP(repl)), Z_STRVAL_PP(tmp_str) + f + l, Z_STRLEN_PP(tmp_str) - f - l);
}
-
+ result[result_len] = '\0';
add_next_index_stringl(return_value, result, result_len, 0);
-
+
zend_hash_move_forward_ex(Z_ARRVAL_PP(str), &pos_str);
} /*while*/
} /* if */