Skip to content

Commit 36d39b7

Browse files
committed
Simplify php_implode(). Fill the resulting string in direct order.
1 parent 2423b0b commit 36d39b7

File tree

1 file changed

+13
-43
lines changed

1 file changed

+13
-43
lines changed

ext/standard/string.c

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,12 +1200,12 @@ PHP_FUNCTION(explode)
12001200
*/
12011201
PHPAPI void php_implode(const zend_string *delim, zval *arr, zval *return_value)
12021202
{
1203-
zval *tmp;
1203+
zval *tmp;
12041204
int numelems;
12051205
zend_string *str;
12061206
char *cptr;
12071207
size_t len = 0;
1208-
zend_string **strings, **strptr;
1208+
zend_string **strings, **strptr, **s;
12091209

12101210
numelems = zend_hash_num_elements(Z_ARRVAL_P(arr));
12111211

@@ -1222,55 +1222,25 @@ PHPAPI void php_implode(const zend_string *delim, zval *arr, zval *return_value)
12221222
strptr = strings - 1;
12231223

12241224
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(arr), tmp) {
1225-
if (Z_TYPE_P(tmp) == IS_LONG) {
1226-
double val = Z_LVAL_P(tmp);
1227-
*++strptr = NULL;
1228-
((zend_long *) (strings + numelems))[strptr - strings] = Z_LVAL_P(tmp);
1229-
if (val < 0) {
1230-
val = -10 * val;
1231-
}
1232-
if (val < 10) {
1233-
len++;
1234-
} else {
1235-
len += (int) log10(10 * (double) val);
1236-
}
1237-
} else {
1238-
*++strptr = zval_get_string(tmp);
1239-
len += (*strptr)->len;
1240-
}
1225+
*++strptr = zval_get_string(tmp);
1226+
len += (*strptr)->len;
12411227
} ZEND_HASH_FOREACH_END();
12421228

12431229
str = zend_string_alloc(len + (numelems - 1) * delim->len, 0);
1244-
cptr = str->val + str->len;
1245-
*cptr = 0;
1230+
cptr = str->val;
12461231

1247-
do {
1248-
if (*strptr) {
1249-
cptr -= (*strptr)->len;
1250-
memcpy(cptr, (*strptr)->val, (*strptr)->len);
1251-
zend_string_release(*strptr);
1252-
} else {
1253-
char *oldPtr = cptr;
1254-
char oldVal = *cptr;
1255-
zend_long val = ((zend_long *) (strings + numelems))[strptr - strings];
1256-
cptr = zend_print_long_to_buf(cptr, val);
1257-
*oldPtr = oldVal;
1258-
}
1232+
for (s = strings; s < strptr; s++) {
1233+
memcpy(cptr, (*s)->val, (*s)->len);
1234+
cptr += (*s)->len;
1235+
zend_string_release(*s);
12591236

1260-
cptr -= delim->len;
12611237
memcpy(cptr, delim->val, delim->len);
1262-
} while (--strptr > strings);
1263-
1264-
if (*strptr) {
1265-
memcpy(str->val, (*strptr)->val, (*strptr)->len);
1266-
zend_string_release(*strptr);
1267-
} else {
1268-
char *oldPtr = cptr;
1269-
char oldVal = *cptr;
1270-
zend_print_long_to_buf(cptr, ((zend_long *) (strings + numelems))[strptr - strings]);
1271-
*oldPtr = oldVal;
1238+
cptr += delim->len;
12721239
}
12731240

1241+
memcpy(cptr, (*s)->val, (*s)->len + 1);
1242+
zend_string_release(*s);
1243+
12741244
efree(strings);
12751245
RETURN_NEW_STR(str);
12761246
}

0 commit comments

Comments
 (0)