@@ -5737,6 +5737,29 @@ PHP_FUNCTION(substr_count)
5737
5737
}
5738
5738
/* }}} */
5739
5739
5740
+ static zend_always_inline void php_str_pad_fill (zend_string * result , size_t pad_chars , const char * pad_str , size_t pad_str_len ) {
5741
+ char * dest = ZSTR_VAL (result ) + ZSTR_LEN (result );
5742
+
5743
+ if (pad_str_len == 1 ) {
5744
+ memset (dest , pad_str [0 ], pad_chars );
5745
+
5746
+ return ;
5747
+ }
5748
+
5749
+ size_t full_copies = pad_chars / pad_str_len ;
5750
+ size_t remainder = pad_chars % pad_str_len ;
5751
+ char * p = dest ;
5752
+
5753
+ for (size_t j = 0 ; j < full_copies ; ++ j ) {
5754
+ memcpy (p , pad_str , pad_str_len );
5755
+ p += pad_str_len ;
5756
+ }
5757
+
5758
+ if (remainder > 0 ) {
5759
+ memcpy (p , pad_str , remainder );
5760
+ }
5761
+ }
5762
+
5740
5763
/* {{{ Returns input string padded on the left or right to specified length with pad_string */
5741
5764
PHP_FUNCTION (str_pad )
5742
5765
{
@@ -5749,7 +5772,7 @@ PHP_FUNCTION(str_pad)
5749
5772
char * pad_str = " " ; /* Pointer to padding string */
5750
5773
size_t pad_str_len = 1 ;
5751
5774
zend_long pad_type_val = PHP_STR_PAD_RIGHT ; /* The padding type value */
5752
- size_t i , left_pad = 0 , right_pad = 0 ;
5775
+ size_t left_pad = 0 , right_pad = 0 ;
5753
5776
zend_string * result = NULL ; /* Resulting string */
5754
5777
5755
5778
ZEND_PARSE_PARAMETERS_START (2 , 4 )
@@ -5799,16 +5822,20 @@ PHP_FUNCTION(str_pad)
5799
5822
}
5800
5823
5801
5824
/* First we pad on the left. */
5802
- for (i = 0 ; i < left_pad ; i ++ )
5803
- ZSTR_VAL (result )[ZSTR_LEN (result )++ ] = pad_str [i % pad_str_len ];
5825
+ if (left_pad > 0 ) {
5826
+ php_str_pad_fill (result , left_pad , pad_str , pad_str_len );
5827
+ ZSTR_LEN (result ) += left_pad ;
5828
+ }
5804
5829
5805
5830
/* Then we copy the input string. */
5806
5831
memcpy (ZSTR_VAL (result ) + ZSTR_LEN (result ), ZSTR_VAL (input ), ZSTR_LEN (input ));
5807
5832
ZSTR_LEN (result ) += ZSTR_LEN (input );
5808
5833
5809
5834
/* Finally, we pad on the right. */
5810
- for (i = 0 ; i < right_pad ; i ++ )
5811
- ZSTR_VAL (result )[ZSTR_LEN (result )++ ] = pad_str [i % pad_str_len ];
5835
+ if (right_pad > 0 ) {
5836
+ php_str_pad_fill (result , right_pad , pad_str , pad_str_len );
5837
+ ZSTR_LEN (result ) += right_pad ;
5838
+ }
5812
5839
5813
5840
ZSTR_VAL (result )[ZSTR_LEN (result )] = '\0' ;
5814
5841
0 commit comments