Efl.Ui.Format: do proper checking for string template.

Add support to take action based on string format specifier.

If string template is '%d' and value type is double, do safe
conversion to int from double.
This commit is contained in:
Amitesh Singh 2017-11-28 12:12:08 +09:00
parent 8193864d7d
commit e97d00d598
1 changed files with 43 additions and 10 deletions

View File

@ -8,19 +8,26 @@ typedef struct
const char *template; const char *template;
} Efl_Ui_Format_Data; } Efl_Ui_Format_Data;
typedef enum _Format_Type
{
FORMAT_TYPE_INVALID,
FORMAT_TYPE_DOUBLE,
FORMAT_TYPE_INT
} Format_Type;
static Eina_Bool static Eina_Bool
_is_valid_digit(char x) _is_valid_digit(char x)
{ {
return ((x >= '0' && x <= '9') || (x == '.')) ? EINA_TRUE : EINA_FALSE; return ((x >= '0' && x <= '9') || (x == '.')) ? EINA_TRUE : EINA_FALSE;
} }
static int static Format_Type
_format_string_check(const char *fmt) _format_string_check(const char *fmt)
{ {
const char *itr = NULL; const char *itr = NULL;
const char *start = NULL; const char *start = NULL;
Eina_Bool found = EINA_FALSE; Eina_Bool found = EINA_FALSE;
int ret_type = 0; Format_Type ret_type = FORMAT_TYPE_INVALID;
start = strchr(fmt, '%'); start = strchr(fmt, '%');
if (!start) return 0; if (!start) return 0;
@ -29,7 +36,8 @@ _format_string_check(const char *fmt)
{ {
if (found && start[1] != '%') if (found && start[1] != '%')
{ {
return 0; ret_type = FORMAT_TYPE_INVALID;
break;
} }
if (start[1] != '%' && !found) if (start[1] != '%' && !found)
@ -40,12 +48,12 @@ _format_string_check(const char *fmt)
if ((*itr == 'd') || (*itr == 'u') || (*itr == 'i') || if ((*itr == 'd') || (*itr == 'u') || (*itr == 'i') ||
(*itr == 'o') || (*itr == 'x') || (*itr == 'X')) (*itr == 'o') || (*itr == 'x') || (*itr == 'X'))
{ {
ret_type = 1; //int ret_type = FORMAT_TYPE_INT;
break; break;
} }
else if ((*itr == 'f') || (*itr == 'F')) else if ((*itr == 'f') || (*itr == 'F'))
{ {
ret_type = 2; //double ret_type = FORMAT_TYPE_DOUBLE;
break; break;
} }
else if (_is_valid_digit(*itr)) else if (_is_valid_digit(*itr))
@ -54,7 +62,8 @@ _format_string_check(const char *fmt)
} }
else else
{ {
return 0; ret_type = FORMAT_TYPE_INVALID;
break;
} }
} }
} }
@ -82,24 +91,48 @@ _default_format_cb(void *data, Eina_Strbuf *str, const Eina_Value value)
format_check_result = _format_string_check(sd->template); format_check_result = _format_string_check(sd->template);
if (format_check_result == 0) if (format_check_result == FORMAT_TYPE_INVALID)
{ {
ERR("Wrong String Format: %s\n", sd->template); ERR("Wrong String Format: %s", sd->template);
return; return;
} }
if (type == EINA_VALUE_TYPE_DOUBLE) if ((format_check_result == FORMAT_TYPE_DOUBLE)
&& (type == EINA_VALUE_TYPE_DOUBLE))
{ {
double v; double v;
eina_value_get(&value, &v); eina_value_get(&value, &v);
eina_strbuf_append_printf(str, sd->template, v); eina_strbuf_append_printf(str, sd->template, v);
} }
else if (type == EINA_VALUE_TYPE_INT) else if ((format_check_result == FORMAT_TYPE_INT)
&& (type == EINA_VALUE_TYPE_INT))
{ {
int v; int v;
eina_value_get(&value, &v); eina_value_get(&value, &v);
eina_strbuf_append_printf(str, sd->template, v); eina_strbuf_append_printf(str, sd->template, v);
} }
else if ((format_check_result == FORMAT_TYPE_DOUBLE)
&& (type == EINA_VALUE_TYPE_INT))
{
int v;
double d_v;
eina_value_get(&value, &v);
d_v = v;
eina_strbuf_append_printf(str, sd->template, d_v);
}
else if ((format_check_result == FORMAT_TYPE_INT)
&& (type == EINA_VALUE_TYPE_DOUBLE))
{
double v;
int i_v;
eina_value_get(&value, &v);
i_v = v;
eina_strbuf_append_printf(str, sd->template, i_v);
}
else else
{ {
char *v = eina_value_to_string(&value); char *v = eina_value_to_string(&value);