summaryrefslogtreecommitdiff
path: root/ext/standard/html.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/html.c')
-rw-r--r--ext/standard/html.c37
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