From a474710cf7d472d5fd838c32f74134026684750d Mon Sep 17 00:00:00 2001 From: Hyunjee Kim Date: Wed, 12 Feb 2020 18:58:06 +0900 Subject: [PATCH] Add exceptions for utext, uscript and unormalization. Change-Id: I790b6510089e9358a8b56fd8594a6e3f7d192598 Signed-off-by: Hyunjee Kim --- src/utils_i18n_unormalization.c | 30 ++++--------- src/utils_i18n_uscript.c | 43 +++++++++++++++++++ src/utils_i18n_utext.c | 94 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 21 deletions(-) diff --git a/src/utils_i18n_unormalization.c b/src/utils_i18n_unormalization.c index 16df764..cf73822 100644 --- a/src/utils_i18n_unormalization.c +++ b/src/utils_i18n_unormalization.c @@ -175,15 +175,11 @@ int i18n_unormalization_get_raw_decomposition(i18n_unormalizer_h normalizer, i18 int i18n_unormalization_compose_pair(i18n_unormalizer_h normalizer, i18n_uchar32 a, i18n_uchar32 b, i18n_uchar32 *c) { - i18n_error_code_e i18n_error; - UErrorCode icu_error = U_ZERO_ERROR; + retv_if(normalizer == NULL, I18N_ERROR_INVALID_PARAMETER); *c = unorm2_composePair((UNormalizer2 *) normalizer, a, b); - ERR_MAPPING(icu_error, i18n_error); - I18N_ERR(i18n_error); - - return i18n_error; + return I18N_ERROR_NONE; } uint8_t i18n_unormalization_get_combining_class(i18n_unormalizer_h normalizer, i18n_uchar32 code_point) @@ -229,37 +225,29 @@ int i18n_unormalization_span_quick_check_yes(i18n_unormalizer_h normalizer, cons int i18n_unormalizer_has_boundary_before(i18n_unormalizer_h normalizer, i18n_uchar32 c, i18n_ubool *result) { - i18n_error_code_e i18n_error; - UErrorCode icu_error = U_ZERO_ERROR; + retv_if(normalizer == NULL, I18N_ERROR_INVALID_PARAMETER); *result = unorm2_hasBoundaryBefore((UNormalizer2 *) normalizer, c); - ERR_MAPPING(icu_error, i18n_error); - I18N_ERR(i18n_error); - return i18n_error; + return I18N_ERROR_NONE; } int i18n_unormalizer_has_boundary_after(i18n_unormalizer_h normalizer, i18n_uchar32 c, i18n_ubool *result) { - i18n_error_code_e i18n_error; - UErrorCode icu_error = U_ZERO_ERROR; + retv_if(normalizer == NULL, I18N_ERROR_INVALID_PARAMETER); *result = unorm2_hasBoundaryAfter((UNormalizer2 *) normalizer, c); - ERR_MAPPING(icu_error, i18n_error); - I18N_ERR(i18n_error); - return i18n_error; + return I18N_ERROR_NONE; + } int i18n_unormalization_is_inert(i18n_unormalizer_h normalizer, i18n_uchar32 c, i18n_ubool *result) { - i18n_error_code_e i18n_error; - UErrorCode icu_error = U_ZERO_ERROR; + retv_if(normalizer == NULL, I18N_ERROR_INVALID_PARAMETER); *result = unorm2_isInert((UNormalizer2 *) normalizer, c); - ERR_MAPPING(icu_error, i18n_error); - I18N_ERR(i18n_error); - return i18n_error; + return I18N_ERROR_NONE; } diff --git a/src/utils_i18n_uscript.c b/src/utils_i18n_uscript.c index e89a637..feb3532 100644 --- a/src/utils_i18n_uscript.c +++ b/src/utils_i18n_uscript.c @@ -33,11 +33,23 @@ int i18n_uscript_get_codes(const char* language, i18n_uscript_code_e* codes, int const char *i18n_uscript_get_name(i18n_uscript_code_e script_code) { + if(script_code >= I18N_USCRIPT_CODE_LIMIT || script_code <= I18N_USCRIPT_INVALID_CODE) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return NULL; + } + + set_last_result(I18N_ERROR_NONE); return uscript_getName(script_code); } const char *i18n_uscript_get_short_name(i18n_uscript_code_e script_code) { + if(script_code >= I18N_USCRIPT_CODE_LIMIT || script_code <= I18N_USCRIPT_INVALID_CODE) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return NULL; + } + + set_last_result(I18N_ERROR_NONE); return uscript_getShortName(script_code); } @@ -55,6 +67,13 @@ int i18n_uscript_get_script(i18n_uchar32 codepoint, i18n_uscript_code_e *script_ i18n_ubool i18n_uscript_has_script(i18n_uchar32 codepoint, i18n_uscript_code_e script_code) { + if(script_code >= I18N_USCRIPT_CODE_LIMIT || script_code <= I18N_USCRIPT_INVALID_CODE) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return false; + } + + set_last_result(I18N_ERROR_NONE); + return uscript_hasScript(codepoint, script_code); } @@ -86,21 +105,45 @@ int i18n_uscript_get_sample_string(i18n_uscript_code_e script, i18n_uchar *sampl i18n_uscript_usage_e i18n_uscript_get_usage(i18n_uscript_code_e script) { + if(script >= I18N_USCRIPT_CODE_LIMIT || script <= I18N_USCRIPT_INVALID_CODE) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return I18N_USCRIPT_USAGE_NOT_ENCODED; + } + + set_last_result(I18N_ERROR_NONE); return uscript_getUsage(script); } i18n_ubool i18n_uscript_is_right_to_left(i18n_uscript_code_e script) { + if(script >= I18N_USCRIPT_CODE_LIMIT || script <= I18N_USCRIPT_INVALID_CODE) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return false; + } + + set_last_result(I18N_ERROR_NONE); return uscript_isRightToLeft(script); } i18n_ubool i18n_uscript_breaks_between_letters(i18n_uscript_code_e script) { + if(script >= I18N_USCRIPT_CODE_LIMIT || script <= I18N_USCRIPT_INVALID_CODE) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return false; + } + + set_last_result(I18N_ERROR_NONE); return uscript_breaksBetweenLetters(script); } i18n_ubool i18n_uscript_is_cased(i18n_uscript_code_e script) { + if(script >= I18N_USCRIPT_CODE_LIMIT || script <= I18N_USCRIPT_INVALID_CODE) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return false; + } + + set_last_result(I18N_ERROR_NONE); return uscript_isCased(script); } diff --git a/src/utils_i18n_utext.c b/src/utils_i18n_utext.c index b69f22f..85169da 100644 --- a/src/utils_i18n_utext.c +++ b/src/utils_i18n_utext.c @@ -51,6 +51,7 @@ int i18n_utext_create_for_uchars(i18n_utext_h uta, const i18n_uchar *s, int64_t int i18n_utext_clone(i18n_utext_h dest, const i18n_utext_h src, i18n_ubool deep, i18n_ubool read_only, i18n_utext_h *ut) { + retv_if(src == NULL, I18N_ERROR_INVALID_PARAMETER); i18n_error_code_e i18n_error; UErrorCode icu_error = U_ZERO_ERROR; @@ -69,61 +70,135 @@ i18n_ubool i18n_utext_equals(const i18n_utext_h a, const i18n_utext_h b) int64_t i18n_utext_native_length(i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_nativeLength((UText *)ut); } i18n_ubool i18n_utext_is_length_expensive(const i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_isLengthExpensive((UText *)ut); } i18n_uchar32 i18n_utext_char32_at(i18n_utext_h ut, int64_t native_index) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_char32At((UText *)ut, native_index); } i18n_uchar32 i18n_utext_current32(i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_current32((UText *)ut); } i18n_uchar32 i18n_utext_next32(i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_next32((UText *)ut); } i18n_uchar32 i18n_utext_previous32(i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_previous32((UText *)ut); } i18n_uchar32 i18n_utext_next32_from(i18n_utext_h ut, int64_t native_index) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_next32From((UText *)ut, native_index); } i18n_uchar32 i18n_utext_previous32_from(i18n_utext_h ut, int64_t native_index) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); return utext_previous32From((UText *)ut, native_index); } int64_t i18n_utext_get_native_index(const i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); + return utext_getNativeIndex((UText *)ut); } void i18n_utext_set_native_index(i18n_utext_h ut, int64_t native_index) { + if(ut == NULL || native_index == NULL) + set_last_result(I18N_ERROR_INVALID_PARAMETER); + + set_last_result(I18N_ERROR_NONE); + return utext_setNativeIndex((UText *)ut, native_index); } i18n_ubool i18n_utext_move_index32(i18n_utext_h ut, int32_t delta) { + if(ut == NULL || delta == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); + return utext_moveIndex32((UText *)ut, delta); } int64_t i18n_utext_get_previous_native_index(i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); + return utext_getPreviousNativeIndex((UText *)ut); } @@ -141,11 +216,25 @@ int i18n_utext_extract(i18n_utext_h ut, int64_t native_start, int64_t native_lim i18n_ubool i18n_utext_is_writable(const i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); + return utext_isWritable((UText *)ut); } i18n_ubool i18n_utext_has_meta_data(const i18n_utext_h ut) { + if(ut == NULL) { + set_last_result(I18N_ERROR_INVALID_PARAMETER); + return 0; + } + + set_last_result(I18N_ERROR_NONE); + return utext_hasMetaData((UText *)ut); } @@ -175,5 +264,10 @@ int i18n_utext_copy(i18n_utext_h ut, int64_t native_start, int64_t native_limit, void i18n_utext_freeze(i18n_utext_h ut) { + if(ut == NULL) + set_last_result(I18N_ERROR_INVALID_PARAMETER); + + set_last_result(I18N_ERROR_NONE); + utext_freeze((UText *)ut); } -- 2.7.4