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");
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];
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];
}
}
+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;
testNumberSymbol(arguments.setLocale);
}
+ if (arguments.testNumberConvert) {
+ testNumberConvert(arguments.testNumberConvertArg);
+ }
+
if (arguments.testString) {
testString(arguments.testStringArg);
}
{"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 },
int testDatentime;
int testNumberFormat;
int testNumberSymbol;
+ int testNumberConvert;
int testString;
int testStringIter;
int showUbidi;
char *testTimeArg;
char *testNumberFormatArg;
+ char *testNumberConvertArg;
char *testStringArg;
char *testStringIterArg;
char *testTextArg;
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];
}
break;
case 'S':
- arguments->arg_flag = 11;
+ arguments->arg_flag = 12;
arguments->testStringIter = 1;
nextArg = state->argv[state->next];
}
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];