forked from enlightenment/efl
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:
parent
8193864d7d
commit
e97d00d598
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue