rendered paste body/// ....
basic_entities[] = {
{ '"', """, 6, ENT_HTML_QUOTE_DOUBLE },
{ '\'', "'", 6, ENT_HTML_QUOTE_SINGLE },
{ '\'', "'", 5, ENT_HTML_QUOTE_SINGLE },
{ '<', "<", 4, 0 },
{ '>', ">", 4, 0 },
{ 0, NULL, 0, 0 }
};
/// ....
/* {{{ php_escape_html_entities
*/
PHPAPI char *php_escape_html_entities(unsigned char *old, int oldlen, int *newlen, int all, int quote_style, char *hint_charset TSRMLS_DC)
{
int i, j, maxlen, len;
char *replaced;
enum entity_charset charset = determine_charset(hint_charset TSRMLS_CC);
int matches_map;
maxlen = 2 * oldlen;
if (maxlen < 128)
maxlen = 128;
replaced = emalloc (maxlen);
len = 0;
i = 0;
while (i < oldlen) {
unsigned char mbsequence[16]; /* allow up to 15 characters in a multibyte sequence */
int mbseqlen = sizeof(mbsequence);
unsigned short this_char = get_next_char(charset, old, &i, mbsequence, &mbseqlen);
matches_map = 0;
if (len + 9 > maxlen)
replaced = erealloc (replaced, maxlen += 128);
if (all) {
/* look for a match in the maps for this charset */
unsigned char *rep = NULL;
for (j = 0; entity_map[j].charset != cs_terminator; j++) {
if (entity_map[j].charset == charset
&& this_char >= entity_map[j].basechar
&& this_char <= entity_map[j].endchar) {
rep = (unsigned char*)entity_map[j].table[this_char - entity_map[j].basechar];
if (rep == NULL) {
/* there is no entity for this position; fall through and
* just output the character itself */
break;
}
matches_map = 1;
break;
}
}
if (matches_map) {
replaced[len++] = '&';
strcpy(replaced + len, rep);
len += strlen(rep);
replaced[len++] = ';';
}
}
if (!matches_map) {
int is_basic = 0;
if (this_char == '&') {
memcpy(replaced + len, "&", sizeof("&") - 1);
len += sizeof("&") - 1;
is_basic = 1;
} else {
for (j = 0; basic_entities[j].charcode != 0; j++) {
if ((basic_entities[j].charcode != this_char) ||
(basic_entities[j].flags &&
(quote_style & basic_entities[j].flags) == 0)) {
continue;
}
memcpy(replaced + len, basic_entities[j].entity, basic_entities[j].entitylen);
len += basic_entities[j].entitylen;
is_basic = 1;
break;
}
}
if (!is_basic) {
/* a wide char without a named entity; pass through the original sequence */
if (mbseqlen > 1) {
memcpy(replaced + len, mbsequence, mbseqlen);
len += mbseqlen;
} else {
replaced[len++] = (unsigned char)this_char;
}
}
}
}
replaced[len] = '\0';
*newlen = len;
return replaced;
}
/* }}} */
/// ....