#include <string>
#include <cstring>
#include <iostream>

bool validateUTF8(std::string const& _input, size_t& _invalidPosition)
{
	const size_t length = _input.length();
	bool valid = true;
	size_t i = 0;

	for (; i < length; i++)
	{
		if ((unsigned char)_input[i] < 0x80)
			continue;

		size_t count = 0;
		switch(_input[i] & 0xe0) {
			case 0xc0: count = 1; break;
			case 0xe0: count = 2; break;
			case 0xf0: count = 3; break;
			default: break;
		}

		if (count == 0)
		{
			valid = false;
			break;
		}

		if ((i + count) >= length)
		{
			valid = false;
			break;
		}

		for (size_t j = 0; j < count; j++)
		{
			i++;
			if ((_input[i] & 0xc0) != 0x80)
			{
				valid = false;
				break;
			}
		}
	}

	if (valid)
		return true;

	_invalidPosition = i;
	return false;
}

int main() {
	const std::string input = "\xF0\x9F\xA6\x84";
	size_t position = 0;
	
	bool ret = validateUTF8(input, position);
	std::cout << "Final Position:" << position << std::endl;
	std::cout << "OK:" << ret << std::endl;
	
	return 0;
}