From 3ee228371d78f31d5d34b37fcb6969724a18f254 Mon Sep 17 00:00:00 2001 From: Sascha Schumann Date: Thu, 12 Oct 2000 01:26:26 +0000 Subject: [PATCH] Let strtr() use smart_str to reduce complexity --- ext/standard/string.c | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 3824ca7e0f..be54fde2de 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -35,6 +35,7 @@ #include "zend_execute.h" #include "php_globals.h" #include "basic_functions.h" +#include "php_smart_str.h" #define STR_PAD_LEFT 0 #define STR_PAD_RIGHT 1 @@ -1462,9 +1463,10 @@ static void php_strtr_array(zval *return_value,char *str,int slen,HashTable *has zval ctmp; ulong num_key; int minlen = 128*1024; - int maxlen = 0, pos, len, newpos, newlen, found; - char *newstr, *key; + int maxlen = 0, pos, len, found; + char *key; HashPosition hpos; + smart_str result = {0}; zend_hash_internal_pointer_reset_ex(hash, &hpos); while (zend_hash_get_current_data_ex(hash, (void **)&entry, &hpos) == SUCCESS) { @@ -1490,11 +1492,9 @@ static void php_strtr_array(zval *return_value,char *str,int slen,HashTable *has } zend_hash_move_forward_ex(hash, &hpos); } - + key = emalloc(maxlen+1); - newstr = emalloc(8192); - newlen = 8192; - newpos = pos = 0; + pos = 0; while (pos < slen) { if ((pos + maxlen) > slen) { @@ -1523,13 +1523,7 @@ static void php_strtr_array(zval *return_value,char *str,int slen,HashTable *has tlen = (*trans)->value.str.len; } - if ((newpos + tlen + 1) > newlen) { - newlen = newpos + tlen + 1 + 8192; - newstr = erealloc(newstr,newlen); - } - - memcpy(newstr+newpos,tval,tlen); - newpos += tlen; + smart_str_appendl(&result, tval, tlen); pos += len; found = 1; @@ -1541,18 +1535,13 @@ static void php_strtr_array(zval *return_value,char *str,int slen,HashTable *has } if (! found) { - if ((newpos + 1) > newlen) { - newlen = newpos + 1 + 8192; - newstr = erealloc(newstr,newlen); - } - - newstr[ newpos++ ] = str[ pos++ ]; + smart_str_appendc(&result, str[pos++]); } } efree(key); - newstr[ newpos ] = 0; - RETURN_STRINGL(newstr,newpos,0); + smart_str_0(&result); + RETVAL_STRINGL(result.c,result.len,0); } /* {{{ proto string strtr(string str, string from, string to) @@ -2048,8 +2037,6 @@ PHPAPI void php_char_to_str(char *str,uint len,char from,char *to,int to_len,zva *target = 0; } -#include "php_smart_str.h" - PHPAPI char *php_str_to_str(char *haystack, int length, char *needle, int needle_len, char *str, int str_len, int *_new_length) { -- 2.50.1