cedric pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=4d489ee5360b5781a0f572ba0dfb69f7af23e52b
commit 4d489ee5360b5781a0f572ba0dfb69f7af23e52b Author: Shilpa Singh <shilpa.si...@samsung.com> Date: Fri Feb 19 15:56:31 2016 -0800 spinner: add label format validator Summary: Check for all error conditions case in elm_spinner_label_format_set and set label format only if its valid. Signed-off-by: Shilpa Singh <shilpa.si...@samsung.com> @feature Test Plan: 1. Launch elementary test spinner 2. Set invalid formats e.g. formats with out %, formats with more than one format specifier "%d %s" etc:- Reviewers: jpeg, cedric Reviewed By: cedric Subscribers: govi, buds, subodh6129 Differential Revision: https://phab.enlightenment.org/D3720 Signed-off-by: Cedric BAIL <ced...@osg.samsung.com> --- src/lib/elm_spinner.c | 81 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 66 insertions(+), 15 deletions(-) diff --git a/src/lib/elm_spinner.c b/src/lib/elm_spinner.c index 8eb3c03..75deea1 100644 --- a/src/lib/elm_spinner.c +++ b/src/lib/elm_spinner.c @@ -66,22 +66,67 @@ EO_CALLBACKS_ARRAY_DEFINE(_inc_dec_button_cb, static void _access_increment_decrement_info_say(Evas_Object *obj, Eina_Bool is_incremented); +typedef enum _Elm_Spinner_Format_Type +{ + SPINNER_FORMAT_FLOAT, + SPINNER_FORMAT_INT, + SPINNER_FORMAT_INVALID +} Elm_Spinner_Format_Type; + static Eina_Bool +_is_valid_digit(char x) +{ + return ((x >= '0' && x <= '9') || (x == '.')) ? EINA_TRUE : EINA_FALSE; +} + +static Elm_Spinner_Format_Type _is_label_format_integer(const char *fmt) { - const char *start = strchr(fmt, '%'); - const char *itr; + const char *itr = NULL; + const char *start = NULL; + Eina_Bool found = EINA_FALSE; + Elm_Spinner_Format_Type ret_type = SPINNER_FORMAT_INVALID; - for (itr = start + 1; *itr != '\0'; itr++) + start = strchr(fmt, '%'); + if (!start) return SPINNER_FORMAT_INVALID; + + while (start) { - if ((*itr == 'd') || (*itr == 'u') || (*itr == 'i') || - (*itr == 'o') || (*itr == 'x') || (*itr == 'X')) - return EINA_TRUE; - else if ((*itr == 'f') || (*itr == 'F')) - return EINA_FALSE; + if (found && start[1] != '%') + { + return SPINNER_FORMAT_INVALID; + } + + if (start[1] != '%' && !found) + { + found = EINA_TRUE; + for (itr = start + 1; *itr != '\0'; itr++) + { + if ((*itr == 'd') || (*itr == 'u') || (*itr == 'i') || + (*itr == 'o') || (*itr == 'x') || (*itr == 'X')) + { + ret_type = SPINNER_FORMAT_INT; + break; + } + else if ((*itr == 'f') || (*itr == 'F')) + { + ret_type = SPINNER_FORMAT_FLOAT; + break; + } + else if (_is_valid_digit(*itr)) + { + continue; + } + else + { + return SPINNER_FORMAT_INVALID; + } + } + } + start = strchr(start + 2, '%'); } - return EINA_FALSE; + return ret_type; } static void @@ -1382,17 +1427,23 @@ _elm_spinner_eo_base_constructor(Eo *obj, Elm_Spinner_Data *_pd EINA_UNUSED) EOLIAN static void _elm_spinner_label_format_set(Eo *obj, Elm_Spinner_Data *sd, const char *fmt) { - if (fmt && !strchr(fmt, '%')) + Elm_Spinner_Format_Type type; + if (fmt) { - WRN("Warning: %s is an Illegal format, cannot be set", fmt); - return; + type = _is_label_format_integer(fmt); + if (type == SPINNER_FORMAT_INVALID) + { + ERR("format:\"%s\" is Invalid, cannot be set", fmt); + return; + } + else if (type == SPINNER_FORMAT_FLOAT) + { + sd->decimal_points = _decimal_points_get(fmt); + } } eina_stringshare_replace(&sd->label, fmt); - if (fmt && !(_is_label_format_integer(sd->label))) - sd->decimal_points = _decimal_points_get(sd->label); - _label_write(obj); elm_layout_sizing_eval(obj); _entry_accept_filter_add(obj); --