@@ -5756,6 +5756,27 @@ PHP_FUNCTION(substr_count)
5756
5756
}
5757
5757
/* }}} */
5758
5758
5759
+ static void php_str_pad_fill (zend_string * result , size_t pad_chars , const char * pad_str , size_t pad_str_len ) {
5760
+ char * p = ZSTR_VAL (result ) + ZSTR_LEN (result );
5761
+
5762
+ if (pad_str_len == 1 ) {
5763
+ memset (p , pad_str [0 ], pad_chars );
5764
+ ZSTR_LEN (result ) += pad_chars ;
5765
+ return ;
5766
+ }
5767
+
5768
+ const char * end = p + pad_chars ;
5769
+ while (p + pad_str_len <= end ) {
5770
+ p = zend_mempcpy (p , pad_str , pad_str_len );
5771
+ }
5772
+
5773
+ if (p < end ) {
5774
+ memcpy (p , pad_str , end - p );
5775
+ }
5776
+
5777
+ ZSTR_LEN (result ) += pad_chars ;
5778
+ }
5779
+
5759
5780
/* {{{ Returns input string padded on the left or right to specified length with pad_string */
5760
5781
PHP_FUNCTION (str_pad )
5761
5782
{
@@ -5768,7 +5789,7 @@ PHP_FUNCTION(str_pad)
5768
5789
char * pad_str = " " ; /* Pointer to padding string */
5769
5790
size_t pad_str_len = 1 ;
5770
5791
zend_long pad_type_val = PHP_STR_PAD_RIGHT ; /* The padding type value */
5771
- size_t i , left_pad = 0 , right_pad = 0 ;
5792
+ size_t left_pad = 0 , right_pad = 0 ;
5772
5793
zend_string * result = NULL ; /* Resulting string */
5773
5794
5774
5795
ZEND_PARSE_PARAMETERS_START (2 , 4 )
@@ -5818,16 +5839,18 @@ PHP_FUNCTION(str_pad)
5818
5839
}
5819
5840
5820
5841
/* First we pad on the left. */
5821
- for (i = 0 ; i < left_pad ; i ++ )
5822
- ZSTR_VAL (result )[ZSTR_LEN (result )++ ] = pad_str [i % pad_str_len ];
5842
+ if (left_pad > 0 ) {
5843
+ php_str_pad_fill (result , left_pad , pad_str , pad_str_len );
5844
+ }
5823
5845
5824
5846
/* Then we copy the input string. */
5825
5847
memcpy (ZSTR_VAL (result ) + ZSTR_LEN (result ), ZSTR_VAL (input ), ZSTR_LEN (input ));
5826
5848
ZSTR_LEN (result ) += ZSTR_LEN (input );
5827
5849
5828
5850
/* Finally, we pad on the right. */
5829
- for (i = 0 ; i < right_pad ; i ++ )
5830
- ZSTR_VAL (result )[ZSTR_LEN (result )++ ] = pad_str [i % pad_str_len ];
5851
+ if (right_pad > 0 ) {
5852
+ php_str_pad_fill (result , right_pad , pad_str , pad_str_len );
5853
+ }
5831
5854
5832
5855
ZSTR_VAL (result )[ZSTR_LEN (result )] = '0円' ;
5833
5856
0 commit comments