cvs: php4 /ext/standard string.c
| From: | Derick Rethans | Date: | Mon, 11 Sep 2000 20:06:24 +0000 |
| Subject: | cvs: php4 /ext/standard string.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-1716@lists.php.net to get a copy of this message | ||
derick Mon Sep 11 13:06:24 2000 EDT
Modified files:
/php4/ext/standard string.c
Log:
- Fix for bug #6673
- Added a "cut" option to wordwrap (as per feature request #6429)
@ Added an optional parameter to wordwrap that cuts a string if the length
of a word is longer than the maximum allowed with (Derick)
Index: php4/ext/standard/string.c
diff -u php4/ext/standard/string.c:1.152 php4/ext/standard/string.c:1.153
--- php4/ext/standard/string.c:1.152 Mon Sep 11 07:54:12 2000
+++ php4/ext/standard/string.c Mon Sep 11 13:06:24 2000
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.152 2000/09/11 14:54:12 andrei Exp $ */
+/* $Id: string.c,v 1.153 2000/09/11 20:06:24 derick Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -233,15 +233,15 @@
/* }}} */
-/* {{{ proto string wordwrap(string str [, int width [, string break]])
+/* {{{ proto string wordwrap(string str [, int width [, string break [, int cut]]])
Wrap buffer to selected number of characters using string break char */
PHP_FUNCTION(wordwrap)
{
- pval **ptext, **plinelength, **pbreakchar;
- long i=0, l=0, pgr=0, linelength=0, last=0, breakcharlen;
+ pval **ptext, **plinelength, **pbreakchar, **cut;
+ long i=0, l=0, pgr=0, linelength=0, last=0, breakcharlen, docut=0;
char *text, *breakchar, *newtext;
- if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 3 || zend_get_parameters_ex(ZEND_NUM_ARGS(),
&ptext, &plinelength, &pbreakchar) == FAILURE) {
+ if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 4 || zend_get_parameters_ex(ZEND_NUM_ARGS(),
&ptext, &plinelength, &pbreakchar, &cut) == FAILURE) {
WRONG_PARAM_COUNT;
}
@@ -266,16 +266,21 @@
breakcharlen = 1;
}
+ if (ZEND_NUM_ARGS() > 3) {
+ convert_to_long_ex(cut);
+ docut = (*cut)->value.lval;
+ }
+
/* Special case for a single-character break as it needs no
additional storage space */
- if (breakcharlen == 1) {
-
- while (text[i] != '\0') {
+ if (breakcharlen == 1 && docut == 0) {
+ newtext = estrdup (text);
+ while (newtext[i] != '\0') {
/* prescan line to see if it is greater than linelength */
l = 0;
- while (text[i+l] != breakchar[0]) {
- if (text[i+l] == '\0') {
+ while (newtext[i+l] != breakchar[0]) {
+ if (newtext[i+l] == '\0') {
l --;
break;
}
@@ -286,8 +291,8 @@
l = linelength;
/* needs breaking; work backwards to find previous word */
while (l >= 0) {
- if (text[i+l] == ' ') {
- text[i+l] = breakchar[0];
+ if (newtext[i+l] == ' ') {
+ newtext[i+l] = breakchar[0];
break;
}
l --;
@@ -296,8 +301,8 @@
/* couldn't break is backwards, try looking forwards */
l = linelength;
while (l <= pgr) {
- if(text[i+l] == ' ') {
- text[i+l] = breakchar[0];
+ if(newtext[i+l] == ' ') {
+ newtext[i+l] = breakchar[0];
break;
}
l ++;
@@ -306,11 +311,11 @@
}
i += l+1;
}
- RETVAL_STRINGL(text, strlen(text), 1);
+ RETVAL_STRINGL(newtext, strlen(newtext), 1);
+ efree(newtext);
}
else {
/* Multiple character line break */
-
newtext = emalloc((*ptext)->value.str.len * (breakcharlen+1));
newtext[0] = '\0';
@@ -343,11 +348,23 @@
/* couldn't break it backwards, try looking forwards */
l = linelength;
while (l <= pgr) {
- if (text[i+l] == ' ') {
- strncat(newtext, text+last, i+l-last);
- strcat(newtext, breakchar);
- last = i + l + 1;
- break;
+ if (docut == 0)
+ {
+ if (text[i+l] == ' ') {
+ strncat(newtext, text+last, i+l-last);
+ strcat(newtext, breakchar);
+ last = i + l + 1;
+ break;
+ }
+ }
+ if (docut == 1)
+ {
+ if (text[i+l] == ' ' || l > i-last) {
+ strncat(newtext, text+last, i+l-last);
+ strcat(newtext, breakchar);
+ last = i + l;
+ break;
+ }
}
l ++;
}