예제 #1
0
int html_encoder::encode(const char* string, size_t len, buffer& buf)
{
	const char* src = string;
	const char* end = string + len;

	// Compute bytes needed.
	size_t needed = 0;
	while (src < end) {
		unsigned char c = (unsigned char) *src++;
		if ((c == '<') || (c == '>')) {
			needed += 4;
		} else if ((c == '&') || (c == '\'')) {
			needed += 5;
		} else if (c == '"') {
			needed += 6;
		} else {
			needed++;
		}
	}

	if (!buf.allocate(needed)) {
		return -1;
	}

	char* dst = buf.data() + buf.count();

	// Encode.
	while (string < end) {
		unsigned char c = (unsigned char) *string++;
		if (c == '<') {
			*dst++ = '&';
			*dst++ = 'l';
			*dst++ = 't';
			*dst++ = ';';
		} else if (c == '>') {
			*dst++ = '&';
			*dst++ = 'g';
			*dst++ = 't';
			*dst++ = ';';
		} else if (c == '&') {
			*dst++ = '&';
			*dst++ = 'a';
			*dst++ = 'm';
			*dst++ = 'p';
			*dst++ = ';';
		} else if (c == '"') {
			*dst++ = '&';
			*dst++ = 'q';
			*dst++ = 'u';
			*dst++ = 'o';
			*dst++ = 't';
			*dst++ = ';';
		} else if (c == '\'') {
			*dst++ = '&';
			*dst++ = '#';
			*dst++ = '3';
			*dst++ = '9';
			*dst++ = ';';
		} else {
			*dst++ = c;
		}
	}

	buf.increment_count(needed);

	return needed;
}