@@ -5805,16 +5805,42 @@ PHP_FUNCTION(str_pad)
58055805 }
58065806
58075807 /* First we pad on the left. */
5808- for (i = 0 ; i < left_pad ; i ++ )
5809- ZSTR_VAL (result )[ZSTR_LEN (result )++ ] = pad_str [i % pad_str_len ];
5808+ if (left_pad > 0 ) {
5809+ if (pad_str_len == 1 ) {
5810+ memset (ZSTR_VAL (result ), * pad_str , left_pad );
5811+ } else {
5812+ char * p = ZSTR_VAL (result );
5813+ for (i = 0 ; i < left_pad / pad_str_len ; i ++ ) {
5814+ memcpy (p , pad_str , pad_str_len );
5815+ p += pad_str_len ;
5816+ }
5817+ if (left_pad % pad_str_len ) {
5818+ memcpy (p , pad_str , left_pad % pad_str_len );
5819+ }
5820+ }
5821+ ZSTR_LEN (result ) += left_pad ;
5822+ }
58105823
58115824 /* Then we copy the input string. */
58125825 memcpy (ZSTR_VAL (result ) + ZSTR_LEN (result ), ZSTR_VAL (input ), ZSTR_LEN (input ));
58135826 ZSTR_LEN (result ) += ZSTR_LEN (input );
58145827
58155828 /* Finally, we pad on the right. */
5816- for (i = 0 ; i < right_pad ; i ++ )
5817- ZSTR_VAL (result )[ZSTR_LEN (result )++ ] = pad_str [i % pad_str_len ];
5829+ if (right_pad > 0 ) {
5830+ if (pad_str_len == 1 ) {
5831+ memset (ZSTR_VAL (result ) + ZSTR_LEN (result ), * pad_str , right_pad );
5832+ } else {
5833+ char * p = ZSTR_VAL (result ) + ZSTR_LEN (result );
5834+ for (i = 0 ; i < right_pad / pad_str_len ; i ++ ) {
5835+ memcpy (p , pad_str , pad_str_len );
5836+ p += pad_str_len ;
5837+ }
5838+ if (right_pad % pad_str_len ) {
5839+ memcpy (p , pad_str , right_pad % pad_str_len );
5840+ }
5841+ }
5842+ ZSTR_LEN (result ) += right_pad ;
5843+ }
58185844
58195845 ZSTR_VAL (result )[ZSTR_LEN (result )] = '\0' ;
58205846
0 commit comments