Skip to content

Commit cf2136c

Browse files
authored
Update string.c
1 parent b06449d commit cf2136c

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

ext/standard/string.c

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)