All pastes #88013 Raw Edit

htmlspecialchars

public cpp v1 · immutable
·published 2006-07-14 12:25 UTC
rendered paste body
/// ....basic_entities[] = {	{ '"',	"&quot;",	6,	ENT_HTML_QUOTE_DOUBLE },	{ '\'',	"&#039;",	6,	ENT_HTML_QUOTE_SINGLE },	{ '\'',	"&#39;",	5,	ENT_HTML_QUOTE_SINGLE },	{ '<',	"&lt;",		4,	0 },	{ '>',	"&gt;",		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, "&amp;", sizeof("&amp;") - 1);				len += sizeof("&amp;") - 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;}/* }}} *//// ....