Ejemplo n.º 1
0
size_t utf8totitle(const char* input, size_t inputSize, char* target, size_t targetSize, int32_t* errors)
{
	CaseMappingState state;
	size_t bytes_written = 0;

	/* Validate parameters */

	UTF8_VALIDATE_PARAMETERS_CHAR(char, bytes_written);

	/* Initialize case mapping */

	if (!casemapping_initialize(
		&state,
		input, inputSize,
		target, targetSize,
		TitlecaseIndex1Ptr, TitlecaseIndex2Ptr, TitlecaseDataPtr))
	{
		UTF8_SET_ERROR(NONE);

		return bytes_written;
	}

	/* Execute case mapping as long as input remains */

	while (state.src_size > 0)
	{
		size_t result = casemapping_execute(&state);
		if (!result)
		{
			UTF8_SET_ERROR(NOT_ENOUGH_SPACE);

			return bytes_written;
		}

		/* The first letter of every word should be titlecase, the rest lowercase */

		if (state.property_data == TitlecaseDataPtr)
		{
			if ((state.last_general_category & GeneralCategory_Letter) != 0)
			{
				state.property_index1 = LowercaseIndex1Ptr;
				state.property_index2 = LowercaseIndex2Ptr;
				state.property_data = LowercaseDataPtr;
			}
		}
		else if (
			(state.last_general_category & GeneralCategory_Letter) == 0)
		{
			state.property_index1 = TitlecaseIndex1Ptr;
			state.property_index2 = TitlecaseIndex2Ptr;
			state.property_data = TitlecaseDataPtr;
		}

		bytes_written += result;
	}

	UTF8_SET_ERROR(NONE);

	return bytes_written;
}
Ejemplo n.º 2
0
size_t utf8tolower(const char* input, size_t inputSize, char* target, size_t targetSize, int32_t* errors)
{
	CaseMappingState state;
	size_t bytes_written = 0;

	/* Validate parameters */

	UTF8_VALIDATE_PARAMETERS_CHAR(char, bytes_written);

	/* Initialize case mapping */

	if (!casemapping_initialize(
		&state,
		input, inputSize,
		target, targetSize,
		LowercaseIndex1Ptr, LowercaseIndex2Ptr, LowercaseDataPtr))
	{
		UTF8_SET_ERROR(NONE);

		return bytes_written;
	}

	/* Execute case mapping as long as input remains */

	while (state.src_size > 0)
	{
		size_t result = casemapping_execute(&state);
		if (!result)
		{
			UTF8_SET_ERROR(NOT_ENOUGH_SPACE);

			return bytes_written;
		}

		bytes_written += result;
	}

	UTF8_SET_ERROR(NONE);

	return bytes_written;
}
Ejemplo n.º 3
0
size_t utf8tolower(const char* input, size_t inputSize, char* target, size_t targetSize, size_t locale, int32_t* errors)
{
	CaseMappingState state;

	/* Validate parameters */

	UTF8_VALIDATE_PARAMETERS_CHAR(char, 0);

	/* Initialize case mapping */

	if (!casemapping_initialize(
		&state,
		input, inputSize,
		target, targetSize,
		LowercaseIndex1Ptr, LowercaseIndex2Ptr, LowercaseDataPtr,
		QuickCheckCaseMapped_Lowercase, locale,
		errors))
	{
		return state.total_bytes_needed;
	}

	/* Execute case mapping as long as input remains */

	while (state.src_size > 0)
	{
		size_t converted;

		if ((converted = casemapping_execute(&state, errors)) == 0)
		{
			return state.total_bytes_needed;
		}

		state.total_bytes_needed += converted;
	}

	UTF8_SET_ERROR(NONE);

	return state.total_bytes_needed;
}
Ejemplo n.º 4
0
size_t utf8totitle(const char* input, size_t inputSize, char* target, size_t targetSize, size_t locale, int32_t* errors)
{
	CaseMappingState state;

	/* Validate parameters */

	UTF8_VALIDATE_PARAMETERS_CHAR(char, 0);

	/* Initialize case mapping */

	if (!casemapping_initialize(
		&state,
		input, inputSize,
		target, targetSize,
		TitlecaseIndex1Ptr, TitlecaseIndex2Ptr, TitlecaseDataPtr,
		QuickCheckCaseMapped_Titlecase, locale,
		errors))
	{
		return state.total_bytes_needed;
	}

	/* Execute case mapping as long as input remains */

	while (state.src_size > 0)
	{
		size_t converted;
		
		if ((converted = casemapping_execute(&state, errors)) == 0)
		{
			return state.total_bytes_needed;
		}

		/*
			The first letter of every word should be titlecase, the rest should
			be converted to lowercase.
		*/

		if (state.last_canonical_combining_class == CCC_NOT_REORDERED)
		{
			if (state.property_data == TitlecaseDataPtr)
			{
				if ((state.last_general_category & UTF8_CATEGORY_LETTER) != 0)
				{
					state.property_index1 = LowercaseIndex1Ptr;
					state.property_index2 = LowercaseIndex2Ptr;
					state.property_data = LowercaseDataPtr;

					state.quickcheck_flags = QuickCheckCaseMapped_Lowercase;
				}
			}
			else if (
				(state.last_general_category & UTF8_CATEGORY_LETTER) == 0)
			{
				state.property_index1 = TitlecaseIndex1Ptr;
				state.property_index2 = TitlecaseIndex2Ptr;
				state.property_data = TitlecaseDataPtr;

				state.quickcheck_flags = QuickCheckCaseMapped_Titlecase;
			}
		}

		state.total_bytes_needed += converted;
	}

	UTF8_SET_ERROR(NONE);

	return state.total_bytes_needed;
}