summaryrefslogtreecommitdiff
path: root/ext/standard/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/string.c')
-rw-r--r--ext/standard/string.c111
1 files changed, 47 insertions, 64 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 0628a4664c..d7c5490b71 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -872,33 +872,24 @@ PHP_FUNCTION(ltrim)
Wraps buffer to selected number of characters using string break char */
PHP_FUNCTION(wordwrap)
{
- zend_string *text, *breakchar = NULL, *breakchar_save = NULL;
- size_t newtextlen, chk;
+ zend_string *text;
+ char *breakchar = "\n";
+ size_t newtextlen, chk, breakchar_len = 1;
size_t alloced;
zend_long current = 0, laststart = 0, lastspace = 0;
zend_long linelength = 75;
zend_bool docut = 0;
zend_string *newtext;
- breakchar = breakchar_save = zend_string_init("\n", 1, 1);
- if (!breakchar) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S|lsb", &text, &linelength, &breakchar, &breakchar_len, &docut) == FAILURE) {
return;
}
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S|lSb", &text, &linelength, &breakchar, &docut) == FAILURE) {
- zend_string_free(breakchar);
- return;
- }
-
- if (breakchar != breakchar_save) {
- zend_string_free(breakchar_save);
- }
-
if (text->len == 0) {
RETURN_EMPTY_STRING();
}
- if (breakchar->len == 0) {
+ if (breakchar_len == 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Break string cannot be empty");
RETURN_FALSE;
}
@@ -910,21 +901,21 @@ PHP_FUNCTION(wordwrap)
/* Special case for a single-character break as it needs no
additional storage space */
- if (breakchar->len == 1 && !docut) {
+ if (breakchar_len == 1 && !docut) {
newtext = zend_string_init(text->val, text->len, 0);
laststart = lastspace = 0;
for (current = 0; current < text->len; current++) {
- if (text->val[current] == breakchar->val[0]) {
+ if (text->val[current] == breakchar[0]) {
laststart = lastspace = current + 1;
} else if (text->val[current] == ' ') {
if (current - laststart >= linelength) {
- newtext->val[current] = breakchar->val[0];
+ newtext->val[current] = breakchar[0];
laststart = current + 1;
}
lastspace = current;
} else if (current - laststart >= linelength && laststart != lastspace) {
- newtext->val[lastspace] = breakchar->val[0];
+ newtext->val[lastspace] = breakchar[0];
laststart = lastspace + 1;
}
}
@@ -934,12 +925,12 @@ PHP_FUNCTION(wordwrap)
/* Multiple character line break or forced cut */
if (linelength > 0) {
chk = (size_t)(text->len/linelength + 1);
- newtext = zend_string_alloc(chk * breakchar->len + text->len, 0);
- alloced = text->len + chk * breakchar->len + 1;
+ newtext = zend_string_alloc(chk * breakchar_len + text->len, 0);
+ alloced = text->len + chk * breakchar_len + 1;
} else {
chk = text->len;
- alloced = text->len * (breakchar->len + 1) + 1;
- newtext = zend_string_alloc(text->len * (breakchar->len + 1), 0);
+ alloced = text->len * (breakchar_len + 1) + 1;
+ newtext = zend_string_alloc(text->len * (breakchar_len + 1), 0);
}
/* now keep track of the actual new text length */
@@ -948,18 +939,18 @@ PHP_FUNCTION(wordwrap)
laststart = lastspace = 0;
for (current = 0; current < text->len; current++) {
if (chk <= 0) {
- alloced += (size_t) (((text->len - current + 1)/linelength + 1) * breakchar->len) + 1;
+ alloced += (size_t) (((text->len - current + 1)/linelength + 1) * breakchar_len) + 1;
newtext = zend_string_realloc(newtext, alloced, 0);
chk = (size_t) ((text->len - current)/linelength) + 1;
}
/* when we hit an existing break, copy to new buffer, and
* fix up laststart and lastspace */
- if (text->val[current] == breakchar->val[0]
- && current + breakchar->len < text->len
- && !strncmp(text->val+current, breakchar->val, breakchar->len)) {
- memcpy(newtext->val + newtextlen, text->val + laststart, current - laststart + breakchar->len);
- newtextlen += current - laststart + breakchar->len;
- current += breakchar->len - 1;
+ if (text->val[current] == breakchar[0]
+ && current + breakchar_len < text->len
+ && !strncmp(text->val+current, breakchar, breakchar_len)) {
+ memcpy(newtext->val + newtextlen, text->val + laststart, current - laststart + breakchar_len);
+ newtextlen += current - laststart + breakchar_len;
+ current += breakchar_len - 1;
laststart = lastspace = current + 1;
chk--;
}
@@ -969,8 +960,8 @@ PHP_FUNCTION(wordwrap)
if (current - laststart >= linelength) {
memcpy(newtext->val + newtextlen, text->val + laststart, current - laststart);
newtextlen += current - laststart;
- memcpy(newtext->val + newtextlen, breakchar->val, breakchar->len);
- newtextlen += breakchar->len;
+ memcpy(newtext->val + newtextlen, breakchar, breakchar_len);
+ newtextlen += breakchar_len;
laststart = current + 1;
chk--;
}
@@ -983,8 +974,8 @@ PHP_FUNCTION(wordwrap)
&& docut && laststart >= lastspace) {
memcpy(newtext->val + newtextlen, text->val + laststart, current - laststart);
newtextlen += current - laststart;
- memcpy(newtext->val + newtextlen, breakchar->val, breakchar->len);
- newtextlen += breakchar->len;
+ memcpy(newtext->val + newtextlen, breakchar, breakchar_len);
+ newtextlen += breakchar_len;
laststart = lastspace = current;
chk--;
}
@@ -995,8 +986,8 @@ PHP_FUNCTION(wordwrap)
&& laststart < lastspace) {
memcpy(newtext->val + newtextlen, text->val + laststart, lastspace - laststart);
newtextlen += lastspace - laststart;
- memcpy(newtext->val + newtextlen, breakchar->val, breakchar->len);
- newtextlen += breakchar->len;
+ memcpy(newtext->val + newtextlen, breakchar, breakchar_len);
+ newtextlen += breakchar_len;
laststart = lastspace = lastspace + 1;
chk--;
}
@@ -1491,7 +1482,7 @@ quit_loop:
PHP_FUNCTION(basename)
{
char *string, *suffix = NULL;
- int string_len, suffix_len = 0;
+ size_t string_len, suffix_len = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &string, &string_len, &suffix, &suffix_len) == FAILURE) {
return;
@@ -1515,7 +1506,7 @@ PHP_FUNCTION(dirname)
{
char *str;
zend_string *ret;
- int str_len;
+ size_t str_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
return;
@@ -2633,8 +2624,8 @@ PHP_FUNCTION(quotemeta)
Returns ASCII value of character */
PHP_FUNCTION(ord)
{
- char *str;
- int str_len;
+ char *str;
+ size_t str_len;
#ifndef FAST_ZPP
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
@@ -2743,7 +2734,7 @@ PHP_FUNCTION(ucwords)
zend_string *str;
char *delims = " \t\r\n\f\v";
register char *r, *r_end;
- int delims_len = 6;
+ size_t delims_len = 6;
char mask[256];
#ifndef FAST_ZPP
@@ -2966,7 +2957,7 @@ PHP_FUNCTION(strtr)
{
zval *from;
char *str, *to = NULL;
- int str_len, to_len = 0;
+ size_t str_len, to_len = 0;
int ac = ZEND_NUM_ARGS();
#ifndef FAST_ZPP
@@ -3889,7 +3880,7 @@ static void php_hebrev(INTERNAL_FUNCTION_PARAMETERS, int convert_newlines)
int block_start, block_end, block_type, block_length, i;
zend_long max_chars=0;
int begin, end, char_count, orig_begin;
- int str_len;
+ size_t str_len;
zend_string *broken_str;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &str, &str_len, &max_chars) == FAILURE) {
@@ -4304,7 +4295,7 @@ PHP_FUNCTION(parse_str)
char *arg;
zval *arrayArg = NULL;
char *res = NULL;
- int arglen;
+ size_t arglen;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z/", &arg, &arglen, &arrayArg) == FAILURE) {
return;
@@ -4703,7 +4694,7 @@ PHP_FUNCTION(str_getcsv)
zend_string *str;
char delim = ',', enc = '"', esc = '\\';
char *delim_str = NULL, *enc_str = NULL, *esc_str = NULL;
- int delim_len = 0, enc_len = 0, esc_len = 0;
+ size_t delim_len = 0, enc_len = 0, esc_len = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S|sss", &str, &delim_str, &delim_len,
&enc_str, &enc_len, &esc_str, &esc_len) == FAILURE) {
@@ -4986,7 +4977,7 @@ PHP_FUNCTION(substr_count)
zend_long offset = 0, length = 0;
int ac = ZEND_NUM_ARGS();
int count = 0;
- int haystack_len, needle_len;
+ size_t haystack_len, needle_len;
char *p, *endp, cmp;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|ll", &haystack, &haystack_len, &needle, &needle_len, &offset, &length) == FAILURE) {
@@ -5053,32 +5044,24 @@ PHP_FUNCTION(str_pad)
/* Helper variables */
size_t num_pad_chars; /* Number of padding characters (total - input size) */
- zend_string *pad_str, *pad_str_save; /* Pointer to padding string */
+ zend_string *pad_str_save; /* Pointer to padding string */
+ char *pad_str = " ";
+ size_t pad_str_len = 1;
zend_long pad_type_val = STR_PAD_RIGHT; /* The padding type value */
- int i, left_pad=0, right_pad=0;
+ size_t i, left_pad=0, right_pad=0;
zend_string *result = NULL; /* Resulting string */
- pad_str = pad_str_save = zend_string_init(" ", 1, 1);
- if (!pad_str) {
- return;
- }
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Sl|Sl", &input, &pad_length, &pad_str, &pad_type_val) == FAILURE) {
- zend_string_free(pad_str);
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Sl|sl", &input, &pad_length, &pad_str, &pad_str_len, &pad_type_val) == FAILURE) {
return;
}
- if (pad_str != pad_str_save) {
- zend_string_free(pad_str_save);
- }
-
/* If resulting string turns out to be shorter than input string,
we simply copy the input and return. */
- if (pad_length < 0 || pad_length <= input->len) {
+ if (pad_length <= input->len) {
RETURN_STRINGL(input->val, input->len);
}
- if (pad_str->len == 0) {
+ if (pad_str_len == 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Padding string cannot be empty");
return;
}
@@ -5117,7 +5100,7 @@ PHP_FUNCTION(str_pad)
/* First we pad on the left. */
for (i = 0; i < left_pad; i++)
- result->val[result->len++] = pad_str->val[i % pad_str->len];
+ result->val[result->len++] = pad_str[i % pad_str_len];
/* Then we copy the input string. */
memcpy(result->val + result->len, input->val, input->len);
@@ -5125,7 +5108,7 @@ PHP_FUNCTION(str_pad)
/* Finally, we pad on the right. */
for (i = 0; i < right_pad; i++)
- result->val[result->len++] = pad_str->val[i % pad_str->len];
+ result->val[result->len++] = pad_str[i % pad_str_len];
result->val[result->len] = '\0';
@@ -5231,7 +5214,7 @@ PHP_FUNCTION(str_word_count)
{
zend_string *str;
char *char_list = NULL, *p, *e, *s, ch[256];
- int char_list_len = 0, word_count = 0;
+ size_t char_list_len = 0, word_count = 0;
zend_long type = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S|ls", &str, &type, &char_list, &char_list_len) == FAILURE) {
@@ -5307,7 +5290,7 @@ PHP_FUNCTION(str_word_count)
Convert monetary value(s) to string */
PHP_FUNCTION(money_format)
{
- int format_len = 0;
+ size_t format_len = 0;
char *format, *p, *e;
double value;
zend_bool check = 0;