From c234f08e701baeae48808eefc46a685e8945228d Mon Sep 17 00:00:00 2001 From: Hyunjee Kim Date: Fri, 16 Jun 2017 16:24:40 +0900 Subject: [PATCH] [i18ninfo] Add number converting menu Change-Id: I4c9ce2d254bda36881cf203b1eb61f27118602a2 Signed-off-by: Hyunjee Kim --- i18ninfo/i18ninfo.cpp | 139 +++++++++++++++++++++++++++++++++ i18ninfo/i18ninfo_argp.h | 21 ++++- packaging/capi-base-utils.spec | 2 +- 3 files changed, 157 insertions(+), 5 deletions(-) diff --git a/i18ninfo/i18ninfo.cpp b/i18ninfo/i18ninfo.cpp index e07bd23..624f023 100644 --- a/i18ninfo/i18ninfo.cpp +++ b/i18ninfo/i18ninfo.cpp @@ -601,6 +601,119 @@ static int __get_number_format(char *input_number) return 0; } +int32_t _ustring_append_n(i18n_uchar *dest, int32_t dest_length, const i18n_uchar *src, int32_t src_length) +{ + for (int32_t i = 0; i < src_length; ++i) { + dest[dest_length] = src[i]; + ++dest_length; + } + return dest_length; +} + +i18n_uchar *_convert_unicode_numeric_values(const i18n_uchar *input, int32_t length) +{ + if (length <= 0) + return NULL; + int32_t output_length = 0; + + double *values = (double *) malloc(length * sizeof(double)); + int max_value_length = 0; + + /* Count output length */ + for (int32_t i = 0; i < length; ++i) { + double value = 0; + i18n_uchar_get_numeric_value(input[i], &value); + values[i] = value; + if (value != I18N_U_NO_NUMERIC_VALUE) { + int value_length = snprintf(NULL, 0, "%g", value); + if (value_length > max_value_length) + max_value_length = value_length; + output_length += value_length; + } else { + output_length += 1; + } + } + + /* +1 NULL terminator */ + max_value_length += 1; + + i18n_uchar *output = (i18n_uchar *) malloc((output_length + 1) * sizeof(input[0])); + i18n_ustring_mem_set(output, '\0', output_length + 1); + char *tmp = (char *) malloc((max_value_length) * sizeof(input[0])); + i18n_uchar *c = (i18n_uchar *) malloc((max_value_length) * sizeof(input[0])); + + int32_t current_length = 0; + for (int32_t i = 0; i < length; ++i) { + double value = values[i]; + if (value != I18N_U_NO_NUMERIC_VALUE) { + /* Convert double to i18n_uchar */ + if (NULL == tmp) { + free(values); + free(c); + free(tmp); + free(output); + return NULL; + } + snprintf(tmp, max_value_length, "%g", value); + i18n_ustring_copy_ua_n(c, tmp, max_value_length); + /* Append converted number to output string */ + int32_t src_length = i18n_ustring_get_length(c); + current_length = _ustring_append_n(output, current_length, c, src_length); + } else { + current_length = _ustring_append_n(output, current_length, input + i, 1); + } + } + free(values); + free(c); + free(tmp); + + return output; +} + +static int __convert_number(char *custom_number) +{ + printf(" - To convert the number\n"); + printf("****************************************\n"); + + i18n_uchar *number_to_convert; + + if (!custom_number) { + char *input_number = "abc০১২৩def四五六ⅦⅧⅨ"; + printf(" Input number : %s\n", input_number); + number_to_convert = + (i18n_uchar *) malloc(sizeof(i18n_uchar) * (strlen(input_number) + 1)); + if (NULL == number_to_convert) { + free(number_to_convert); + return I18N_ERROR_OUT_OF_MEMORY; + } + i18n_ustring_copy_ua_n(number_to_convert, input_number, BUF_SIZE); + + i18n_uchar *str = _convert_unicode_numeric_values(number_to_convert, i18n_ustring_get_length(number_to_convert)); + char p_string[BUF_SIZE]; + i18n_ustring_copy_au_n(p_string, str, BUF_SIZE); + printf(" Convert number : %s\n", p_string); + free(str); + PRINT_ASCIIDOC_LOG("|===\n"); + + } else { + char *input_number = custom_number; + printf(" Input number : %s\n", input_number); + number_to_convert = + (i18n_uchar *) malloc(sizeof(i18n_uchar) * (strlen(input_number) + 1)); + i18n_ustring_copy_ua(number_to_convert, input_number); + + i18n_uchar *str = _convert_unicode_numeric_values(number_to_convert, i18n_ustring_get_length(number_to_convert)); + char p_string[BUF_SIZE]; + i18n_ustring_copy_au_n(p_string, str, BUF_SIZE); + printf(" Convert number : %s\n", p_string); + free(str); + PRINT_ASCIIDOC_LOG("|===\n"); + + } + free(number_to_convert); + return 0; +} + static int __get_symbol() { printf(" - To get various number symbol\n"); @@ -769,6 +882,11 @@ static int __manage_string_iteration(char *input_string) int32_t start = i18n_ubrk_first(boundary); int32_t end = i18n_ubrk_next(boundary); i18n_uchar *result = (i18n_uchar *) malloc(sizeof(i18n_uchar) * (end - start + 1)); + if (NULL == result) { + free(result); + free(string_to_examine); + return I18N_ERROR_OUT_OF_MEMORY; + } result[end - start] = '\0'; i18n_ustring_copy_n(result, &string_to_examine[start], end-start); char str[BUF_SIZE]; @@ -793,6 +911,11 @@ static int __manage_string_iteration(char *input_string) int32_t end = i18n_ubrk_last(boundary); int32_t start = i18n_ubrk_previous(boundary); i18n_uchar *result = (i18n_uchar *) malloc(sizeof(i18n_uchar) * (end - start + 1)); + if (NULL == result) { + free(result); + free(string_to_examine); + return I18N_ERROR_OUT_OF_MEMORY; + } result[end - start] = '\0'; i18n_ustring_copy_n(result, &string_to_examine[start], end-start); char str[BUF_SIZE]; @@ -1246,6 +1369,18 @@ void testNumberSymbol(char *locale) } } +void testNumberConvert(char *input) +{ + int ret = 0; + + printf("\n== Number Converting Test"); + printf("\n****************************************\n"); + ret = __convert_number(input); + if (ret == -1) { + printf("number converting failed\n"); + } +} + void testString(char *input) { int ret = 0; @@ -1307,6 +1442,10 @@ int main(int argc, char *argv[]) testNumberSymbol(arguments.setLocale); } + if (arguments.testNumberConvert) { + testNumberConvert(arguments.testNumberConvertArg); + } + if (arguments.testString) { testString(arguments.testStringArg); } diff --git a/i18ninfo/i18ninfo_argp.h b/i18ninfo/i18ninfo_argp.h index 6d30d2a..ed0ee0e 100644 --- a/i18ninfo/i18ninfo_argp.h +++ b/i18ninfo/i18ninfo_argp.h @@ -22,6 +22,7 @@ static struct argp_option options[] = { {"test-datentime", 'd', "DateTime", OPTION_ARG_OPTIONAL, "Date and time format test", 0 }, {"test-number-format", 'n', "Number", 0, "Number format test", 0 }, {"test-number-symbol", 'N', 0, 0, "Number symbol test", 0 }, + {"test-number-converting", 'c', "Convert", OPTION_ARG_OPTIONAL, "Number converting test", 0 }, {"test-string", 's', "Word", OPTION_ARG_OPTIONAL, "String test", 0 }, {"test-string-iter", 'S', "Type", OPTION_ARG_OPTIONAL, "String iteration test", 0 }, {"set-locale", 'l', "locale", 0, "Set specific locale", 0 }, @@ -40,6 +41,7 @@ struct arguments { int testDatentime; int testNumberFormat; int testNumberSymbol; + int testNumberConvert; int testString; int testStringIter; int showUbidi; @@ -49,6 +51,7 @@ struct arguments { char *testTimeArg; char *testNumberFormatArg; + char *testNumberConvertArg; char *testStringArg; char *testStringIterArg; char *testTextArg; @@ -111,8 +114,18 @@ parse_opt(int key, char *arg, struct argp_state *state) arguments->arg_flag = 9; arguments->testNumberSymbol = 1; break; - case 's': + case 'c': arguments->arg_flag = 10; + arguments->testNumberConvert = 1; + + nextArg = state->argv[state->next]; + if (nextArg && *nextArg != '-') { + arguments->testNumberConvertArg = nextArg; + state->next++; + } + break; + case 's': + arguments->arg_flag = 11; arguments->testString = 1; nextArg = state->argv[state->next]; @@ -122,7 +135,7 @@ parse_opt(int key, char *arg, struct argp_state *state) } break; case 'S': - arguments->arg_flag = 11; + arguments->arg_flag = 12; arguments->testStringIter = 1; nextArg = state->argv[state->next]; @@ -132,11 +145,11 @@ parse_opt(int key, char *arg, struct argp_state *state) } break; case 'l': - arguments->arg_flag = 12; + arguments->arg_flag = 13; arguments->setLocale = arg; break; case 'b': - arguments->arg_flag = 13; + arguments->arg_flag = 14; arguments->showUbidi = 1; nextArg = state->argv[state->next]; diff --git a/packaging/capi-base-utils.spec b/packaging/capi-base-utils.spec index 8727710..e427e89 100755 --- a/packaging/capi-base-utils.spec +++ b/packaging/capi-base-utils.spec @@ -28,7 +28,7 @@ The base utils library for internationalization and localization (Development) %package -n i18ninfo License: Apache-2.0 Summary: The Base Utils Tool -Version: 1.1.0 +Version: 1.1.1 Group: Base Requires: capi-base-utils -- 2.34.1