[i18ninfo] Add number converting menu 90/134390/7 submit/tizen/20170721.011718
authorHyunjee Kim <hj0426.kim@samsung.com>
Fri, 16 Jun 2017 07:24:40 +0000 (16:24 +0900)
committerHyunjee Kim <hj0426.kim@samsung.com>
Wed, 19 Jul 2017 07:21:51 +0000 (16:21 +0900)
Change-Id: I4c9ce2d254bda36881cf203b1eb61f27118602a2
Signed-off-by: Hyunjee Kim <hj0426.kim@samsung.com>
i18ninfo/i18ninfo.cpp
i18ninfo/i18ninfo_argp.h
packaging/capi-base-utils.spec

index e07bd23..624f023 100644 (file)
@@ -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);
        }
index 6d30d2a..ed0ee0e 100644 (file)
@@ -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];
index 8727710..e427e89 100755 (executable)
@@ -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