Re: Fw: [PHP-CVS] cvs: php4 /ext/standard string.c
| From: | Andi Gutmans | Date: | Thu, 27 Sep 2001 17:48:34 +0000 |
| Subject: | Re: Fw: [PHP-CVS] cvs: php4 /ext/standard string.c | ||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-7599@lists.php.net to get a copy of this message | ||
It makes sense. I wasn't sure people use it for such large pieces of text.
Andi
At 08:39 PM 9/27/2001 +0300, Boian Bonev wrote:
forgot the list... ----- Original Message ----- From: "Boian Bonev" <boian@bonev.com> To: "Andi Gutmans" <andi@zend.com> Sent: Thursday, September 27, 2001 8:35 PM Subject: Re: [PHP-CVS] cvs: php4 /ext/standard string.c i've taken into account that when you allocate memory and then free it, the server process will not return it to the OS... and if you want to process some 50-100kb text the memory requirement will be 350-700kb which is not affordable b. ----- Original Message ----- From: "Andi Gutmans" <andi@zend.com> To: "Derick Rethans" <d.rethans@jdimedia.nl>; <php-cvs@lists.php.net>; <boian@bonev.com> Sent: Wednesday, September 26, 2001 10:28 PM Subject: Re: [PHP-CVS] cvs: php4 /ext/standard string.cAnother possibility would be to emalloc() the maximum size and then erealloc() to a smaller size in the end. It would make the functionnicerIMO or do you feel the short memory burst will be too much? I don'tthinkstrings longer than a couple of K are ever passed to this function so it should be fine. Andi At 07:34 PM 9/26/2001 +0000, Derick Rethans wrote:(Patchderick Wed Sep 26 15:34:47 2001 EDTModified files:/php4/ext/standard string.cLog: - nl2br now handles different styles of line endings in one string.(Boian,by Boian Bonev <boian@bonev.com>)@- nl2br now handles all styles of line-endings in one string.php4/ext/standard/string.c:1.247@ Derick) Index: php4/ext/standard/string.c diff -u php4/ext/standard/string.c:1.246+----------------------------------------------------------------------+--- php4/ext/standard/string.c:1.246 Tue Sep 25 18:48:43 2001+++ php4/ext/standard/string.c Wed Sep 26 15:34:46 2001 @@ -18,7 +18,7 @@&str)==FAILURE) {*/ -/* $Id: string.c,v 1.246 2001/09/25 22:48:43 jeroen Exp $ */ +/* $Id: string.c,v 1.247 2001/09/26 19:34:46 derick Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -2976,38 +2976,110 @@ } /* }}} */ + /* {{{ proto string nl2br(string str)Converts newlines to HTML line breaks */+ +/* maybe const, but will it break some archaic compiler? */ +static int jumps[3][3]={+ {0,2,1,}, + {0,0,1,}, + {0,2,0,},+}; +static int acts[3][3]={+ {0,0,0,}, + {1,3,1,}, + {2,2,4,},+}; +static char *strs[4]={"\n","\r","\n\r","\r\n",}; + PHP_FUNCTION(nl2br) {- zval **str; - char* tmp; - int new_length;-- if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1,\n\r?|\r\n? */+ /* in brief this inserts <br /> before matched regexpinsted+ zval **zstr; + char *tmp, *str; + int new_length, length; + char *p, *end, *target; + int repl_cnt = 0;++ int state = 0; + /* 0 - initial; 1 - \r found; 2 - \n found; */++ int action; + /* actions: + 0 - do nothing; 1 - replace \n; 2 - replace \r + 3 - replace \n\r; 4 - replace \r\n; + */++ int ichar; + /* letters read from input scanner: + 0 - any char different from \n or \r, even end of stream; + 1 - \r; 2 - \n + */++ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &zstr) ==FAILURE) {WRONG_PARAM_COUNT; }- convert_to_string_ex(str); + convert_to_string_ex(zstr);- /* bail out if the string is empty */ - if (Z_STRLEN_PP(str) == 0) { - RETURN_EMPTY_STRING(); + str = Z_STRVAL_PP(zstr); + length = Z_STRLEN_PP(zstr); + end = str + length;++ /* it is really faster to scan twice and allocate mem oncependingscanning once+ and constantly reallocing */ + for (p = str; p <= end; p++) { + /* when p == end assume any char and take the last0);action */+ if (p == end) + ichar = 0; + else + ichar = (*p == '\n') ? 2 : ((*p == '\r') ? 1 :pending++ action = acts[state][ichar]; + state = jumps[state][ichar]; + if (action) + repl_cnt++; + }++ if (repl_cnt == 0) { + RETURN_STRINGL(str, length, 1); + }++ new_length = length + repl_cnt * 6; + tmp = target = emalloc(new_length + 1);++ /* reinit state machine */ + state = 0; + for (p = str; p <= end; p++) { + /* when p == end assume any char and take the last0);action */+ if (p == end) + ichar = 0; + else + ichar = (*p == '\n') ? 2 : ((*p == '\r') ? 1 :"\r\n",+ action = acts[state][ichar]; + state = jumps[state][ichar]; + if (action) { + *target++ = '<'; + *target++ = 'b'; + *target++ = 'r'; + *target++ = ' '; + *target++ = '/'; + *target++ = '>'; + *target++ = strs[action - 1][0]; + if (action > 2) + *target++ = strs[action - 1][1]; + } + if (!ichar && p < end) + *target++ = *p; }-- /* Windows style line-endings */ - tmp = php_str_to_str(Z_STRVAL_PP(str), Z_STRLEN_PP(str),'\n',"<br2, "<br />\r\n", 8, &new_length);- if (new_length != Z_STRLEN_PP(str)) - RETURN_STRINGL (tmp, new_length, 0); - efree (tmp);- /* Mac / Unix style line-endings */ - if (php_char_to_str(Z_STRVAL_PP(str),Z_STRLEN_PP(str),php-list-admin@lists.php.net/>\n", 7, return_value))- return; - efree (Z_STRVAL_P(return_value)); - php_char_to_str(Z_STRVAL_PP(str),Z_STRLEN_PP(str), '\r',"<br/>\r", 7, return_value);+ *target = 0;++ RETURN_STRINGL(tmp, new_length, 0);} /* }}} */ + /* {{{ proto string strip_tags(string str [, string allowable_tags])Strips HTML and PHP tags from a string */-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: php-cvs-unsubscribe@lists.php.net For additional commands, e-mail: php-cvs-help@lists.php.net To contact the list administrators, e-mail:-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: php-cvs-unsubscribe@lists.php.net For additional commands, e-mail: php-cvs-help@lists.php.net To contact the list administrators, e-mail: php-list-admin@lists.php.net-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: php-cvs-unsubscribe@lists.php.net For additional commands, e-mail: php-cvs-help@lists.php.net To contact the list administrators, e-mail: php-list-admin@lists.php.net