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; }
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; }
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; }
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; }