ami pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e97d00d5983bf9514c88097fe85e745f0019fe9b

commit e97d00d5983bf9514c88097fe85e745f0019fe9b
Author: Amitesh Singh <amitesh...@samsung.com>
Date:   Tue Nov 28 12:12:08 2017 +0900

    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.
---
 src/lib/efl/interfaces/efl_ui_format.c | 53 +++++++++++++++++++++++++++-------
 1 file changed, 43 insertions(+), 10 deletions(-)

diff --git a/src/lib/efl/interfaces/efl_ui_format.c 
b/src/lib/efl/interfaces/efl_ui_format.c
index 04bf96425e..7fdbc49249 100644
--- a/src/lib/efl/interfaces/efl_ui_format.c
+++ b/src/lib/efl/interfaces/efl_ui_format.c
@@ -8,19 +8,26 @@ typedef struct
    const char *template;
 } Efl_Ui_Format_Data;
 
+typedef enum _Format_Type
+{
+   FORMAT_TYPE_INVALID,
+   FORMAT_TYPE_DOUBLE,
+   FORMAT_TYPE_INT
+} Format_Type;
+
 static Eina_Bool
 _is_valid_digit(char x)
 {
    return ((x >= '0' && x <= '9') || (x == '.')) ? EINA_TRUE : EINA_FALSE;
 }
 
-static int
+static Format_Type
 _format_string_check(const char *fmt)
 {
    const char *itr = NULL;
    const char *start = NULL;
    Eina_Bool found = EINA_FALSE;
-   int ret_type = 0;
+   Format_Type ret_type = FORMAT_TYPE_INVALID;
 
    start = strchr(fmt, '%');
    if (!start) return 0;
@@ -29,7 +36,8 @@ _format_string_check(const char *fmt)
      {
         if (found && start[1] != '%')
           {
-             return 0;
+             ret_type = FORMAT_TYPE_INVALID;
+             break;
           }
 
         if (start[1] != '%' && !found)
@@ -40,12 +48,12 @@ _format_string_check(const char *fmt)
                   if ((*itr == 'd') || (*itr == 'u') || (*itr == 'i') ||
                       (*itr == 'o') || (*itr == 'x') || (*itr == 'X'))
                     {
-                       ret_type = 1; //int
+                       ret_type = FORMAT_TYPE_INT;
                        break;
                     }
                   else if ((*itr == 'f') || (*itr == 'F'))
                     {
-                       ret_type = 2; //double
+                       ret_type = FORMAT_TYPE_DOUBLE;
                        break;
                     }
                   else if (_is_valid_digit(*itr))
@@ -54,7 +62,8 @@ _format_string_check(const char *fmt)
                     }
                   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);
 
-   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;
      }
 
-   if (type == EINA_VALUE_TYPE_DOUBLE)
+   if ((format_check_result == FORMAT_TYPE_DOUBLE)
+       && (type == EINA_VALUE_TYPE_DOUBLE))
      {
         double v;
         eina_value_get(&value, &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;
         eina_value_get(&value, &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
      {
         char *v = eina_value_to_string(&value);

-- 


Reply via email to