PHP_FUNCTION(wordwrap)
{
const char *text, *breakchar = "\n";
- char *newtext;
int textlen, breakcharlen = 1, newtextlen, chk;
size_t alloced;
long current = 0, laststart = 0, lastspace = 0;
long linelength = 75;
zend_bool docut = 0;
+ zend_string *newtext;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lsb", &text, &textlen, &linelength, &breakchar, &breakcharlen, &docut) == FAILURE) {
return;
/* Special case for a single-character break as it needs no
additional storage space */
if (breakcharlen == 1 && !docut) {
- newtext = estrndup(text, textlen);
+ newtext = STR_INIT(text, textlen, 0);
laststart = lastspace = 0;
for (current = 0; current < textlen; current++) {
laststart = lastspace = current + 1;
} else if (text[current] == ' ') {
if (current - laststart >= linelength) {
- newtext[current] = breakchar[0];
+ newtext->val[current] = breakchar[0];
laststart = current + 1;
}
lastspace = current;
} else if (current - laststart >= linelength && laststart != lastspace) {
- newtext[lastspace] = breakchar[0];
+ newtext->val[lastspace] = breakchar[0];
laststart = lastspace + 1;
}
}
-//??? RETURN_STRINGL(newtext, textlen, 0);
- RETURN_STRINGL(newtext, textlen);
+ RETURN_STR(newtext);
} else {
/* Multiple character line break or forced cut */
if (linelength > 0) {
chk = (int)(textlen/linelength + 1);
- newtext = safe_emalloc(chk, breakcharlen, textlen + 1);
+ newtext = STR_ALLOC(chk * breakcharlen + textlen + 1, 0);
alloced = textlen + chk * breakcharlen + 1;
} else {
chk = textlen;
alloced = textlen * (breakcharlen + 1) + 1;
- newtext = safe_emalloc(textlen, (breakcharlen + 1), 1);
+ newtext = STR_ALLOC(textlen * (breakcharlen + 1) + 1, 0);
}
/* now keep track of the actual new text length */
for (current = 0; current < textlen; current++) {
if (chk <= 0) {
alloced += (int) (((textlen - current + 1)/linelength + 1) * breakcharlen) + 1;
- newtext = erealloc(newtext, alloced);
+ newtext = STR_REALLOC(newtext, alloced, 0);
chk = (int) ((textlen - current)/linelength) + 1;
}
/* when we hit an existing break, copy to new buffer, and
if (text[current] == breakchar[0]
&& current + breakcharlen < textlen
&& !strncmp(text+current, breakchar, breakcharlen)) {
- memcpy(newtext+newtextlen, text+laststart, current-laststart+breakcharlen);
- newtextlen += current-laststart+breakcharlen;
+ memcpy(newtext->val + newtextlen, text + laststart, current - laststart + breakcharlen);
+ newtextlen += current - laststart + breakcharlen;
current += breakcharlen - 1;
laststart = lastspace = current + 1;
chk--;
* copy and insert a break, or just keep track of it */
else if (text[current] == ' ') {
if (current - laststart >= linelength) {
- memcpy(newtext+newtextlen, text+laststart, current-laststart);
+ memcpy(newtext->val + newtextlen, text + laststart, current - laststart);
newtextlen += current - laststart;
- memcpy(newtext+newtextlen, breakchar, breakcharlen);
+ memcpy(newtext->val + newtextlen, breakchar, breakcharlen);
newtextlen += breakcharlen;
laststart = current + 1;
chk--;
* copy and insert a break. */
else if (current - laststart >= linelength
&& docut && laststart >= lastspace) {
- memcpy(newtext+newtextlen, text+laststart, current-laststart);
+ memcpy(newtext->val + newtextlen, text + laststart, current - laststart);
newtextlen += current - laststart;
- memcpy(newtext+newtextlen, breakchar, breakcharlen);
+ memcpy(newtext->val + newtextlen, breakchar, breakcharlen);
newtextlen += breakcharlen;
laststart = lastspace = current;
chk--;
* up the laststart */
else if (current - laststart >= linelength
&& laststart < lastspace) {
- memcpy(newtext+newtextlen, text+laststart, lastspace-laststart);
+ memcpy(newtext->val + newtextlen, text + laststart, lastspace - laststart);
newtextlen += lastspace - laststart;
- memcpy(newtext+newtextlen, breakchar, breakcharlen);
+ memcpy(newtext->val + newtextlen, breakchar, breakcharlen);
newtextlen += breakcharlen;
laststart = lastspace = lastspace + 1;
chk--;
/* copy over any stragglers */
if (laststart != current) {
- memcpy(newtext+newtextlen, text+laststart, current-laststart);
+ memcpy(newtext->val + newtextlen, text + laststart, current - laststart);
newtextlen += current - laststart;
}
- newtext[newtextlen] = '\0';
+ newtext->val[newtextlen] = '\0';
/* free unused memory */
- newtext = erealloc(newtext, newtextlen+1);
+ newtext = STR_REALLOC(newtext, newtextlen, 0);
-//??? RETURN_STRINGL(newtext, newtextlen, 0);
- RETURN_STRINGL(newtext, newtextlen);
+ RETURN_STR(newtext);
}
}
/* }}} */