diff options
Diffstat (limited to 'ext/standard/html.c')
-rw-r--r-- | ext/standard/html.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/ext/standard/html.c b/ext/standard/html.c index 83a0690432..41fef9c364 100644 --- a/ext/standard/html.c +++ b/ext/standard/html.c @@ -43,27 +43,18 @@ static char EntTable[][7] = "uuml","yacute","thorn","yuml" }; -static void php_html_entities(INTERNAL_FUNCTION_PARAMETERS, int all) +PHPAPI char *php_escape_html_entities(unsigned char *old, int oldlen, int *newlen, int all) { - pval **arg; - int i, len, maxlen; - unsigned char *old; + int i, maxlen, len; char *new; - if (ARG_COUNT(ht) != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_string_ex(arg); - - maxlen = 2 * (*arg)->value.str.len; + maxlen = 2 * oldlen; if (maxlen < 128) maxlen = 128; new = emalloc (maxlen); len = 0; - old = (unsigned char *)(*arg)->value.str.val; - i = (*arg)->value.str.len; + i = oldlen; while (i--) { if (len + 9 > maxlen) new = erealloc (new, maxlen += 128); @@ -90,9 +81,25 @@ static void php_html_entities(INTERNAL_FUNCTION_PARAMETERS, int all) old++; } new [len] = '\0'; + *newlen = len; + + return new; +} + +static void php_html_entities(INTERNAL_FUNCTION_PARAMETERS, int all) +{ + zval **arg; + int len; + char *new; + + if (ARG_COUNT(ht) != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(arg); - RETVAL_STRINGL(new,len,1); - efree(new); + new = php_escape_html_entities((*arg)->value.str.val, (*arg)->value.str.len, &len, all); + RETVAL_STRINGL(new,len,0); } #define HTML_SPECIALCHARS 0 |