@@ -1200,12 +1200,12 @@ PHP_FUNCTION(explode)
1200
1200
*/
1201
1201
PHPAPI void php_implode (const zend_string * delim , zval * arr , zval * return_value )
1202
1202
{
1203
- zval * tmp ;
1203
+ zval * tmp ;
1204
1204
int numelems ;
1205
1205
zend_string * str ;
1206
1206
char * cptr ;
1207
1207
size_t len = 0 ;
1208
- zend_string * * strings , * * strptr ;
1208
+ zend_string * * strings , * * strptr , * * s ;
1209
1209
1210
1210
numelems = zend_hash_num_elements (Z_ARRVAL_P (arr ));
1211
1211
@@ -1222,55 +1222,25 @@ PHPAPI void php_implode(const zend_string *delim, zval *arr, zval *return_value)
1222
1222
strptr = strings - 1 ;
1223
1223
1224
1224
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 ;
1241
1227
} ZEND_HASH_FOREACH_END ();
1242
1228
1243
1229
str = zend_string_alloc (len + (numelems - 1 ) * delim -> len , 0 );
1244
- cptr = str -> val + str -> len ;
1245
- * cptr = 0 ;
1230
+ cptr = str -> val ;
1246
1231
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 );
1259
1236
1260
- cptr -= delim -> len ;
1261
1237
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 ;
1272
1239
}
1273
1240
1241
+ memcpy (cptr , (* s )-> val , (* s )-> len + 1 );
1242
+ zend_string_release (* s );
1243
+
1274
1244
efree (strings );
1275
1245
RETURN_NEW_STR (str );
1276
1246
}
0 commit comments