summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmitesh Singh <amitesh.sh@samsung.com>2017-11-24 14:56:10 +0900
committerAmitesh Singh <amitesh.sh@samsung.com>2017-11-24 14:58:15 +0900
commit475ae7ef1bf6b44a5d4c3abba21a4a2fa2d565f5 (patch)
tree7e529567309524d6ea9288c5f8c0ddbba37db1f0
parente9d7436fd22208d4595f28b9ef2f437f01c02311 (diff)
downloadefl-475ae7ef1bf6b44a5d4c3abba21a4a2fa2d565f5.tar.gz
Efl.Ui.Format: add string format checking for user input
-rw-r--r--src/lib/efl/interfaces/efl_ui_format.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/lib/efl/interfaces/efl_ui_format.c b/src/lib/efl/interfaces/efl_ui_format.c
index b55cda074d..390a45173b 100644
--- a/src/lib/efl/interfaces/efl_ui_format.c
+++ b/src/lib/efl/interfaces/efl_ui_format.c
@@ -1,16 +1,92 @@
#include "config.h"
#include "Efl.h"
+#define ERR(...) EINA_LOG_DOM_ERR(EINA_LOG_DOMAIN_DEFAULT, __VA_ARGS__)
+
typedef struct
{
const char *template;
} Efl_Ui_Format_Data;
+static Eina_Bool
+_is_valid_digit(char x)
+{
+ return ((x >= '0' && x <= '9') || (x == '.')) ? EINA_TRUE : EINA_FALSE;
+}
+
+static int
+_format_string_check(const char *fmt)
+{
+ const char *itr = NULL;
+ const char *start = NULL;
+ Eina_Bool found = EINA_FALSE;
+ int ret_type = 0;
+
+ start = strchr(fmt, '%');
+ if (!start) return 0;
+
+ while (start)
+ {
+ if (found && start[1] != '%')
+ {
+ return 0;
+ }
+
+ 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 = 1; //int
+ break;
+ }
+ else if ((*itr == 'f') || (*itr == 'F'))
+ {
+ ret_type = 2; //double
+ break;
+ }
+ else if (_is_valid_digit(*itr))
+ {
+ continue;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+ start = strchr(start + 2, '%');
+ }
+
+ return ret_type;
+}
+
static void
_default_format_cb(void *data, Eina_Strbuf *str, const Eina_Value value)
{
const Eina_Value_Type *type = eina_value_type_get(&value);
Efl_Ui_Format_Data *sd = data;
+ int format_check_result;
+
+ if (type == EINA_VALUE_TYPE_TM)
+ {
+ struct tm v;
+ eina_value_get(&value, &v);
+ eina_strbuf_append_strftime(str, sd->template, &v);
+
+ return;
+ }
+
+ format_check_result = _format_string_check(sd->template);
+
+ if (format_check_result == 0)
+ {
+ ERR("Wrong String Format: %s\n", sd->template);
+ return;
+ }
if (type == EINA_VALUE_TYPE_DOUBLE)
{