Index: string.c =================================================================== RCS file: /repository/php4/ext/standard/string.c,v retrieving revision 1.286 diff -u -3 -p -r1.286 string.c --- string.c 25 Aug 2002 19:08:07 -0000 1.286 +++ string.c 5 Sep 2002 01:47:59 -0000 @@ -595,7 +595,7 @@ PHP_FUNCTION(wordwrap) const char *text, *breakchar = "\n"; char *newtext; int textlen, breakcharlen = 1, newtextlen; - long current = 0, laststart = 0, lastspace = 0; + long current = 0, laststart = 0, lastspace = 0, mem_alloced = 0; long linelength = 75; zend_bool docut = 0; @@ -646,6 +646,7 @@ PHP_FUNCTION(wordwrap) newtextlen = textlen * (breakcharlen + 1) + 1; } newtext = emalloc(newtextlen); + mem_alloced = newtextlen; /* now keep track of the actual new text length */ newtextlen = 0; @@ -657,6 +658,12 @@ PHP_FUNCTION(wordwrap) if (text[current] == breakchar[0] && current + breakcharlen < textlen && !strncmp(text+current, breakchar, breakcharlen)) { + + if ((newtextlen+current-laststart+breakcharlen) >= mem_alloced) { + mem_alloced += textlen-current+((textlen-current)/linelength + 1) * breakcharlen + 1; + newtext = erealloc(newtext, mem_alloced); + } + memcpy(newtext+newtextlen, text+laststart, current-laststart+breakcharlen); newtextlen += current-laststart+breakcharlen; current += breakcharlen - 1; @@ -666,6 +673,11 @@ PHP_FUNCTION(wordwrap) * copy and insert a break, or just keep track of it */ else if (text[current] == ' ') { if (current - laststart >= linelength) { + if ((newtextlen+current-laststart+breakcharlen) >= mem_alloced) { + mem_alloced += textlen-current+((textlen-current)/linelength + 1) * breakcharlen + 1; + newtext = erealloc(newtext, mem_alloced); + } + memcpy(newtext+newtextlen, text+laststart, current-laststart); newtextlen += current - laststart; memcpy(newtext+newtextlen, breakchar, breakcharlen); @@ -679,6 +691,11 @@ PHP_FUNCTION(wordwrap) * copy and insert a break. */ else if (current - laststart >= linelength && docut && laststart >= lastspace) { + if ((newtextlen+current-laststart+breakcharlen) >= mem_alloced) { + mem_alloced += textlen-current+((textlen-current)/linelength + 1) * breakcharlen + 1; + newtext = erealloc(newtext, mem_alloced); + } + memcpy(newtext+newtextlen, text+laststart, current-laststart); newtextlen += current - laststart; memcpy(newtext+newtextlen, breakchar, breakcharlen); @@ -690,6 +707,10 @@ PHP_FUNCTION(wordwrap) * up the laststart */ else if (current - laststart >= linelength && laststart < lastspace) { + if ((newtextlen+lastspace-laststart+breakcharlen) >= mem_alloced) { + mem_alloced += textlen-current+((textlen-current)/linelength + 1) * breakcharlen + 1; + newtext = erealloc(newtext, mem_alloced); + } memcpy(newtext+newtextlen, text+laststart, lastspace-laststart); newtextlen += lastspace - laststart; memcpy(newtext+newtextlen, breakchar, breakcharlen); @@ -700,8 +721,15 @@ PHP_FUNCTION(wordwrap) /* copy over any stragglers */ if (laststart != current) { + if ((newtextlen+current - laststart) >= mem_alloced) { + mem_alloced += current-laststart+1; + newtext = erealloc(newtext, mem_alloced); + } + memcpy(newtext+newtextlen, text+laststart, current-laststart); newtextlen += current - laststart; + } else { + newtext = erealloc(newtext, newtextlen+1); } newtext[newtextlen] = '\0';