@@ -5805,16 +5805,42 @@ PHP_FUNCTION(str_pad)
5805
5805
}
5806
5806
5807
5807
/* 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
+ }
5810
5823
5811
5824
/* Then we copy the input string. */
5812
5825
memcpy (ZSTR_VAL (result ) + ZSTR_LEN (result ), ZSTR_VAL (input ), ZSTR_LEN (input ));
5813
5826
ZSTR_LEN (result ) += ZSTR_LEN (input );
5814
5827
5815
5828
/* 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
+ }
5818
5844
5819
5845
ZSTR_VAL (result )[ZSTR_LEN (result )] = '\0' ;
5820
5846
0 commit comments